[Gvsig_desarrolladores] Flujo interno gvgis

Francisco José fpenarru en iver.es
Jue Abr 27 11:54:54 CEST 2006


Hola Daniel.

La mala noticia es que por ahora no hay ningún curso para desarrollador. 
Sí hay para usuario.

La buena, es que tenemos a una persona a tiempo completo haciendo 
documentación para desarrolladores. Esperamos que pronto tengamos algo 
mucho más elaborado que lo que existe actualmente.

Por otro lado, es cierto que al principio cuesta un poco entrar a 
desarrollar sobre gvSIG. Lo lógico es empezar con la extensión de 
ejemplo que acompaña a las fuentes.

Y una vez que entiendas esa extensión, el resto es más sencillo. Solo 
tienes que mirar el fichero config.xml de cada uno de los plugins 
(incluso de la aplicación principal) y ver cómo está hecho cada uno de 
los menús, botones y herramientas. No hay que olvidar que gvSIG mismo es 
una extensión sobre Andami, así que pasa un poco como con ArcView, que 
se puede ver el código de cada botón o herramienta.

Hasta otra. :-)

PS: Por cierto, por si te sirve de algo:

Esto es un ejemplo de una clase que carga una capa de PostGIS al 
ejecutar el menu (o botón) desde una vista

package org.gvsig.example.postgis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JOptionPane;

import org.cresques.cts.ICoordTrans;
import org.cresques.cts.IProjection;
import org.cresques.cts.ProjectionPool;
import org.cresques.cts.gt2.CoordSys;
import org.cresques.cts.gt2.CoordTrans;

import com.iver.andami.PluginServices;
import com.iver.andami.plugins.Extension;
import com.iver.andami.ui.mdiManager.View;
import com.iver.cit.gvsig.fmap.MapControl;
import com.iver.cit.gvsig.fmap.ViewPort;
import com.iver.cit.gvsig.fmap.core.ICanReproject;
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
import com.iver.cit.gvsig.fmap.drivers.VectorialJDBCDriver;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
import com.iver.cit.gvsig.fmap.layers.LayerFactory;

public class LoadLayer implements Extension {

    public void inicializar() {
       
    }

