[Gvsig_desarrolladores] Optimizaci髇 de consultas geogr醘icas

Antonio Grassi agrassic en gmail.com
Jue Ene 28 15:12:09 CET 2010


Buenos d铆as miembros de la lista!

Estoy teniendo problemas con la rapidez de ciertas consultas geogr谩ficas.
Supongo que tiene que haber formas m谩s eficientes de realizarlas. El
escenario es el siguiente:

Estoy desarrollando sobre la versi贸n 1.9 estable. Tengo una capa POLIGONOS
en una base de datos Oracle. Me interesa, para una geometr铆a G, saber dentro
de que pol铆gonos se encuentra dicha geometr铆a. El c贸digo que utilizo para
esto es el siguiente:

FLyrVect poligonos = ...
IGeometry g = ...

FBitSet resultado = poligonos.queryByShape(g,
QueryByGeometryVisitor.WITHIN);

for (int i = resultado.nextSetBit(0); i >= 0; i = resultado.nextSetBit(i +
1))
{
    IFeature p = poligonos.getSource().getFeature(i);
}

El c贸digo produce el resultado esperado, pero demora cantidades enormes de
tiempo en ejecutarse para capas muy peque帽as. La capa POLIGONOS est谩
adecuadamente definida en la base, y cuenta con 铆ndice geom茅trico.

Estuve investigando un poco el tema. Esperaba que la invocaci贸n a
queryByShape terminara implement谩ndose mediante una consulta SQL sobre la
tabla POLIGONOS utilizando como filtro un predicado geom茅trico que
relacionase la columna GEOM con la geometr铆a dada como par谩metro, mediante
la condici贸n WITHIN, algo como lo siguiente (no recuerdo la especificaci贸n
de las funciones SDO, es solo a modo de ejemplo):

select * from POLIGONOS where SDO_WITHIN(SDO_GEOMETRY(...), GEOM);

Depurando un poco el c贸digo, creo que en realidad se recorre la capa
mediante un patr贸n VISITOR en donde se van obteniendo todos los features y
realizando la relaci贸n geom茅trica en el cliente.

Por otro lado, la obtenci贸n de un feature de la capa (por ej.,
mediante poligonos.getSource().getFeature(i)) toma bastante tiempo, por lo
que supongo que se realiza una consulta a la base por cada invocaci贸n.

Mis preguntas son entonces:

1) Es correcto el c贸digo que utilizo para realizar la consulta geogr谩fica?
2) Existe alguna manera de hacer una consulta geogr谩fica sobre la capa
utilizando las funcionalidades geom茅tricas de la base (como describ铆a m谩s
arriba, y sin realizar una consulta SQL escrita a mano sobre la conexi贸n
JDBC, obviamente)?
3) Con respecto al m茅todo getFeature(), es correcta mi suposici贸n de que se
hace una consulta a la base por cada invocaci贸n? Existe alguna manera de
optimizar esta operaci贸n?

Desde ya much铆simas gracias,
Antonio Grassi
------------ pr髕ima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20100128/e0b72b5e/attachment.htm 


M醩 informaci髇 sobre la lista de distribuci髇 gvSIG_desarrolladores