2014-11-22 7 views
3

У меня есть следующие полигоны в PostGISКак объединить соседние многоугольники с одним полигоном и сохранить данные min/max?

enter image description here

Каждый многоугольник имеет поле со значением "Data". Я хотел бы, чтобы автоматическое слияние полигонов, которые касаются друг друга: 1-2 и 3-4-5-6-7

Также, если возможно, я хотел бы иметь значения Мин/Макс из столбцов каждого полигон сведен к новому полигону

Id Data Geom 
1 8.45098 MULTIPOLYGON(((178253.411393551 665205.232423685,178248.411393552 665205.232423685,178248.411393552 665210.232423684,178253.411393551 665210.232423684,178253.411393551 665205.232423685))) 
2 10.7918 MULTIPOLYGON(((178258.411393551 665205.232423685,178253.411393551 665205.232423685,178253.411393551 665210.232423684,178258.411393551 665210.232423684,178258.411393551 665205.232423685))) 
3 10.7918 MULTIPOLYGON(((178263.411393552 665185.232423682,178258.411393551 665185.232423682,178258.411393551 665190.232423685,178263.411393552 665190.232423685,178263.411393552 665185.232423682))) 
4 10.4139 MULTIPOLYGON(((178268.411393553 665185.232423682,178263.411393552 665185.232423682,178263.411393552 665190.232423685,178268.411393553 665190.232423685,178268.411393553 665185.232423682))) 
5 7.448 MULTIPOLYGON(((178263.411393552 665180.232423684,178258.411393551 665180.232423684,178258.411393551 665185.232423682,178263.411393552 665185.232423682,178263.411393552 665180.232423684))) 
6 10.2318 MULTIPOLYGON(((178268.411393553 665180.232423684,178263.411393552 665180.232423684,178263.411393552 665185.232423682,178268.411393553 665185.232423682,178268.411393553 665180.232423684))) 
7 10.998 MULTIPOLYGON(((178263.411393552 665175.232423685,178253.411393551 665175.232423685,178253.411393551 665180.232423684,178258.411393551 665180.232423684,178263.411393552 665180.232423684,178263.411393552 665175.232423685))) 
8 10.7548 MULTIPOLYGON(((178263.411393552 665175.232423685,178253.411393551 665175.232423685,178253.411393551 665180.232423684,178258.411393551 665180.232423684,178263.411393552 665180.232423684,178263.411393552 665175.232423685))) 

Что будет самый простой способ сделать это (я имею мало знаний в QGIS/ArcMap и лучшее знание с PostGIS)?

+0

Я обновил свой первоначальный неправильный ответ. Я отправил, не проверяя, как не перед компьютером, извините за это. –

+0

Спасибо за ваше время, чтобы ответить на это, я довольно новичок в postgres, и синтаксис настолько странный (пришел из mssql), я рассмотрю его позже. Thx !!!! – Alophind

+0

:-) Я также пришел из MySQL, поэтому понимаю, откуда вы пришли, синтаксис - это странный комментарий. Для пространственных (и немало других вещей) Postgres/Postgis удаляет MySQL из воды, как только вы привыкнете к нему. Для чего это стоит, такие вещи, как CTE (с запросами), поддерживаются в Oracle и SQL Server, так что это действительно MySQL, который является странным. –

ответ

6

Единственный способ, которым я мог понять, как это сделать, заключался в создании таблицы объединенных геометрий в CTE, используйте ST_Dump для создания отдельных полигонов (то есть 1-2 и 3-4-5-6 в вашем вопрос), а затем выберите значения max и min атрибутов данных из исходной таблицы (которые я назвал многоугольниками, так как вы не указали имя), которые пересекаются с новыми объединенными геометриями и группируются по тому же новому объединенному геометрий.

WITH geoms (geom) as 
    (SELECT (ST_Dump(ST_Union(geom))).geom from polygons) 
SELECT max(data), min(data), g.geom 
    FROM polygons p, geoms g 
    WHERE St_Intersects(s.geom, g.geom) 
    GROUP BY g.geom; 

Если вы хотите сохранить это в новую таблицу, а затем добавить CREATE TABLE new_table AS перед WITH. Там может быть более эффективный способ, но это работает. В вашем вопросе ваши входные многоугольники являются MutliPolygons, поэтому, если вы хотите это также на выходе, добавьте ST_Multi перед новой объединенной геометрией. Сложив все это, вы получите что-то вроде:

CREATE TABLE Unioned_geometries AS 
    WITH geoms (geom) as 
    (SELECT (ST_Dump(ST_Union(geom))).geom from polygons) 
    SELECT max(data), min(data), ST_Multi(g.geom) 
    FROM polygons p, geoms g 
    WHERE St_Intersects(s.geom, g.geom) 
    GROUP BY g.geom;