[Gvsig_desarrolladores] adicionar una capa postgis por codigo

fsalas fsalas en geocuba.cu
Vie Ene 9 14:58:48 CET 2009


Sergio , estoy tratando de implementar el codigo que me envio para cargar una capa de postgis.

para esto utilice el proyecto extWorkshop en la clase HelloWorldExtension, lo que estoy probando es que cuando seleccione la opcion o el boton new en vez de salir el dialogo Hello Word , se adicione la capa a la vista, pero esto no ocurre y adem'as no da error de ejecucion :

 Este es el fragmento de codigo, pudieras orientarme  como solucionar esto.

public void execute(String actionCommand) {

com.iver.andami.ui.mdiManager.IWindow view = PluginServices.getMDIManager().getActiveWindow();


View vista=(View)view;


IProjectView model = vista.getModel();

MapContext mapa = model.getMapContext();

MapControl mapCtrl = vista.getMapControl();


CargadorCapas cargador = new CargadorCapas();


cargador.cargarTabla("provin", mapCtrl,vista);

}

saludos salas























----- Original Message ----- 
From: "Sergio Piñón" <sergiopinhon en gmail.com>
To: "fsalas" <fsalas en geocuba.cu>; "Lista de Desarrolladores de gvSIG" <gvsig_desarrolladores en runas.cap.gva.es>
Sent: Friday, January 09, 2009 3:23 PM
Subject: Re: [Gvsig_desarrolladores] adicinar una capa postgis por codigo


Hola, aquí te va una muestra de como cargar una tabla de la BD al método 
cargarTabla le tienes que pasar el MapControl y la Vista donde quieres que se 
visualice la capa, además del nombre de la tabla.
Espero que te sirva de ayuda. 


import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import org.apache.log4j.Logger;
import org.cresques.cts.IProjection;

import com.hardcode.driverManager.Driver;
import com.iver.andami.PluginServices;
import com.iver.cit.gvsig.fmap.MapControl;
import com.iver.cit.gvsig.fmap.core.ICanReproject;
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
import com.iver.cit.gvsig.fmap.drivers.ConnectionJDBC;
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
import com.iver.cit.gvsig.fmap.drivers.IConnection;
import com.iver.cit.gvsig.fmap.drivers.IVectorialJDBCDriver;
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
import com.iver.cit.gvsig.project.documents.view.gui.View;

import controlador.Controlador;

/**
 * @author Sergio Piñón Campañó
 *
 */
