[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