Eu tenho 150 milhões de pontos em uma tabela de pontos e gostaria de encontrar os poucos pontos fora de uma dada geometria de polígono. Eu sei que 99,9% dos pontos estão dentro da geometria do polígono. Estou interessado em encontrar os poucos pontos que estão fora do polígono.
Minha melhor consulta atual usando tabelas PostGIS indexadas leva cerca de 30 minutos para ser concluída. Existe uma maneira de otimizar a consulta a seguir sabendo que a maioria dos pontos está dentro do polígono (borda)?
SELECT COUNT(*)
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA';
O polígono é basicamente a fronteira administrativa da Itália. Vértices - 405.000. Peças - 510. O envelope é muito maior que o polígono (o polígono cobre 24% do envelope)
postgis
postgresql
Prithvi
fonte
fonte
GROUP BY
da chave primária dos pontos. (PostgreSQL convenientemente permite fazer referência a quaisquer colunas naSELECT
cláusula que vêm de uma tabela onde a chave primária está incluída naGROUP BY
cláusula.)ST_Within
já faz uma verificação de caixa de limite que permite o uso do índice. (Quase todas as funções do PostGIS incluem essa otimização.) Se ainda estiver lento, então claramente o problema está na complexidade do polígono.ST_Intersects
, poisST_Within
não corresponderia com segurança às condições de limite interno.Respostas:
Use ST_Subdivide para cortar seu polígono em polígonos menores, salve-os em uma tabela e crie um índice espacial. Em seguida, faça sua consulta nos polígonos em grade.
Sem isso, a indexação espacial não oferece nenhuma vantagem no seu caso (apenas 1 polígono de interesse).
fonte