[Gvsig_desarrolladores] Re: PostGIS con cláusulas WHERE

marcos boullón magán marcosboullon en gmail.com
Jue Ago 17 21:48:24 CEST 2006


Perdón, se me olvidaba:
Utilizo gvSIG 1.0 alpha, recompilado desde las fuentes, sobre Debian,
JAVA 1.4.2_11... Tengo un mensaje anterior donde ya doy todos esos
datos.

M.

2006/8/17, marcos boullón magán <marcosboullon en gmail.com>:
> Hola a todos,
>
> Tengo otro problema con gvSIG contra bases de datos PostGIS, y me
> gustaría saber si alguien puede iluminarme.
>
> Utilizando como ejemplo un montón de código "prestado" de clases de
> gvSIG, he creado una extensión que intenta abrir una conexión a mi
> base de datos PostGIS. La funcionalidad básica me funciona sin grandes
> problemas, pudiendo importar atributos y geometrías; pero cuando trato
> de usar restricciones con "where" me salen un montón de problemas...
>
> Ejemplo. Dentro de mi extensión aparece (más o menos; el código se
> parece mucho al del método getLayer() en el fichero WizarJDBC.java):
>
> [...]
> String dbURL = "jdbc:postgresql://escaton:5432/ampliacion";
> String user = "postgres";
> String pwd = "";
> String layerName = "espazos";
> String[] fields = {"id_espazo", "nome", "planta", "tipo_espazo", "publico"};
> String tableName = "espazos";
> String whereClause = "";
> String fidField = "id_espazo";
> String geomField = "xeometria";
> String strEPSG = "23030";
> driver = (VectorialJDBCDriver) LayerFactory.getDM().getDriver("PostGIS
> JDBC Driver");
> [...]
> return LayerFactory.createDBLayer(driver, "resultado", proj);
>
> Y me funciona. Durante la ejecución obtengo en línea de comando...
>
>  INFO [AWT-EventQueue-1] (?:?) - Cadena SQL:SELECT ASBINARY(xeometria,
> 'XDR'), id_espazo, nome, planta, tipo_espazo, publico FROM espazos
> ORDER BY id_espazo
>
>
> Si quiero ahora restringir a cargar solo aquellas estructuras con una
> posición X inferior a un valor dado, dentro de la consola de
> postgresql puedo hacer "select * from espazos where
> x(pointn(boundary(espazos.xeometria),1))<10", pero al intentar ponerlo
> en el código utilizo la cadena whereClause:
>
> String whereClause = "WHERE x(pointn(boundary(espazos.xeometria),1))<10 ";
>
> Pero durante la ejecución obtengo en línea de comando...
>
> INFO [AWT-EventQueue-1] (?:?) - Cadena SQL:SELECT ASBINARY(xeometria,
> 'XDR'), id_espazo, nome, planta, tipo_espazo, publico FROM espazos
> WHERE x(pointn(boundary(espazos.xeometria),1))<10 ORDER BY id_espazo
> [...]
> SqlAux getFeatureIterator = SELECT ASBINARY(xeometria, 'XDR'),
> id_espazo FROM espazos WHERE
> x(pointn(boundary(espazos.xeometria),1))<10 xeometria &&
> GeometryFromText('LINESTRING(-1.6559431031764689 -20.639157952983247,
> 113.74405689682354 -20.639157952983247, 113.74405689682354
> 87.68108744578976, -1.6559431031764689 87.68108744578976)', -1)
>
> Es decir, la cláusula WHERE tal como la he metido interfiere con la
> implementación del getFeatureIterator (que automáticamente introduce
> una validación de solape con "xeometria && geometryfromtext(..)").
>
> Si para solucionarlo fuerzo un elemento "AND" dentro de la cadena anterior...
>
> String whereClause = "WHERE x(pointn(boundary(espazos.xeometria),1))<10 AND ";
>
> ... obtengo...
>
> INFO [AWT-EventQueue-1] (?:?) - Cadena SQL:SELECT ASBINARY(xeometria,
> 'XDR'), id_espazo, nome, planta, tipo_espazo, publico FROM espazos
> WHERE x(pointn(boundary(espazos.xeometria),1))<10 AND  ORDER BY
> id_espazo
>
> ... que es SQL incorrecto y ya no me continúa.
>
>
> Necesito utilizar cláusulas WHERE durante la carga, ya que esta
> extensión tiene que hacer un montón de consultas con características
> avanzadas de PostGIS (utilizando además geometrías 3D almacenadas en
> la BBDD), y cuando lo he intentado con el DataSource.executeSQL() me
> dice que el SQL es inválido (si ya lo sé, porque no es SQl sino
> PostGIS); así que estoy intentando que ya sólo cargue los datos que me
> interesan metiendo algunos filtros en la orden de establecer la
> conexión con la BBDD.
>
> Entonces, ¿hay alguna forma de que gvSIG me permita hacer consultas
> PostGIS como "select * from espazos where
> z(pointn(boundary(espazos.xeometria),1))<10"? (He cambiado x() por
> z()). Eso supondría dejar que la consulta se calcule en PostGIS en vez
> de en SQL.
>
> En caso de que no pueda con lo anterior, ¿hay alguna forma de
> introducir filtros geométricos PostGIS en la llamada para cargar datos
> de la BBDD PostGIS?
>
> Supongo que a estas alturas estareis ya perplejos... Lo siento, pero
> es que estoy bastante perdido. Si teneis alguna idea de por dónde
> puedo continuar (¿voy a tener que reescribir "getFeatureIterator" para
> que comprueba si hay cláusula WHERE?) os lo agradecería mucho.
>
> Gracias,
>
> Marcos
>
> --
> -- marcos boullón magán
>


-- 
-- marcos boullón magán
-- universidade de Santiago de Compostela



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