Jak osiągnąć odpowiednik Dissolve z ArcGIS na komputer przy użyciu ST_Union?

11

Próbuję osiągnąć odpowiednik narzędzia Dissolve z ArcGIS dla komputerów stacjonarnych za pomocą ST_Union z PostGIS, ale wydaje się, że nie otrzymuję oczekiwanego rezultatu.

Mam jedną tabelę, która ma pewne atrybuty z geometrią wielokąta. (jak FID, Locstat, Loccnt, Shape)

Oto moje zapytanie:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;
Dhams
źródło
1
Czy możesz wyjaśnić, jakich rezultatów oczekujesz i co osiągasz? Uruchamianie: SELECT AsText (ST_Union ...) OD ... może pomóc w znalezieniu błędu.
Micha
W tabeli mam 6842 rekordy, zgodnie z wynikami ArcGIS powinienem uzyskać 1683 rekordy, a za pomocą zapytania otrzymuję 6842 rekordy. Próbowałem także ST_Aggr_Union, który daje mi 742 rekordy z wieloma zerowymi geometriami.
Dhams

Odpowiedzi:

14

Twój problem prawdopodobnie wynika z tego, co umieściłeś w grupie według pola.

ST_UNION jest funkcją agregującą, co oznacza, że ​​rozpuszcza się na podstawie tego, co podasz jako GROUPparametr.

Oto, co wpisałeś:

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

Zgodnie z tym grupujesz według swojego fid, który jest prawdopodobnie unikalnym identyfikatorem, a także według boundaryshape, która jest geometrią. Problem polega na tym, że jest mało prawdopodobne, aby funkcje o unikalnym identyfikatorze miały identyczną geometrię. Dlatego ST_Unionprawdopodobnie zakończy się czymś takim:

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

W takim przypadku powinieneś rozpuścić się na podstawie swojego unikalnego identyfikatora, chyba że faktycznie masz wiele zduplikowanych geometrii o tej samej nazwie fid, których próbujesz się pozbyć. Nawet w tej sytuacji powinieneś tylko grupować w oparciu o fid, a związek zajmie się duplikacją geometrii.

Spróbowałbym następujących rzeczy:

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

To powinno dać pożądany rezultat rozpuszczenia wszystkich funkcji w oparciu o wspólny atrybut fid.

Oto dokument pomocy na stronie PostGIS: ST_Union

Zobacz pierwszy przykład wymieniony na dole i zauważ, że nie obejmuje on geometrii w grupie według sekcji.

Uzyskaj przestrzenny
źródło
1
W niektórych przypadkach lepiej jest przyciągać geometrie do siatki przed wykonaniem unii: SELECT ST_Union (ST_SnapToGrid (geom, 0.0001)) Z grupy geo_area według identyfikatora poziomu;
Maxim Eliseev