PostGIS эквивалент ArcMap Union - PullRequest
0 голосов
/ 13 ноября 2018

Что эквивалентно в PostGIS / PostgreSQL операции "Union" в ArcMap?

Допустим, у вас есть два шейп-файла с двумя объектами в каждом.(Эквивалент PostGIS: две таблицы с двумя строками с геометрией многоугольника)

enter image description here

, тогда результатом будет 1 шейп-файл с 7 объектами.(PostGIS-эквивалент: таблица с 7 строками с геометриями)

enter image description here

Я смотрел на ST_Intersect, ST_Union и ST_Collect, но не могу найти правильную комбинацию,Ваша помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Большое спасибо Майклу Энтину

-- input data
with polys1 AS (
  SELECT 1 df1, ST_GeogFromText('Polygon((0 0, 2 0, 2 2, 0 2, 0 0))') g
  UNION ALL
  SELECT 2, ST_GeogFromText('Polygon((2 2, 4 2, 4 4, 2 4, 2 2))')
),
polys2 AS (
  SELECT 1 df2, ST_GeogFromText('Polygon((1 1, 3 1, 3 3, 1 3, 1 1))') g
  UNION ALL
  SELECT 2, ST_GeogFromText('Polygon((3 3, 5 3, 5 5, 3 5, 3 3))')
),
-- left and right unions
union1 AS (
  SELECT ST_UNION_AGG(g) FROM polys1
),
union2 AS (
  SELECT ST_UNION_AGG(g) FROM polys2
),
-- various combinations of intersections
pairs AS (
  SELECT df1, df2, ST_INTERSECTION(a.g, b.g) g FROM polys1 a, polys2 b WHERE ST_INTERSECTS(a.g, b.g)
  UNION ALL
  SELECT df1, NULL, ST_DIFFERENCE(g, (SELECT * FROM union2)) g FROM polys1
  UNION ALL 
  SELECT NULL, df2, ST_DIFFERENCE(g, (SELECT * FROM union1)) g FROM polys2
)
SELECT * FROM pairs WHERE NOT ST_IsEmpty(g)
0 голосов
/ 14 ноября 2018

Вот рабочий запрос, основанный на этом ответе от gis.stackexchange :

Прочитайте это от a) до d):

-- d) Extract the path number and the geom from the geometry dump
SELECT
  (dump).path[1] id,
  (dump).geom
FROM
(
  -- c) Polygonize the unioned rings (returns a GEOMETRYCOLLECTION)
  --    Dump them to return individual geometries
  SELECT
    ST_Dump(ST_Polygonize(geom)) dump
  FROM
  (
    -- b) Union all rings in one big geometry
    SELECT
      ST_Union(geom) geom
    FROM
    (
      -- a) First get the exterior ring from all geoms
      SELECT
        ST_ExteriorRing(geom) geom
      FROM
        rectangles
    ) a
  ) b
) c

Результат:

Rectangles

...