Tengo un conjunto de datos nacional de puntos de dirección (37 millones) y un conjunto de datos poligonales de contornos de inundación (2 millones) del tipo MultiPolygonZ, algunos de los polígonos son muy complejos, el máximo de ST_NPoints es de alrededor de 200,000. Estoy tratando de identificar usando PostGIS (2.18) qué puntos de dirección están en un polígono de inundación y escribirlos en una nueva tabla con identificación de dirección y detalles de riesgo de inundación. He intentado desde una perspectiva de dirección (ST_Within) pero luego cambié esto desde la perspectiva del área de inundación (ST_Contains), la razón es que hay grandes áreas sin riesgo de inundación. Ambos conjuntos de datos se han reproyectado a 4326 y ambas tablas tienen un índice espacial. ¡Mi consulta a continuación ha estado funcionando durante 3 días y no muestra signos de terminar pronto!
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);
¿Hay una forma más óptima de ejecutar esto? Además, para consultas de larga duración de este tipo, ¿cuál es la mejor manera de monitorear el progreso que no sea mirar la utilización de recursos y pg_stat_activity?
Mi consulta original terminó bien aunque durante 3 días y me desvié de otro trabajo, así que nunca pude dedicar el tiempo a probar la solución. Sin embargo, acabo de volver a visitar esto y de seguir las recomendaciones, hasta ahora todo bien. He usado lo siguiente:
- Creó una cuadrícula de 50 km sobre el Reino Unido utilizando la solución ST_FishNet sugerida aquí
- Establezca el SRID de la cuadrícula generada en British National Grid y construya un índice espacial en él
- Recorté mis datos de inundación (MultiPolygon) usando ST_Intersection y ST_Intersects (lo único que obtuve fue que tuve que usar ST_Force_2D en la geom ya que shape2pgsql agregó un índice Z
- Recorté mis datos de puntos usando la misma cuadrícula
- Se crearon índices en la fila y col e índice espacial en cada una de las tablas.
Estoy listo para ejecutar mi script ahora, iteraré sobre las filas y columnas que llenan los resultados en una nueva tabla hasta que haya cubierto todo el país. ¡Pero acabo de verificar mis datos de inundación y algunos de los polígonos más grandes parecen haberse perdido en la traducción! Esta es mi 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));
Mis datos originales se ven así:
Sin embargo, el recorte posterior se ve así:
Este es un ejemplo de un polígono "perdido":