Estou tentando usar a nova função do Postgis 2.0 <-> (Geometry Distance Centroid) para calcular, para cada linha da minha tabela (cosn1), a distância do polígono mais próximo da mesma classe.
Eu estava tentando usar o seguinte código:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
Mas então eu percebo o aviso:
Nota: O índice somente entra em ação se uma das geometrias for uma constante (não em uma subconsulta / cte). por exemplo, 'SRID = 3005; POINT (1011102 450541)' :: geometry em vez de a.geom
Significando que o Índice não será usado e a consulta levará quase o mesmo tempo que antes de usar:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
Alguém pode me indicar uma solução alternativa que me permita melhorar o desempenho da minha consulta?
Muito obrigado.
nearest-neighbor
postgis-2.0
Alexandre Neto
fonte
fonte
Respostas:
Hum fazendo alguns testes na minha máquina parecia que este operador <-> não está funcionando corretamente. Não tenho certeza de que seja um bug, mas ele relatou distância zero em geometrias não sobrepostas. Intrigante, não?
Bem, e as otimizações tradicionais tradicionais de consulta SQL? Como esses resultados inesperados com o operador <->, substituo-o por st_centroid. Obteve resultados muito melhores em velocidade.
Espero que a semântica com st_overlaps continue a mesma. Pelo menos isso foi compreendido na documentação sobre <->
Dos documentos no Postigs <->
Nos meus dados de teste com ~ 5.5k polígonos, a velocidade aumentou de ~ 1000 segundos para ~ 5 segundos sem indexação espacial.
Enfim, por que usar o DISTINCT ON para fazer agrupamentos? Vejo algumas pessoas usando, mas o grupo não existe para eliminar duplicatas?
Sua consulta com otimizações SQL padrão sem o erro st_centroid introduzido
Feliz feriado de natal!
fonte