Intersezioni automatiche ad anello in PostGIS


10

Questo è il seguito della domanda precedente . Vedrai che sono un nuovo utente PostGIS.

Ho esaminato la validità della topologia nei miei dati e ho trovato circa 1700 problemi di topologia nel set di dati di landcover (poligono). Questi sono tutti "Ring Self_intersection".

Utilizzando alcune informazioni utili in questa presentazione di Paul Ramsay (pagina 20), ho tentato di bufferizzare i miei dati di conseguenza:

UPDATE schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false e isvalid (buffer (the_geom, 0.0)) = true;

Ma ho la risposta:

AVVISO: anello Autointersezione nel punto o vicino (modificato) ERRORE: nuova riga per la relazione "sgm_buffer" viola il vincolo di controllo "enforce_geotype_the_geom"

********** Errore **********

ERRORE: nuova riga per la relazione "sgm_buffer" viola il vincolo di controllo "enforce_geotype_the_geom" Stato SQL: 23514

Ho anche provato solo:

AGGIORNAMENTO csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)

e prendi:

ERRORE: nuova riga per la relazione "sgm_buffer" viola il vincolo di controllo "enforce_geotype_the_geom"

********** Errore **********

ERRORE: nuova riga per la relazione "sgm_buffer" viola il vincolo di controllo "enforce_geotype_the_geom" Stato SQL: 23514

Quindi suppongo che questa tecnica di buffer non funzionerà sui miei problemi? O sto facendo qualcosa di sbagliato?

Il signor Ramsay prosegue quindi nello stesso documento per suggerire una tecnica aggiuntiva per affrontare i poligoni "figura di 8". Non capisco del tutto come scriverlo per intero nel codice (o cosa sta facendo e se mi aiuterà):

SELECT ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))'

Quindi .... qualcuno può aiutare? Questo si sta rivelando un vero incubo con i miei tempi stretti e le mie competenze limitate in PostGIS.


1
cosa restituisce "select geometry_type (the_geom) da sgm_buffer limit 1"? Inoltre, in relazione all'autonomia di 40 ore menzionata nell'altra domanda, ci sono degli indici spaziali definiti sulla tua tabella?
diciu,

Potresti aver bisogno di un ST_Multi()per forzare tutti i poligoni a essere MULTIPOLYGONs (questo è un presupposto)
Mike T,

Grazie per i commenti - diciu Penso che ci siano indici, sembrano essere visibili in pgAdminIII, ma forse devo aggiornarli? Potrei scoprire le soluzioni per accelerare la query: non so quale sarebbe un tempo ragionevole per l'esecuzione? Landcover ha circa 20 milioni di funzioni.
ESRIHelp

Risposte:


12

Penso che ciò che sta accadendo sia che i poligoni che si intersecano da soli diventano MULTIPOLIGONI durante il buffering.

hai due opzioni:

1 rimuovi il vincolo "enforce_geotype_the_geom", puoi farlo in pgAdmin
2 inserisci il risultato in una nuova tabella invece di aggiornare la vecchia. questo è spesso un buon modo di fare le cose perché non cambi nulla nella tabella originale. la query può assomigliare a:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

ovviamente potresti voler portare più campi nel tuo nuovo tavolo.

prova prima il trucco del buffer. Nel secondo approccio, Paul può dire a se stesso che influenza ha il vuoto lineare. Non ricordo come accada quella magia.


0

Ho avuto gli stessi problemi qualche mese fa. Avevo poligoni nel mio database con molte autointersezioni. Ho usato il metodo di Niklas Aven, ma non ha funzionato. Ho anche usato altri metodi.

Il mio metodo è rimuovere l'autointersezione dai miei poligoni. Ecco la query SQL che ho usato:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

Ho calcolato l'area del poligono e l'autointersezione e manterrò solo i poligoni che hanno un'area> 1. 1è la tolleranza perché l'area dell'autointersezione è molto piccola. Si noti inoltre che la trasformazione dell'SRID in metri è importante se si dispone di dati in gradi.

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.