[Gvsig_desarrolladores] Crear una capa nueva

MAU ingmau00 en gmail.com
Lun Ago 13 14:56:23 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

************************************************************************/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20070813/8eba992e/attachment-0001.htm


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