У меня есть таблица, Images
, которую я использую (с PostGIS) для вычисления перекрывающихся полигонов. Изображение ниже показывает супер простой пример.
Результаты геометрии этого пространственного запроса помещаются в столбец geom
таблицы overlay
, используя следующий запрос.
INSERT INTO overlay(geom)
(
SELECT ST_AsEWKB(geom) AS geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing((ST_DUMP(footprint_latlon)).geom) AS the_geom
FROM images AS lines
) AS noded_lines
))
)
Затем я запускаю второй запрос для вычисления Images
полигонов, которые внесли вклад в наложение. Это буквы на изображении, и результаты заполняют массив в таблице Overlay
. В частности,
UPDATE overlay
SET intersections = imgs.iid
FROM (
SELECT array_agg(images.id)
FROM overlay, images
ST_INTERSECTS(overlay.geom, images.footprint_latlon)
GROUP BY overlay.id
) AS intersections
WHERE imgs.id = overlay.id;
Я пытался выяснить, возможно ли сделать это за один проход. То есть, вычислите пересекающийся geom из таблицы Images
, выполните проверку ST_INTERSECTS
с результатом из предыдущего, и затем введите строку. Для этого потребуется двухпроходный подход к однопроходному.
До сих пор я пробовал варианты следующего, но безрезультатно. Любые предложения или ссылки на документы, которые могут подтолкнуть меня в правильном направлении, приветствуются.
INSERT INTO overlay(geom,intersections)
(SELECT ST_AsEWKB(geom) FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing((ST_DUMP(footprint_latlon)).geom) FROM images) AS the_geom)
as geom)),
(SELECT array_agg(images.id)
WHERE ST_INTERSECTS(geom, images.footprint_latlon) AS iid);