[Gvsig_usuarios] PostGIS con cláusulas WHERE

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


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



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