Buenos días miembros de la lista!<div><br></div><div>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:</div>
<div><br></div><div>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:</div>
<div><br></div><div>FLyrVect poligonos = ...</div><div>IGeometry g = ...</div><div><br></div><div>FBitSet resultado = poligonos.queryByShape(g, QueryByGeometryVisitor.WITHIN);</div><div><br></div><div>for (int i = resultado.nextSetBit(0); i &gt;= 0; i = resultado.nextSetBit(i + 1))</div>
<div>{</div><div>    IFeature p = poligonos.getSource().getFeature(i);</div><div>}</div><div><br></div><div>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.</div>
<div><br></div><div>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):</div>
<div><br></div><div>select * from POLIGONOS where SDO_WITHIN(SDO_GEOMETRY(...), GEOM);</div><div><br></div><div>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.</div>
<div><br></div><div>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.</div>
<div><br></div><div>Mis preguntas son entonces:</div><div><br></div><div>1) Es correcto el código que utilizo para realizar la consulta geográfica?</div><div>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)?</div>
<div>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?</div><div><br></div><div>Desde ya muchísimas gracias,</div>
<div>Antonio Grassi</div>