Re: [Gvsig_desarrolladores] PostGIS con cláusulas WHERE

marcos boullón magán marcosboullon en gmail.com
Vie Ago 18 10:39:34 CEST 2006


Hola,

OK. Gracias por preocuparos.

M.

El 18/08/06, Francisco José<fpenarru en iver.es> escribió:
> Hola Marcos.
>
> Todo apunta a que hay un bug en el driver de PostGIS. Lo revisaremos, y
> en cuanto esté corregido te enviaremos el código para que puedas seguir
> trabajando hasta la salida de la siguiente release.
>
> Saludos, y gracias por encontrarlo.
>
>
> marcos boullón magán escribió:
> > 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
> >
>
>
> --
> Francisco José Peñarrubia
> Equipo gvSIG
>
> IVER T.I. S.A.
> c/Salamanca 50
> 46005 Valencia
> Spain
>
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>


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



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