Mam krajowy zestaw danych punktów adresowych (37 milionów) i wielokątny zbiór konturów powodzi (2 miliony) typu MultiPolygonZ, niektóre z wielokątów są bardzo złożone, maks. ST_NPoints wynosi około 200 000. Próbuję zidentyfikować za pomocą PostGIS (2.18), które punkty adresowe znajdują się w wielokącie powodziowym, i zapisać je w nowej tabeli z identyfikatorem adresu i szczegółami ryzyka powodzi. Próbowałem z perspektywy adresu (ST_Within), ale potem zamieniłem to, zaczynając od perspektywy obszaru powodziowego (ST_Contains), uzasadniając to tym, że są duże obszary w ogóle bez ryzyka powodzi. Oba zestawy danych zostały ponownie przerzucone na 4326 i obie tabele mają indeks przestrzenny. Moje zapytanie poniżej działa od 3 dni i nie pokazuje żadnych oznak ukończenia w najbliższym czasie!
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);
Czy istnieje bardziej optymalny sposób na uruchomienie tego? Ponadto, w przypadku długich zapytań tego typu, jaki jest najlepszy sposób monitorowania postępu poza analizowaniem wykorzystania zasobów i pg_stat_activity?
Moje oryginalne zapytanie zakończyło się OK, chociaż przez 3 dni, i zostałem odsunięty na bok z inną pracą, więc nigdy nie musiałem poświęcać czasu na wypróbowanie rozwiązania. Jednak właśnie ponownie to odwiedziłem i zapoznałem się z zaleceniami, jak dotąd jak dotąd. Użyłem następujących:
- Utworzono 50-kilometrową siatkę nad Wielką Brytanią za pomocą zaproponowanego tutaj rozwiązania ST_FishNet
- Ustaw SRID wygenerowanej siatki na British National Grid i zbuduj na niej indeks przestrzenny
- Obciąłem moje dane powodziowe (MultiPolygon) za pomocą ST_Intersection i ST_Intersects (tylko tutaj musiałem użyć ST_Force_2D na geomie, ponieważ shape2pgsql dodał indeks Z
- Obcięto moje dane punktów przy użyciu tej samej siatki
- Utworzono indeksy dla wiersza i kolumny oraz indeks przestrzenny dla każdej z tabel
Jestem teraz gotowy do uruchomienia skryptu, będę iterował wiersze i kolumny wypełniające wyniki w nowej tabeli, dopóki nie obejmę całego kraju. Ale właśnie sprawdziłem moje dane powodziowe i niektóre z największych wielokątów wydają się być zagubione w tłumaczeniu! To jest moje zapytanie:
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));
Moje oryginalne dane wyglądają tak:
Jednak po wycinaniu wygląda to tak:
To jest przykład „brakującego” wielokąta: