У меня есть национальный набор данных точек адреса (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 для geom, так как 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));
Мои исходные данные выглядят так:
Однако после обрезки это выглядит так:
Это пример «отсутствующего» многоугольника: