[Gvsig_desarrolladores] adicinar una capa postgis por codigo
fsalas
fsalas en geocuba.cu
Vie Ene 9 09:40:27 CET 2009
Segio gracias, ahora mismo comienzo a prbar esto.
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
Más información sobre la lista de distribución gvSIG_desarrolladores