    public void execute(String actionCommand) {
        // IN CONFIG.XML, the actionCommand should be the layer name. 
(table name)
        com.iver.cit.gvsig.gui.View v = (com.iver.cit.gvsig.gui.View) 
PluginServices.getMDIManager().getActiveView();
        MapControl mapCtrl = v.getMapControl();
       
        String dbURL = "jdbc:postgresql://localhost:5432/latin1"; // 
latin1 is the catalog name
        String user = "postgres";
        String pwd = "XXXXXX";
        String layerName = actionCommand;
        String tableName = actionCommand;
        Connection conn;
        try {
            conn = DriverManager.getConnection(dbURL, user, pwd);
            conn.setAutoCommit(false);
           
            String fidField = "gid"; // BE CAREFUL => MAY BE NOT!!!
            String geomField = "the_geom"; // BE CAREFUL => MAY BE 
NOT!!! => You should read table GEOMETRY_COLUMNS.
                                            // See PostGIS help.

            // To obtain the fields, make a connection and get them.
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select * from " + tableName 
+ " LIMIT 1");
            ResultSetMetaData rsmd = rs.getMetaData();
            String[] fields = new String[rsmd.getColumnCount()-1]; // We 
don't want to include the_geom field
            int j = 0;
            for (int i = 0; i < fields.length; i++) {
                if (!rsmd.getColumnName(i+1).equalsIgnoreCase(geomField))
                {
                    fields[j++] = rsmd.getColumnName(i+1);            
       
                }
            }
            rs.close();       
           
            /* String[] fields = new String[1];           
            fields[0] = "gid"; */
           
            String whereClause = "";
   
            VectorialJDBCDriver driver = (VectorialJDBCDriver) 
LayerFactory.getDM()
                        .getDriver("PostGIS JDBC Driver");
           
            // Here you can set the workingArea
            // driver.setWorkingArea(dbLayerDefinition.getWorkingArea());
           
           
            String strEPSG = mapCtrl.getViewPort()
                        .getProjection().getAbrev()
                        .substring(5);
            DBLayerDefinition lyrDef = new 
DBLayerDefinition();               
            lyrDef.setName(layerName);
            lyrDef.setTableName(tableName);
            lyrDef.setWhereClause(whereClause);
            lyrDef.setFieldNames(fields);
            lyrDef.setFieldGeometry(geomField);
            lyrDef.setFieldID(fidField);
            // if (dbLayerDefinition.getWorkingArea() != null)
            //     
lyrDef.setWorkingArea(dbLayerDefinition.getWorkingArea());
           
            lyrDef.setSRID_EPSG(strEPSG);
            if (driver instanceof ICanReproject)
            {                   
                ((ICanReproject)driver).setDestProjection(strEPSG);
            }
            driver.setData(conn, lyrDef);
            IProjection proj = null;
            if (driver instanceof ICanReproject)
            {                                       
                proj = ProjectionPool.get("EPSG:" + 
((ICanReproject)driver).getSourceProjection());
            }
           
            FLayer lyr = LayerFactory.createDBLayer(driver, layerName, 
proj);
   
            if (lyr != null) {
                lyr.setVisible(true);
                v.getMapControl().getMapContext().beginAtomicEvent();
                // You shoud checkProjection to see if it is necesary to 
reproject
                checkProjection(lyr, v.getMapControl().getViewPort());
                v.getMapControl().getMapContext().getLayers()
                       .addLayer(lyr);
                v.getMapControl().getMapContext().endAtomicEvent();
               
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
       
    }

    public boolean isEnabled() {
        return true;
    }

    public boolean isVisible() {
        View v = PluginServices.getMDIManager().getActiveView();

        if  (v instanceof com.iver.cit.gvsig.gui.View)
            return true;
        else
            return false;
    }
   
    private void checkProjection(FLayer lyr, ViewPort viewPort)
    {
        if (lyr instanceof FLyrVect)
        {
            FLyrVect lyrVect = (FLyrVect) lyr;
            IProjection proj = lyr.getProjection();
            // Comprobar que la projección es la misma que la vista
            if (proj == null)
            {
                // SUPONEMOS que la capa está en la proyección que
                // estamos pidiendo (que ya es mucho suponer, ya).
                lyrVect.setProjection(viewPort.getProjection());
                return;
            }
            if (proj != viewPort.getProjection()) {
                int option = JOptionPane.showConfirmDialog(null,
                        PluginServices.getText(this, "reproyectar_aviso"),
                        PluginServices.getText(this, 
"reproyectar_pregunta"),
                        JOptionPane.YES_NO_OPTION);

                if (option == JOptionPane.NO_OPTION) {
                    return;
                } else {
                    ICoordTrans ct = new CoordTrans((CoordSys) proj,
                            (CoordSys) viewPort.getProjection());
                    lyrVect.setCoordTrans(ct);
                    System.err.println("coordTrans = " +
                        proj.getAbrev() + " " +
                        viewPort.getProjection().getAbrev());
                }
            }
        }                   

    }


}

Como puedes ver, lo de cargar una capa se basa en construir un 
VecotorialDriver y luego construir la capa con LayerFactory.

Suerte!!.

> Buenos días,
>
> La verdad es que me has dado una pista muy buena :D. Voy a tirar por ahí,
> creo que es lo que andaba buscando. De todas formas, no habéis pensado en
> hacer un curso o un manual explicando todas estas triquiñuelas? pff o he
> estado mirando los manuales equivocados, o donde explicáis como funciona
> cada módulo, no queda, al menos a mí, claro, cómo es el funcionamiento
> interno si alguien quiere desarrollar algo más.
>
> La idea de gvsig, es que si alguien quiere añadir un nuevo módulo, basta
> con añadir los plugins y extensiones determinadas (la teoría muy bien :)
> jeje), pero no termino de comprender cómo se llama a esos plugins, es
> decir, en el código, deberá aparecer en algún momento algo como: "me piden
> un fichero de tipo .dgn, tengo que llamar a este driver que luego me va a
> devolver esta otra información asociada", a eso me refiero concretamente
> :).
>
> Saludos! y gracias :).
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>   


-- 
Francisco José Peñarrubia
Equipo gvSIG

IVER T.I. S.A.
c/Salamanca 50
46005 Valencia
Spain




Más información sobre la lista de distribución gvSIG_desarrolladores