[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