[Gvsig_desarrolladores] Crear una capa nueva
MAU
ingmau00 en gmail.com
Lun Ago 13 15:03:06 CEST 2007
Saludos, como muchos otros tambien ando haciendo una extension
y tengo problemas creo que con la version 1.02 que con la version 1.0
no me pasaba (no recuerdo si con la 1.01 tambien o no) en windows.
Al grano: ando intentando representar una consultra SQL (que eso si que
hace bien) como capa nueva, el codigo que tenia que antes me funcionaba
es el siguiente:
// el error es el siguiente
java.lang.NullPointerException
at com.hardcode.gdbms.engine.values.StringValue.getWidth(Unknown Source)
at com.iver.cit.gvsig.fmap.drivers.MemoryDriver.initializeFieldWidth(MemoryDriver.java:303)
at com.iver.cit.gvsig.fmap.drivers.MemoryDriver.addGeometry
(MemoryDriver.java:106)
at com.iver.cit.gvsig.fmap.drivers.MemoryDriver.addShape(MemoryDriver.java:139)
at es.udc.lbd.gvsig.tutorial.model.action.ConsultaSQLAction.execute(ConsultaSQLAction.java:88)
at es.udc.lbd.gvsig.tutorial.model.TutorialFacadeDelegate.consultaSQL(TutorialFacadeDelegate.java:20)
at es.udc.lbd.gvsig.tutorial.view.ConsultaSQLView.okButtonPressed
(ConsultaSQLView.java:53)
at es.udc.lbd.gvsig.tutorial.view.ConsultaSQLView.access$0(ConsultaSQLView.java:50)
at es.udc.lbd.gvsig.tutorial.view.ConsultaSQLView$1.actionPerformed(ConsultaSQLView.java:106)
at javax.swing.AbstractButton.fireActionPerformed (Unknown Source)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown
Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed (Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent (Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at com.iver.andami.ui.AndamiEventQueue.dispatchEvent
(AndamiEventQueue.java:58)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents (Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
//CODIGO DE LAS CLASES IMPLICADAS
package es.udc.lbd.gvsig.tutorial.model.action;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
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 java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties ;
import org.postgis.Geometry;
import org.postgis.PGgeometry;
import com.hardcode.gdbms.engine.spatial.GeneralPath;
import com.hardcode.gdbms.engine.values.Value;
import com.hardcode.gdbms.engine.values.ValueFactory;
import com.iver.andami.PluginServices;
import com.iver.cit.gvsig.fmap.MapControl ;
import com.iver.cit.gvsig.fmap.core.FPoint2D;
import com.iver.cit.gvsig.fmap.core.FPolygon2D ;
import com.iver.cit.gvsig.fmap.core.FPolyline2D;
import com.iver.cit.gvsig.fmap.core.FShape;
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
import com.iver.cit.gvsig.fmap.core.IGeometry;
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
import com.iver.cit.gvsig.fmap.drivers.ConcreteMemoryDriver;
import com.iver.cit.gvsig.fmap.drivers.WKBParser2 ;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.fmap.layers.LayerFactory ;
import com.iver.cit.gvsig.project.documents.view.gui.View;
import es.udc.lbd.gvsig.tutorial.exception.InternalErrorException;
import es.udc.lbd.gvsig.tutorial.model.PostGIS2GeneralPath ;
public class ConsultaSQLAction {
private String host;
private String port;
private String user;
private String password;
private String database;
private String sql;
private MapControl mapCtrl;
private List fields;
private List types;
private String geometryColumnName;
private int geometryColumn;
public ConsultaSQLAction(String host, String port, String user,
String password, String database, String sql, MapControl mapCtrl) {
this.host = host;
this.port = port;
this.user = user;
this.password = password;
this.database = database;
this.sql = sql;
this.mapCtrl = mapCtrl;
fields = new ArrayList();
types = new ArrayList();
}
public void execute() throws InternalErrorException {
Connection con = null;
Statement ps = null;
ResultSet resultSet = null;
try {
con = connect();
ps = con.createStatement();
ps.setFetchSize(50);
resultSet = ps.executeQuery(sql);
computeMetadata(resultSet);
ConcreteMemoryDriver driver = new ConcreteMemoryDriver();
driver.getTableModel().setColumnIdentifiers(fields.toArray ());
Value[] auxRow = new Value[fields.size()];
while (resultSet.next()) {
fillRow(resultSet, auxRow);
FShape shp1 = getGeometry(resultSet);
driver.addShape(shp1, auxRow);
//aqui supuestamente es donde lanza la excepcion
}
FLayer lyr;
String layerName = sql;
lyr = LayerFactory.createLayer(layerName,driver,
mapCtrl.getViewPort().getProjection());
if (lyr != null) {
lyr.setVisible(true);
mapCtrl.getMapContext ().getLayers().addLayer(lyr);
}
} catch (SQLException e) {
throw new InternalErrorException(e);
}
return;
}
private Connection connect() throws InternalErrorException{
Connection con = null;
try {
Class.forName("org.postgresql.Driver");
con =
DriverManager.getConnection("jdbc:postgresql://"+host+":"+port+"/"+database,
user, password);
con.setAutoCommit(false);
} catch (Exception e) {
throw new InternalErrorException(e);
}
return con;
}
private List computeMetadata(ResultSet resultSet) throws
InternalErrorException {
try {
ResultSetMetaData meta = resultSet.getMetaData ();
int num_cols = meta.getColumnCount();
for (int col_idx = 1; col_idx <= num_cols; col_idx++) {
String attr_name = meta.getColumnName(col_idx);
String table_name = meta.getTableName(col_idx);
int sql_type = meta.getColumnType(col_idx);
if(meta.getColumnTypeName(col_idx).equalsIgnoreCase("geometry")) {
geometryColumnName = attr_name;
geometryColumn = col_idx;
} else if ((sql_type != Types.BINARY) &&
(!meta.getColumnTypeName(col_idx).equalsIgnoreCase("geometry"))) {
fields.add(attr_name);
}
}
} catch (SQLException e) {
throw new InternalErrorException(e);
}
return fields;
}
private void fillRow(ResultSet resultSet, Value[] auxRow) throws
InternalErrorException {
int column = 0;
try {
ResultSetMetaData meta = resultSet.getMetaData();
int num_cols = meta.getColumnCount();
for (int col_idx = 1; col_idx <= num_cols; col_idx++) {
String attr_name = meta.getColumnName(col_idx);
String table_name = meta.getTableName(col_idx);
int sql_type = meta.getColumnType(col_idx);
if ((sql_type != Types.BINARY) &&
(!meta.getColumnTypeName(col_idx).equalsIgnoreCase("geometry"))) {
auxRow[column] =
ValueFactory.createValue(resultSet.getString(col_idx));
column++;
}
}
} catch (SQLException e) {
throw new InternalErrorException(e);
}
}
private FShape getGeometry(ResultSet resultSet) throws
InternalErrorException {
GeneralPathX gp = null;
FShape resultShape = null;
try {
String wkb = resultSet.getString(geometryColumn);
if (wkb == null) {
gp = new GeneralPathX();
} else {
PGgeometry geom = new PGgeometry(wkb);
gp = PostGIS2GeneralPath.getGeneralPath(geom);
switch(geom.getGeoType()) {
case Geometry.POINT:
resultShape = new
FPoint2D(geom.getGeometry().getFirstPoint().getX(), geom.getGeometry
().getFirstPoint().getY());
case Geometry.LINESTRING:
case Geometry.LINEARRING:
case Geometry.MULTILINESTRING:
resultShape = new FPolyline2D(gp);
case Geometry.POLYGON :
case Geometry.MULTIPOLYGON:
resultShape = new FPolygon2D(gp);
}
}
} catch (SQLException e) {
throw new InternalErrorException(e);
}
return resultShape;
}
}
package es.udc.lbd.gvsig.tutorial.model;
import java.sql.SQLException;
import org.postgis.Geometry ;
import org.postgis.LineString;
import org.postgis.LinearRing;
import org.postgis.MultiLineString;
import org.postgis.MultiPolygon;
import org.postgis.PGgeometry;
import org.postgis.Point;
import org.postgis.Polygon ;
import com.hardcode.gdbms.engine.spatial.GeneralPath;
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
public class PostGIS2GeneralPath {
public static GeneralPathX getGeneralPath(PGgeometry geom) throws
SQLException{
GeneralPathX gp = new GeneralPathX();
if (geom.getGeoType() == Geometry.POINT) {
Point p = (Point) geom.getGeometry();
gp.moveTo(p.x, p.y);
} else if ( geom.getGeoType() == Geometry.LINESTRING) {
gp = lineString2GP((LineString) geom.getGeometry());
} else if (geom.getGeoType() == Geometry.MULTILINESTRING) {
MultiLineString mls = (MultiLineString) geom.getGeometry();
for (int j = 0; j < mls.numLines(); j++) {
gp.append(lineString2GP(mls.getLine(j)), false);
}
} else if (geom.getGeoType() == Geometry.POLYGON ) {
gp = polygon2GP((Polygon) geom.getGeometry());
} else if (geom.getGeoType() == Geometry.MULTIPOLYGON) {
MultiPolygon mp = (MultiPolygon) geom.getGeometry();
for (int i = 0; i < mp.numPolygons(); i++) {
gp.append(polygon2GP(mp.getPolygon(i)), false);
}
} else if (geom.getGeoType() == Geometry.GEOMETRYCOLLECTION) {
throw new RuntimeException("geometryCollections not
supported by this driver");
} else {
throw new RuntimeException("Unknown datatype");
}
return gp;
}
private static GeneralPathX polygon2GP(Polygon p) {
GeneralPathX gp = new GeneralPathX();
for (int r = 0; r < p.numRings(); r++) {
gp.append(linearRing2GP(p.getRing(r)), false);
}
return gp;
}
/**
* DOCUMENT ME!
*
* @param lr DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static GeneralPathX linearRing2GP(LinearRing lr) {
Point p;
GeneralPathX gp = new GeneralPathX();
if ((p = lr.getPoint(0)) != null) {
gp.moveTo(p.x, p.y);
for (int i = 1; i < lr.numPoints(); i++) {
p = lr.getPoint(i);
gp.lineTo(p.x, p.y );
}
}
gp.closePath();
return gp;
}
/**
* DOCUMENT ME!
*
* @param ls DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static GeneralPathX lineString2GP(LineString ls) {
Point p;
GeneralPathX gp = new GeneralPathX();
if ((p = ls.getPoint(0)) != null) {
gp.moveTo(p.x , p.y);
for (int i = 1; i < ls.numPoints(); i++) {
p = ls.getPoint(i);
gp.lineTo(p.x, p.y);
}
}
return gp;
}
}
--
//\/\ A U
/************************************************************************
Miguel Álvarez Úbeda
ingmau00 en gmail.com
************************************************************************/
Más información sobre la lista de distribución gvSIG_desarrolladores