Eu tenho um conjunto de dados nacional de pontos de endereço (37 milhões) e um conjunto de dados poligonais de contornos de inundação (2 milhões) do tipo MultiPolygonZ, alguns dos polígonos são muito complexos, o máximo de ST_NPoints é de cerca de 200.000. Estou tentando identificar usando o PostGIS (2.18) quais pontos de endereço estão em um polígono de inundação e escrevê-los em uma nova tabela com identificação de endereço e detalhes de risco de inundação. Tentei de uma perspectiva de endereço (ST_Within), mas depois troquei isso a partir da perspectiva da área de inundação (ST_Contains), justificando que existem grandes áreas sem risco de inundação. Ambos os conjuntos de dados foram reprojetados para 4326 e as duas tabelas possuem um índice espacial. Minha consulta abaixo está em execução há 3 dias e não mostra sinais de conclusão tão cedo!
select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);
Existe uma maneira mais ideal de executar isso? Além disso, para consultas de longa execução desse tipo, qual é a melhor maneira de monitorar o progresso, além de observar a utilização de recursos e a pg_stat_activity?
Minha consulta original terminou em OK, embora por três dias, e me desviei de outros trabalhos, para que eu nunca dedicasse tempo à tentativa da solução. No entanto, eu apenas visitei isso novamente e trabalhei com as recomendações, até agora tão boas. Eu usei o seguinte:
- Criou uma grade de 50 km no Reino Unido usando a solução ST_FishNet sugerida aqui
- Defina o SRID da grade gerada como British National Grid e construa um índice espacial nela
- Recortei meus dados de inundação (MultiPolygon) usando ST_Intersection e ST_Intersects (só peguei aqui foi preciso usar ST_Force_2D no geom, pois shape2pgsql adicionou um índice Z
- Recortou meus dados de ponto usando a mesma grade
- Criamos índices na linha e índice col e espacial em cada uma das tabelas
Estou pronto para executar meu script agora, iterará nas linhas e colunas que preenchem os resultados em uma nova tabela até que eu cubra todo o país. Mas acabei de verificar meus dados de inundação e alguns dos maiores polígonos parecem ter sido perdidos na tradução! Esta é a minha consulta:
SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom
INTO rofrse.tmp_flood_risk_grid
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));
Meus dados originais são assim:
No entanto, após o recorte, fica assim:
Este é um exemplo de um polígono "ausente":