Как получить эквивалент Dissolve из ArcGIS for Desktop с помощью ST_Union?

11

Я пытаюсь получить эквивалент инструмента Dissolve из ArcGIS for Desktop, используя ST_Union из PostGIS, но, похоже, я не получаю ожидаемого результата.

У меня есть одна таблица, которая имеет определенные атрибуты с геометрией многоугольника. (например, FID, Locstat, Loccnt, Shape)

Вот мой запрос:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;
Dhams
источник
1
Можете ли вы объяснить, каких результатов вы ожидаете и что получаете? Запуск: SELECT AsText (ST_Union ...) FROM ... может помочь найти ошибку.
Миха
В таблице у меня 6842 записи, согласно результатам ArcGIS я должен получить 1683 записи, где по запросу я получаю 6842 записи. Я также попробовал ST_Aggr_Union, который дает мне 742 записи с множественной нулевой геометрией.
Дхамс

Ответы:

14

Вероятно, ваша проблема связана с тем, что вы включили в группу по полю.

ST_UNION - это агрегатная функция, означающая, что она растворяется в зависимости от того, что вы указали в качестве GROUPпараметра.

Вот что вы ввели:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;

В соответствии с этим, вы группируете по вашему fid, который, вероятно, является уникальным идентификатором, а также по boundaryshape, который является геометрией. Проблема в том, что крайне маловероятно, что функции, имеющие общий идентификатор, будут иметь одинаковую геометрию. Поэтому, ST_Unionвероятно, в итоге получится что-то вроде следующего:

Input:   
fid     boundaryshape  
1         11  
1         12  
1         11  
1         13  
2         12  
2         13  
2         12  
3          5  
3          2  
3          4  

Output:  
fid     boundaryshape  
1        (11 + 11)  
1        12  
1        13  
2        (12 + 12)  
2        13  
3        2  
3        4  
3        5

В этом случае вы должны распускаться только на основе вашего уникального идентификатора, если только у вас на самом деле нет нескольких дубликатов геометрии с тем же fid, от которого вы пытаетесь избавиться. Но даже в этой ситуации вам нужно будет группировать только на основе fid, и объединение позаботится о дублировании геометрии.

Я бы попробовал следующее:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c GROUP BY c.fid;

Это должно дать вам желаемый результат растворения всех функций на основе общего атрибута fid.

Вот справочный документ на сайте PostGIS: ST_Union

Посмотрите на первый пример, приведенный внизу, и обратите внимание, что он не включает геометрию в группе по разделам.

Получить Пространственный
источник
1
В некоторых случаях перед привязкой лучше привязать геометрию к сетке: SELECT ST_Union (ST_SnapToGrid (geom, 0.0001)) FROM geo_area group by level_identifier;
Максим Елисеев