[Gvsig_desarrolladores] adicinar una capa postgis por codigo

Sergio Piñón sergiopinhon en gmail.com
Vie Ene 9 15:23:30 CET 2009


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);
	}*/
}






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