Ho un set di dati nazionale di punti di indirizzo (37 milioni) e un set di dati poligonale di contorni di inondazioni (2 milioni) di tipo MultiPolygonZ, alcuni dei poligoni sono molto complessi, il numero massimo di ST_NPoints è di circa 200.000. Sto cercando di identificare con PostGIS (2.18) quali punti di indirizzo si trovano in un poligono di inondazione e scriverli in una nuova tabella con ID indirizzo e dettagli sul rischio di alluvione. Ho provato dal punto di vista dell'indirizzo (ST_Within) ma poi l'ho scambiato partendo dal punto di vista dell'area di alluvione (ST_Contains), in base alla logica che ci sono ampie aree senza alcun rischio di alluvione. Entrambi i set di dati sono stati riproiettati in 4326 ed entrambe le tabelle hanno un indice spaziale. La mia query qui sotto è in corso da 3 giorni e non mostra alcun segno di finire presto!
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);
C'è un modo più ottimale per eseguire questo? Inoltre, per query a lungo termine di questo tipo, qual è il modo migliore per monitorare i progressi oltre a guardare l'utilizzo delle risorse e pg_stat_activity?
La mia query originale è andata a buon fine, anche se per 3 giorni e mi sono allontanato da altri lavori, quindi non ho mai avuto il tempo di provare la soluzione. Tuttavia, ho appena visitato nuovamente questo sito e ho esaminato le raccomandazioni, finora tutto bene. Ho usato il seguente:
- Creato una griglia di 50 km nel Regno Unito usando la soluzione ST_FishNet suggerita qui
- Imposta l'SRID della griglia generata su British National Grid e crea un indice spaziale su di essa
- Ho salvato i miei dati di flood (MultiPolygon) usando ST_Intersection e ST_Intersects (solo qui ho dovuto usare ST_Force_2D sul geom dato che shape2pgsql ha aggiunto un indice Z
- Ho registrato i miei dati dei punti usando la stessa griglia
- Indici creati sulla riga e col e indice spaziale su ciascuna delle tabelle
Sono pronto per eseguire la mia sceneggiatura ora, passerò in rassegna le righe e le colonne popolando i risultati in una nuova tabella fino a quando non avrò coperto l'intero paese. Ma ho appena controllato i miei dati di alluvione e alcuni dei più grandi poligoni sembrano essersi persi nella traduzione! Questa è la mia domanda:
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));
I miei dati originali si presentano così:
Comunque dopo il ritaglio sembra così:
Questo è un esempio di un poligono "mancante":