In PostGIS esiste una funzione dissolve diversa da st_union?


22

Sto cercando una funzione per dissolvere i confini condivisi tra le funzioni poligonali in una tabella. ST_UNION () fa quasi quello che sto cercando, ma crea un multipoligono da tutti i poligoni nel livello indipendentemente dal fatto che condividano o meno un confine comune. Preferirei solo dissolvere i confini tra poligoni che si toccano. Ho pensato che dovrebbe esserci un modo per usare ST_TOUCHES () ma poi la necessità di una funzione dissolve sembra così comune che sarei sorpreso se non ci fosse una funzione integrata per raggiungere questo obiettivo.

Il caso d'uso è simile al seguente: ho scaricato i dati di Corine Landcover per un grande paese europeo e desidero dissolvere i confini tra diversi tipi di foreste (circa 75.000 poligoni in una tabella). Ho provato ST_UNION, ma mi manca un errore "memoria insufficiente" (30.000 poligoni hanno funzionato):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

Nota: tutti i codici foresta iniziano con '31' e sto usando PostGIS 1.4, versione GEOS: 3.2.0-CAPI-1.6.0

Risposte:


21

ST_MemUnion () eseguirà un processo intuitivo e lento per la memoria. Puoi provare che, se il tuo problema è abbastanza piccolo, potrebbe finire in un lasso di tempo ragionevole. Puoi anche solo dividere il tuo problema a metà, quindi eseguire le metà insieme. Poiché i risultanti avranno molti meno punti rispetto agli input, potresti riuscire ad adattare l'intero problema alla memoria in quel modo. Oppure usa la veloce routine della memoria affamata a metà e la più lenta nella fusione finale.


4
Fantastico averti qui, Paul, grazie per averti offerto un'esperienza incomparabile.
fmark

1
Grazie, sembra che il mio problema non sia abbastanza piccolo. ST_MemUnion () è in esecuzione da 24 ore. Proverò a dividere il problema.
underdark

5

Credo che ST_Dump sia quello che vuoi:

ST_Dump :

Restituisce un insieme di righe geometry_dump (geom, path), che compongono una geometria g1 .... Ad esempio, può essere utilizzato per espandere MULTIPOLYGONS in POLYGONS. ...

Quindi per il tuo caso:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

Non sono sicuro di come interagirà con la creazione della tabella che stai cercando di fare, ma dovrebbe darti le geometrie come voci separate. Saresti quindi in grado di fare un join spaziale (usando && e ST_Contains) tra le due tabelle per raccogliere i dati sulle geometrie.


2
Nota: questo sarà utile solo se si gestiscono i problemi di memoria di ST_Union! :)
yhw42,

4

PostGIS è compilato con GEOS 3.1.0+? Per quella versione, un'unione in cascata molto più veloce stata implementata , ma se non trovata userà il codice più vecchio che è più lento degli ordini di grandezza.

Aggiornamento : sembra che PostGIS stia utilizzando l'approccio sindacato in cascata, ma la fame di memoria è reale. Proverei ad aumentare la memoria disponibile per l'istanza di Postgres, ecco alcuni consigli del discorso PostGIS FOSS4G di Paul Ramsey del 2007 :

  • L'accesso al disco è lento, quindi è possibile ottenere prestazioni più elevate utilizzando più memoria per memorizzare nella cache i dati!
    • Aumentare shared_buffers
    • RAM fisica - Sistema operativo richiesto * 75%
  • L'ordinamento è più veloce in memoria
    • Aumentare work_mem
  • La pulizia del disco è più veloce con più memoria
    • Aumentare maintenance_work_mem
  • Allocato per connessione
  • Anche
    • Aumentare wal_buffers
    • Aumentare checkpoint_segments
    • Diminuire random_page_cost

Nel tuo caso, proverei ad aumentare shared_buffers, la raccomandazione generale è il 25% della memoria disponibile per un server di database, ma prova ad aumentarla a 3-4 volte il suo valore attuale e vedendo se si completa.


postgis_geos_version () restituisce: 3.2.0-CAPI-1.6.0 ... Immagino che vada bene. Proverò ST_Collect, grazie.
underdark

Bene, ST_Collect non sembra dissolvere alcun confine e crea anche un multipoligono gigante.
underdark

sì, ho letto male la pagina per ST_Collect. Ho aggiornato la mia risposta per fornire consigli più specifici sull'ottimizzazione dell'utilizzo della memoria di Postgres.
scw,
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.