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 <[email protected]> > 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 <[email protected]> > >> 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 >> [email protected] >> http://lists.osgeo.org/mailman/listinfo/portugal >> >> >
_______________________________________________ Portugal mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/portugal
