Mais

Postgis ST_Intersecta o desempenho

Postgis ST_Intersecta o desempenho


Estou selecionando muitos polígonos dentro de um polígono gigantesco usando a função postgis ST_Intersects ().

SELECT * FROM data.polygons AS poly, data.gig_polygon AS gig WHERE ST_Intersects (poly.geom, gig.geom)

O polígono gigante é apenas um polígono de grande tamanho (uma linha) no momento. A consulta está demorando muito. Eu queria saber se seria mais rápido dividir o polígono gigantesco em vários polígonos menores e executar a consulta novamente. Não quero cancelar sem saber que será mais rápido. Para saber a resposta à minha pergunta, acho que você precisa entender de que maneira a função ST_Intersects () funciona.

Alguém sabe disso? Ou conhece outra forma de agilizar a funcionalidade ST_Intersect ()?


Poderia ser mais rápido, você está certo, mas o que você realmente precisa, se ainda não tiver um, é um índice espacial. Assim, ele será capaz de fazer uma primeira passagem de sua consulta rapidamente, descobrindo quais bits dos dados a consulta precisa para examiná-los. Em seguida, ele verificará esses pontos de dados para os quais exatamente dentro do polígono.

Você pode criar um índice usando as informações aqui - ele também fornece uma visão geral da indexação espacial.

A razão pela qual pode ser mais rápido se você quebrar o polígono grande é que se, digamos, seu polígono for longo e fino, a caixa delimitadora (que o índice usa) pode não cobrir grande parte da área real do polígono, então você obterá muitos falsos positivos do índice. Da mesma forma, se o polígono cobrir a maior parte do outro conjunto de dados, o índice não será muito útil. Isso pode ser mais apropriado em gis.stackexchange.com


Tenho uma tarefa semelhante: cruzar muitas cadeias de linhas com um polígono complexo. Acabei de experimentar um enorme benefício de desempenho ao dividir o polígono. Isso é muito fácil usando st_subdivide ().

Consulta anterior, tempo de execução 22:43 minutos:

SELECT sum (st_length (st_intersection (netw.geom, poly.geom))) len FROM g973.xglnetzg netw LEFT JOIN g973.ugebiet poly ON st_intersects (netw.geom, poly.geom);

Nova consulta, mesmo resultado em 26.692 segundos:

COM poli AS (SELECT st_subdivide (geom) geom FROM g973.ugebiet) SELECT soma (st_length (st_intersection (netw.geom, poly.geom))) len FROM g973.xglnetzg netw LEFT JOIN poly ON st_intersects (netw.geom, poly. geom);

Onde o polígono é a fronteira do Tirol / Áustria do OSM com 3 anéis externos e 47.264 vértices e rede é uma rede rodoviária com 184.203 arestas e até 1.046 vértices por aresta. Ambas as camadas têm indizes espaciais. 150.822 arestas correspondem ao polígono por &&, 114.064 por st_intersects ().

Acho que essa consulta poderia ser otimizada ainda mais, mas por enquanto me sinto com sorte.


Assista o vídeo: Create Spatial Table u0026 Add Geometry Column in #PostGIS. #PG #QGIS. Urdu. Hindi. Eng. #19