Як досягти еквівалента Dissolve з ArcGIS для 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;

1
Чи можете ви пояснити, яких результатів ви очікуєте і що ви отримуєте? Запуск: SELECT AsText (ST_Union ...) FROM ... може допомогти знайти помилку.
Micha

У таблиці я 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)) від групи geo_area за рівнем_identifier;
Максим Єлісєєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.