Come raggiungere l'equivalente di Dissolve da ArcGIS per desktop usando ST_Union?


11

Sto cercando di ottenere un equivalente allo strumento Dissolve di ArcGIS per desktop usando ST_Union di PostGIS ma sembra che non stia ottenendo il risultato atteso.

Ho una tabella che ha determinati attributi con la geometria poligonale. (come FID, Locstat, Loccnt, Shape)

Ecco la mia domanda:

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

1
Puoi spiegare quali risultati ti aspetti e cosa stai ottenendo? In esecuzione: SELECT AsText (ST_Union ...) FROM ... potrebbe aiutare a trovare l'errore.
Micha,

Nella tabella ho 6842 record, secondo i risultati ArcGIS dovrei ottenere 1683 record dove usando la query ottengo 6842 record. Ho anche provato ST_Aggr_Union che mi dà 742 record con la geometria nulla multipla.
Dhams,

Risposte:


14

Il tuo problema è probabilmente a causa di ciò che hai incluso nel gruppo per campo.

ST_UNION è una funzione aggregata, il che significa che si sta dissolvendo in base a ciò che si specifica come GROUPparametro.

Ecco cosa hai inserito:

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

Secondo questo, stai raggruppando per tuo fid, che è probabilmente un identificatore univoco, e anche per boundaryshape, che è la geometria. Il problema è che è altamente improbabile che le caratteristiche che condividono un ID univoco abbiano geometrie identiche. Pertanto, ST_Unionprobabilmente finirà con qualcosa di simile al seguente:

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

In questo caso, dovresti dissolverti solo in base al tuo identificativo univoco, a meno che tu non abbia effettivamente un numero di geometrie duplicate con lo stesso fid, di cui stai cercando di sbarazzarti. Anche in quella situazione, tuttavia, dovresti solo raggruppare in base a fid, e l'unione si occuperà della duplicazione della geometria.

Vorrei provare quanto segue:

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

Ciò dovrebbe darti il ​​risultato desiderato di dissolvere tutte le funzionalità in base all'attributo comune fid.

Ecco il documento di aiuto sul sito PostGIS: ST_Union

Vedi il primo esempio elencato in basso e nota che non include la geometria nel gruppo per sezione.


1
In alcuni casi, è meglio agganciare le geometrie alla griglia prima di eseguire l'unione: SELECT ST_Union (ST_SnapToGrid (geom, 0.0001)) FROM geo_area group by level_identifier;
Maxim Eliseev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.