PostgreSQL Вставить строку из 2 запросов, где одно значение является производным от другого - PullRequest
2 голосов
/ 10 июня 2019

У меня есть таблица, Images, которую я использую (с PostGIS) для вычисления перекрывающихся полигонов. Изображение ниже показывает супер простой пример.

enter image description here

Результаты геометрии этого пространственного запроса помещаются в столбец 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);
...