<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=unicode">
<META content="MSHTML 6.00.6000.16981" name=GENERATOR></HEAD>
<BODY>
<DIV id=idOWAReplyText9609>
<DIV><FONT face="Times New Roman" color=#000000 size=3>Hola, la primera idea que me viene a la cabeza es:</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>- calcula el bounding box de G, llamémosle B</DIV>
<DIV>- haz la misma llamada que se haría&nbsp;en gvSIG si tuviera que pintarse una capa basada en esa tabla de Oracle para una vista cuya extensión fuese B.</DIV>
<DIV>- Acumula las geometrías obtenidas en un array y comprueba para cada una si efectivamente contiene a G o no (es decir, refina el resultado)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Si has instanciado un capa basada en Oracle Spatial y le pides una geometría concreta, efectivamente, se hará una petición a la BD por cada llamada.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Saludos,&nbsp;</DIV>
<DIV><FONT face="Times New Roman" color=#000000 size=3></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New" size=2><FONT face="Times New Roman" size=3>Juan Lucas Domínguez Rubio<BR></FONT>---</FONT></DIV></DIV>
<DIV id=idSignature16105>
<DIV><FONT face="Courier New" size=2><FONT face="Courier New" size=2><FONT face="Courier New" size=2>Prodevelop SL, Valencia (España)</FONT></DIV>
<DIV>
<DIV><FONT face="Courier New" size=2>Tlf.: 96.351.06.12 -- Fax: 96.351.09.68<BR></FONT><A href="http://www.prodevelop.es/"><FONT face="Courier New" size=2>http://www.prodevelop.es</FONT></A><BR><FONT face="Courier New" size=2>---</FONT></DIV></FONT></DIV></FONT></DIV>
<DIV><BR>
<HR>
<FONT face=Tahoma size=2><B>De:</B> gvsig_desarrolladores-bounces@listserv.gva.es en nombre de Antonio Grassi<BR><B>Enviado el:</B> jue 28/01/2010 15:12<BR><B>Para:</B> gvsig_desarrolladores@listserv.gva.es<BR><B>Asunto:</B> [Gvsig_desarrolladores] Optimización de consultas geográficas - Email found in subject<BR></FONT><BR></DIV>
<DIV>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 =&nbsp;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>&nbsp;&nbsp; &nbsp;IFeature p =&nbsp;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&nbsp;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></DIV></BODY></HTML>