У мене є національний набір адресних точок (37 мільйонів) та набір даних багатокутника з обривів (2 мільйони) типу MultiPolygonZ, деякі полігони дуже складні, максимум ST_NPoints становить близько 200 000. Я намагаюся ідентифікувати за допомогою PostGIS (2.18), які точки адреси перебувають у багатокутнику затоплення, і записувати їх у нову таблицю з ідентифікатором адреси та деталями ризику затоплення. Я спробував з адресної точки зору (ST_Within), але потім змінив це положення, починаючи з точки зору заплави (ST_Contains), обґрунтовуючи це тим, що існують великі райони, які взагалі не мають ризику затоплення. Обидва набори даних було повторно відтворено на 4326, і обидві таблиці мають просторовий індекс. Мій запит нижче працює вже 3 дні і не показує ознак закінчення незабаром!
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);
Чи існує більш оптимальний спосіб цього? Крім того, для тривалих запитів такого типу, що є найкращим способом моніторингу прогресу, окрім перегляду використання ресурсів та pg_stat_activity?
Мій оригінальний запит закінчився ОК, хоча і за 3 дні, і я пройшов іншу роботу, тому мені ніколи не присвячувався час на те, щоб спробувати рішення. Однак я тільки що завітав до цього і працюю над рекомендаціями, поки що добре. Я використав наступне:
- Створено 50-кілометрову сітку над Великобританією за допомогою запропонованого тут рішення ST_FishNet
- Встановіть SRID створеної сітки на British National Grid і побудуйте на ній просторовий індекс
- Обрізав мої дані про повені (MultiPolygon), використовуючи ST_Intersection та ST_Intersects (тут я отримав лише те, що мені довелося використовувати ST_Force_2D на геометрії, як shape2pgsql додав індекс Z
- Обрізав мої точкові дані за допомогою тієї ж сітки
- Створено індекси на рядок та колонки та просторовий індекс у кожній із таблиць
Я готовий запустити свій сценарій зараз, буду перебирати рядки та стовпці, що містять результати, до нової таблиці, поки я не охоплюю всю країну. Але я просто перевірив мої дані про повені, і деякі найбільш великі багатокутники, здається, були втрачені в перекладі! Це мій запит:
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));
Мої вихідні дані виглядають так:
Однак після відсікання це виглядає приблизно так:
Це приклад "відсутнього" багатокутника: