Re: [Portugal] Re: Postgis 2.0 - Análise de Vizinho mais próximo usando index GIST (função <->)

Alexandre Neto senhor.neto gmail.com
Quarta-Feira, 9 de Maio de 2012 - 13:03:46 EDT


Seguindo a ideia do Duarte em relação a usar o <-> dentro de uma função,
criei a seguinte função:

CREATE OR REPLACE FUNCTION _enn2 (numeric, numeric, geometry) RETURNS
double precision AS $$

WITH index_query as
(SELECT ST_Distance($3,g1.the_geom) as dist
FROM "cosn1" As g1
WHERE g1.gid <> $1 AND g1.class = $2
ORDER BY $3 <#> g1.the_geom limit 100)
SELECT dist
FROM index_query
ORDER BY dist;
$$ LANGUAGE SQL;

Chamando-a da seguinte forma:

SELECT c.gid as gid, _enn2(c.gid, c.class, c.the_geom) as enn
FROM cosn1 as c
Order by gid

Embora o Index seja usado, para o meu caso o tempo de resposta é ainda
superior a não usar o <->, uma vez que várias condições e cálculos de
distância são repetido nesta abordagem polygono a polygono.

Noutros testes que fiz, o uso do <-> (ou <#>) reduz em bastante o tempo de
resposta da query (50000 vs 100ms). Por exemplo:


CREATE OR REPLACE FUNCTION _enn (geometry) RETURNS double precision AS
$$
SELECT ST_Distance($1,g1.the_geom) As ENN
FROM "grelha5m" As g1
WHERE ST_Distance($1,g1.the_geom) > 0
ORDER BY ENN;

--    SELECT ST_DISTANCE ($1,f.the_geom) as dist from cosn1 as f
--    ORDER BY dist;
$$ LANGUAGE SQL;

--------------------- VS ---------------------

CREATE OR REPLACE FUNCTION _enn2 (geometry) RETURNS double precision AS $$

WITH index_query as
(SELECT ST_Distance($1,f.the_geom) as dist
FROM "grelha5m" As f
ORDER BY $1 <#> g1.the_geom limit 1000)
SELECT dist
FROM index_query
ORDER BY dist;

$$ LANGUAGE SQL;

Select c.gid as gid, _enn2(c.the_geom) as enn
>From cosn1 as c
Order by c.gid



Espero que estas "soluções" sejam úteis a alguém.

Alexandre Neto




2012/5/7 Alexandre Neto <senhor.neto  gmail.com>

> Boa tarde,
>
> Obrigado pelas respostas.
>
> 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 <->
> http://postgis.refractions.net/docs/geometry_distance_centroid.html)
> 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.
>
> 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 "pesado" do que a abordagem normal (sem índice espacial).
>
> Vou fazer a experiência, e logo transmito os resultados.
>
> Alexandre Neto
>
> 2012/5/4 duartecarreira <dncarreira  gmail.com>
>
>> não fazia ideia que o <-> faz uso do índice qd se usa o order by...
>> podia-se
>> usar limit 1 em vez de limit 10 nessa query e obtinha-se o mais próximo...
>>
>> mas o problema de termos de usar uma geometria estática mantém-se? se
>> calhar, só mesmo usando um script que cria o sql dinamicamente para cada
>> registo...
>>
>>
>>
>> --
>> View this message in context:
>> http://osgeo-org.1560.n6.nabble.com/Postgis-2-0-Analise-de-Vizinho-mais-proximo-usando-index-GIST-funcao-tp4945669p4952823.html
>> Sent from the OSGeo Portuguese Local Chapter mailing list archive at
>> Nabble.com.
>>
>> _______________________________________________
>> Portugal mailing list
>> Portugal  lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/portugal
>>
>>
>
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: http://lists.osgeo.org/pipermail/portugal/attachments/20120509/cf6b281e/attachment.html


Mais informações acerca da lista Portugal