public class CargadorCapas {
    private static final String selectedDriver = "PostGIS JDBC Driver";

private static Logger log = Logger.getLogger(CargadorCapas.class);



public CargadorCapas() {

}
/**
* Crea una capa a partir de una tabla de la BD y la añade al 
<code>mapControl y a la Vista <code>v
* @param mapControl
* @param v
*/
public FLyrVect cargarTabla(String nombreTabla, int posicion, MapControl 
mapControl, View v) {
String dbURL = jdbc:postgresql://localhost/bdprovin

        String user = postgres;
        String pwd = pass;        
        IConnection conex = null;
try {
Driver drv = LayerFactory.getDM().getDriver(selectedDriver);
IVectorialJDBCDriver dbDriver = (IVectorialJDBCDriver) drv;

conex = ConnectionFactory.createConnection(dbURL, user, pwd);


/*creamos la definicion para la capa*/
DBLayerDefinition dbLayerDef = new DBLayerDefinition();
dbLayerDef.setCatalogName("bdprovin"); //Nombre de la base de datos
dbLayerDef.setSchema("public"); //Nombre del esquema
dbLayerDef.setTableName(nombreTabla); //Nombre de la tabla
dbLayerDef.setWhereClause("");
dbLayerDef.setConnection(conex);

/*obtenemos conexion JDBC*/

Connection conexion = ((ConnectionJDBC) conex).getConnection();
DatabaseMetaData metadataDB = conexion.getMetaData();

String tipos[] = new String[1];
tipos[0] = "TABLE";
ResultSet tablas = metadataDB.getTables(null, null, nombreTabla, tipos);
tablas.next();
String t = tablas.getString(tablas.findColumn( "TABLE_NAME" ));

ResultSet columnas = metadataDB.getColumns(null,null,nombreTabla, "%");
ResultSet claves = metadataDB.getPrimaryKeys(null, null, nombreTabla);

//ResultSetMetaData aux = columnas.getMetaData();

ArrayList<FieldDescription> descripciones = new ArrayList 
<FieldDescription>();
ArrayList<String> nombres = new ArrayList<String>();

while(columnas.next()) {
log.info("Tratando atributo: \""+columnas.getString("Column_Name")+"\" de 
la tabla: "+nombreTabla); 
if(columnas.getString("Type_Name").equalsIgnoreCase("geometry")) {
/*si es la columna de geometria*/
log.info("Encontrado atributo de geometria para la tabla: 
"+nombreTabla);
dbLayerDef.setFieldGeometry(columnas.getString("Column_Name"));
}
else {
FieldDescription fieldDescription = new FieldDescription();
fieldDescription.setFieldName(columnas.getString("Column_Name"));
fieldDescription.setFieldType(columnas.getType());
descripciones.add(fieldDescription);
nombres.add(columnas.getString("Column_Name"));
}
} 
FieldDescription fields[] = new FieldDescription[descripciones.size()];
String s[] = new String[nombres.size()];
for(int i = 0; i < descripciones.size(); i++)  {
fields[i] = descripciones.get(i);
s[i] = nombres.get(i);
}

dbLayerDef.setFieldsDesc(fields);
dbLayerDef.setFieldNames(s);

/*buscamos clave primaria y la añadimos a la definicion de la capa*/
while(claves.next()) {
dbLayerDef.setFieldID(claves.getString("Column_Name"));
}


PostGISWriter writer = new PostGISWriter();

writer.setWriteAll(false);
writer.setCreateTable(false);

dbDriver.setData(conex, dbLayerDef);

IProjection proj = null;

if (drv instanceof ICanReproject)
{                   
//((ICanReproject)drv).setDestProjection(strEPSG);
//proj = new ProjectionPool().get("EPSG:" 
+((ICanReproject)drv).getSourceProjection(conex, dbLayerDef));
proj = 
CRSFactory.getCRS("EPSG:"+((ICanReproject)drv).getSourceProjection(conex, 
dbLayerDef));
}
FLayer lyr =  LayerFactory.createDBLayer(dbDriver, nombreTabla, proj);
/*asignamos proyección a la capa y al ViewPort*/
v.getMapControl().getViewPort().setProjection(proj);
dbLayerDef.setSRID_EPSG(proj.getAbrev());


            if (lyr != null) {
                lyr.setVisible(true);
                v.getMapControl().getMapContext().beginAtomicEvent();
                // Comprobamos si es necesario reproyectar
                checkProjection(lyr, v.getMapControl());
                
                v.getMapControl().getMapContext().getLayers().addLayer(lyr);
                v.getMapControl().getMapContext().endAtomicEvent();
            }
            return (FLyrVect) lyr;
} catch (Exception e) {
log.warn("No se pudo cargar capa de la tabla: "+nombreTabla);
utiles.ManejadorErrores.mostrar(new Exception("No se pudo cargar capa de 
la tabla: "+nombreTabla));
e.printStackTrace();
return null;
}

}


private void checkProjection(FLayer lyr, MapControl mc)
    {
        if (lyr instanceof FLyrVect)
        {
            FLyrVect lyrVect = (FLyrVect) lyr;
            IProjection proj = lyr.getProjection();
            // Comprobar que la proyecció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).
            log.warn("Reproyectando capa "+lyr.getName()+" porque no tenía 
proyección asignada");
                lyrVect.setProjection( mc.getViewPort().getProjection());
                return;
            }
            if 
(!proj.getAbrev().equals(mc.getViewPort().getProjection().getAbrev())) {
                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 {
                    log.error("coordTrans = " +
                        proj.getAbrev() + " " + 
mc.getViewPort().getProjection().getAbrev());
                    
                    lyrVect.reProject(mc);
                    System.err.println("coordTrans = " +
                        proj.getAbrev() + " " +
                        mc.getViewPort().getProjection().getAbrev()); 
                }
            }
        }
    }


/* public static void main(String args[]) {
CargadorCapas cargador = new CargadorCapas();

cargador.cargarTabla("concellos", null, null);
}*/
}





___________________________________
Dpto de Sistemas Informáticos
Oficina Central Grupo Empresarial GEOCUBA
Este mensaje esta libre de virus. 
Revisado por Kaspersky Antivirus
----------------------------------------------------------------------
Engine version:  4.0.1.14
Engine date:  2002/06/25
Definition count:  1427809
Definition date:  2009/01/09
MDAV version: 2.2.8

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20090109/29f3ac76/attachment.htm


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