Seguindo a ideia do Duarte em relação a usar o &lt;-&gt; dentro de uma função, criei a seguinte função:<div><br></div><div><div>CREATE OR REPLACE FUNCTION _enn2 (numeric, numeric, geometry) RETURNS double precision AS $$</div>
<div><br></div><div>WITH index_query as</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>(SELECT ST_Distance($3,g1.the_geom) as dist</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>FROM &quot;cosn1&quot; As g1   </div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>WHERE g1.gid &lt;&gt; $1 AND g1.class = $2</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ORDER BY $3 &lt;#&gt; g1.the_geom limit 100)</div>
<div>SELECT dist    </div><div><span class="Apple-tab-span" style="white-space:pre">        </span>FROM index_query</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ORDER BY dist;</div><div>$$ LANGUAGE SQL;</div>
<br><div class="gmail_quote">Chamando-a da seguinte forma:</div><div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">SELECT c.gid as gid, _enn2(c.gid, c.class, c.the_geom) as enn</div><div class="gmail_quote">
FROM cosn1 as c</div><div class="gmail_quote">Order by gid</div></div><div class="gmail_quote"><br></div><div class="gmail_quote">Embora o Index seja usado, para o meu caso o tempo de resposta é ainda superior a não usar o &lt;-&gt;, uma vez que várias condições e cálculos de distância são repetido nesta abordagem polygono a polygono.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Noutros testes que fiz, o uso do &lt;-&gt; (ou &lt;#&gt;) reduz em bastante o tempo de resposta da query (50000 vs 100ms). Por exemplo:</div><div class="gmail_quote">
<br></div><div class="gmail_quote"><div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">CREATE OR REPLACE FUNCTION _enn (geometry) RETURNS double precision AS </div><div class="gmail_quote">
$$</div><div class="gmail_quote">SELECT ST_Distance($1,g1.the_geom) As ENN    </div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">                </span>FROM &quot;grelha5m&quot; As g1</div><div class="gmail_quote">
<span class="Apple-tab-span" style="white-space:pre">                </span>WHERE ST_Distance($1,g1.the_geom) &gt; 0</div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">                </span>ORDER BY ENN;</div><div class="gmail_quote">
<br></div><div class="gmail_quote">--    SELECT ST_DISTANCE ($1,f.the_geom) as dist from cosn1 as f</div><div class="gmail_quote">--    ORDER BY dist;</div><div class="gmail_quote">$$ LANGUAGE SQL;</div><div class="gmail_quote">
<br></div><div class="gmail_quote">--------------------- VS ---------------------</div></div><div class="gmail_quote"><br></div><div class="gmail_quote">CREATE OR REPLACE FUNCTION _enn2 (geometry) RETURNS double precision AS $$</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">WITH index_query as</div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">        </span>(SELECT ST_Distance($1,f.the_geom) as dist</div><div class="gmail_quote">
<span class="Apple-tab-span" style="white-space:pre">        </span>FROM &quot;grelha5m&quot; As f</div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">        </span>ORDER BY $1 &lt;#&gt; g1.the_geom limit 1000)</div>
<div class="gmail_quote">SELECT dist</div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">        </span>FROM index_query</div><div class="gmail_quote"><span class="Apple-tab-span" style="white-space:pre">        </span>ORDER BY dist;</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">$$ LANGUAGE SQL;</div><div class="gmail_quote"><br></div><div class="gmail_quote">Select c.gid as gid, _enn2(c.the_geom) as enn</div><div class="gmail_quote">From cosn1 as c</div>
<div class="gmail_quote">Order by c.gid</div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote">Espero que estas &quot;soluções&quot; sejam úteis a alguém.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Alexandre Neto</div></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div>
<div class="gmail_quote">2012/5/7 Alexandre Neto <span dir="ltr">&lt;<a href="mailto:senhor.neto@gmail.com" target="_blank">senhor.neto@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Boa tarde,<div><br></div><div>Obrigado pelas respostas.</div><div><br></div><div>Sérgio, o código que apresentava já estava feito de acordo com o que é apresentado no OpenGeo (que é igual à página da função &lt;-&gt; <a href="http://postgis.refractions.net/docs/geometry_distance_centroid.html" target="_blank">http://postgis.refractions.net/docs/geometry_distance_centroid.html</a>) embora estou a ver que faltava a limitação ao numero de candidatos no index_query. O problema maior prende-se com o facto de um dos argumentos ter de ser fixo.</div>

<div><br></div><div>E assim, Duarte, acho que tens razão. Estou tentado a pensar que a solução passará por criar uma função que para cada registo procure o vizinho mais próximo. No entanto, não sei até que ponto é que isto não se tornará ainda mais &quot;pesado&quot; do que a abordagem normal (sem índice espacial).</div>

<div><br></div><div>Vou fazer a experiência, e logo transmito os resultados.</div><div><br></div><div>Alexandre Neto<br><br><div class="gmail_quote">2012/5/4 duartecarreira <span dir="ltr">&lt;<a href="mailto:dncarreira@gmail.com" target="_blank">dncarreira@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">não fazia ideia que o &lt;-&gt; faz uso do índice qd se usa o order by... podia-se<br>
usar limit 1 em vez de limit 10 nessa query e obtinha-se o mais próximo...<br>
<br>
mas o problema de termos de usar uma geometria estática mantém-se? se<br>
calhar, só mesmo usando um script que cria o sql dinamicamente para cada<br>
registo...<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://osgeo-org.1560.n6.nabble.com/Postgis-2-0-Analise-de-Vizinho-mais-proximo-usando-index-GIST-funcao-tp4945669p4952823.html" target="_blank">http://osgeo-org.1560.n6.nabble.com/Postgis-2-0-Analise-de-Vizinho-mais-proximo-usando-index-GIST-funcao-tp4945669p4952823.html</a><br>


<div><div>Sent from the OSGeo Portuguese Local Chapter mailing list archive at Nabble.com.<br>
</div></div><br></div></div><div class="im">_______________________________________________<br>
Portugal mailing list<br>
<a href="mailto:Portugal@lists.osgeo.org" target="_blank">Portugal@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/portugal" target="_blank">http://lists.osgeo.org/mailman/listinfo/portugal</a><br>
<br></div></blockquote></div><br></div>
</blockquote></div><br></div>