Trovare pseudo nodi nel software GIS gratuito?


16

Il software gvSIG OA Digital Edition 2010 ha una topologia di strumenti per la ricerca di pseudo nodi nella geometria lineare. Ho impostato la tolleranza del cluster 0,00002 e il numero massimo di errori -10000 per la geometria lineare conteggio collegamenti 20000. Ma risultato infruttuoso.

Esistono soluzioni che trovano pseudo nodi nel software GIS gratuito?

Ho bisogno di stratificare pseudo nodi (una soluzione a questo problema: utilizzare la topologia degli strumenti di ArcInfo, ma per me la priorità è usare il software libero). La geometria lineare ha creato diversi utenti in QGIS 1.8.0 nel database PostGIS (v. 2.0.1).

Aggiungi nuova immagine: 12 funzioni lineari con tre pseudo nodi in A (linea 4/5), B (linea 6/7), C (linea 9/10). Gli pseudo-nodi dovrebbero essere invece punti: due funzioni lineari con intersezione in un punto (nodo) dovrebbero essere una funzione lineare (linea 4/5 - linea 4, ...).

È possibile effettuare una richiesta in PostGIS, che si tradurrà in uno strato di pseudo nodi?

Aggiungi una nuova immagine di pseudo nodi di esempio: se ricevo per pseudo nodi di livello di punto di livello lineare (punti blu) ho corretto i seguenti errori nel livello lineare: A - aggiungi geometria mancante, B - linea spezzata nell'intersezione, C - rimuovi pseudo nodo.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


2
In GRASS esiste il comando rmdangle, ma di conseguenza shp-file senza pseudo nodi. Di conseguenza dovrebbe essere shp-file (o un altro) di pseudo nodi (come gvSIG OA Digital Edition 2010)
HasT

Usi PostGIS 2.0? In caso affermativo, provare le funzioni Is_Valid e Makevalid.
Giovanni Manghi,

Sì, utilizzo PostGIS 2.0. Come dovrei usare queste funzioni per la ricerca di pseudo nodi? È possibile trovarli con "PgQuery per QGIS"?
HasT

sì, puoi usarli all'interno di QGIS in qualsiasi strumento che ti consenta di eseguire una query PostGIS, come ad esempio DB Manager (che supporta l'evidenziazione della sintassi e il completamento automatico).
Giovanni Manghi,

il punto rosso nella seconda immagine è un'intersezione di due geometrie valide ... giusto?
Vinayan,

Risposte:


8

Ecco una soluzione generica, che puoi implementare con PostGIS o qualsiasi altro software conforme a OGC.

NOTA: come ho detto prima , un concetto chiave in FOSS e GIS è la standardizzazione : le migliori soluzioni adottano standard, come quelli OGC .


Il tuo problema è "trovare pseudo nodi" ... Ma penso che sia un po 'di più "trova nodi non pseudo e unisce linee di pseudo nodi". La mia soluzione può essere utilizzata per entrambi.

Gli standard OGC offrono:

  • ST_Boundary (geom) : per rilevare i nodi delle linee

  • ST_Dump (geom) : per inserire ogni singolo nodo in un record di tabella SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap possono essere utilizzati per la tolleranza di modifica. Sto usando ST_DWithin.

Possiamo supporre che il tuo problema principale possa essere specificato con questi oggetti e proprietà,

  • ci sono solo segmenti di linea (di una tabella di segmento ), rappresentate da una geometria LINESTRING ... non provato con MULTILNE, se avete GeometryType = MULTIPOINT, è possibile dividere e multilinee del cast con ST_Dump e ST_LineMerge;

  • ogni segmento di linea ha un gid (ID geometria) e un idline (ID colore) .

Quindi, il primo passo è ottenere i nodi che provengono dall'unione di linee,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

NOTA: utilizzo delle cache perché sono più veloci delle viste. Utilizzare "EXPLAIN SELECT ..." per controllare il tempo della CPU, può richiedere molto tempo.

Qui i cicli e le linee continue (dello stesso colore) vengono rilevate come ncolors=1punti e gli pseudo nodi per ncolors=2punti, quindi hai un livello con quei punti.

La tua tabella dei "buoni nodi" è con i "punti di demarcazione" originali e senza "pseudo nodi".

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

Grazie per la soluzione! Provo a eseguire query (in pgAdmin) ma ricevo un'eccezione: "funzione array_distinct (intero []) non esiste". Che cosa sto facendo di sbagliato?
HasT il

Spiacenti, la array_distinctfunzione non citata proviene da una libreria postgres.cz . Eventuali altri errori, si prega di segnalare, posso aggiungere ulteriori spiegazioni qui.
Peter Krauss,

Ho aggiunto la funzione array_distinct. Nel livello lineare del database hanno il nome della colonna della geometria "the_geom" (anziché "geom" nella query). Sostituisco "geom" a "the_geom" per "ST_Boundary (the_geom)" dopo l'esecuzione della query Ricevo il messaggio "colonna" geom "non esiste" in "come posto di colori, geom DA". Sostituisco "come colori, geom FROM" a "come colori, the_geom FROM", ma ricevo di nuovo il messaggio "colonna" the_geom "non esiste".
HasT

Ok, modificato (vedi risposta modificata) geomin the_geom. (ST_Dump (x)) resta come geom, non è un attributo del database.
Peter Krauss,

Grazie! La query funziona. Ho sostituito ST_DWithin su ST_equals e per ST_Buffer ho dato una tolleranza di 0,00002 DD. Di conseguenza ho ricevuto nodi corretti (dove in un nodo si intersecano 3 e più funzioni lineari). Voglio ricevere il risultato in cui in un nodo si intersecano 2 funzioni lineari (DA vw_joinnodes_full DOVE ncolors = 2;), ma livello di punti ricevuto in cui in un nodo interseca 2 e più funzioni lineari. Come si riceve il risultato in un nodo che interseca solo 2 funzioni lineari?
HasT

7

La ricerca di rifrazioni ha creato uno strumento di pulizia delle linee che sembra fare quello che vuoi.

Line Cleaner pulisce le reti semplificando geometrie complesse, cicliche, molto corte e di lunghezza zero, e rimuovendo pseudo-nodi e vertici insignificanti. Soprattutto, nella fase di pulizia, è in grado di garantire che le corrispondenze di funzionalità possano essere considerate automaticamente

inserisci qui la descrizione dell'immagine

Il codice sorgente è disponibile su GitHub.


Grazie per la risposta. Ma a causa di errori lo pseudo nodo ha bisogno di un livello punto. Questi errori devono essere corretti manualmente dagli utenti, in quanto vi sono momenti in cui in un nodo si intersecano tre linee, ma una delle linee ha saltato o non agganciato al vertice.
HasT

Sembra che dovrebbe funzionare. Hai difficoltà a capire esattamente cosa stai cercando di dire qui. "a causa di errori lo pseudo nodo ha bisogno di un livello punto" Non capisco cosa intendi con questo. Hai bisogno di uno strato di punti con punti fissati alla fine di ogni linea affinché funzioni?
Rayner,

@Rayner, aggiungi una nuova immagine di pseudo-nodi di esempio (3): se ricevo per pseudo-nodi di livello di punto lineare (punti blu) correggo manualmente (non automaticamente) i prossimi errori nel livello lineare: A - aggiungi geometria mancante, B - snapped linea nell'intersezione, C - rimuove lo pseudo nodo. Se sto riparando automaticamente pseudo nodi ho lasciato errori nei punti A, B.
HasT

Ok, capisco B e C. Quando dici "A - aggiungi geometria mancante" cosa significa? C'è un punto che deve essere aggiunto dove le 2 linee si incontrano?
Rayner,

@Rayner, significa che in "A" dovrebbe essere aggiunta la funzione lineare (strada / strada secondo le immagini). In А - il nodo è stato preparato per aggiungere una nuova geometria in base alle immagini, ma la geometria non è stata aggiunta (utilizzare pseudo nodi di livello non trovo la geometria dipinta)
HasT

2

Soluzione non gratuita: trasformatore FME + MRF + SmartCleaner

Soluzione gratuita GRASS v.clean (l'ultimo QGIS 1.8.0 con gli strumenti GRASS è il modo più semplice per utilizzarlo) e altri strumenti di pulizia della topologia


QGIS 1.8.0. Installare il plug-in SEXTANTE nella directory C: \ Programmi \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Carica file shp lineare nel progetto QGIS (livello CRS e progetto WGS1984, trasformazione "al volo" attivata). Quindi applico 'Definisci regione GRASS su tela' (comandi GRASS - Strumenti) ed eseguo il comando v.clean - rmdangle (Thershold = 0, inserisci dir / name per il vettore di output / errori). Dopo l'esecuzione del processo, viene visualizzato l'errore "Impossibile caricare il layer: D: /error.shp Controllare il registro SEXTANTE per verificare gli errori". Nel sommario è stato aggiunto un nuovo livello, livello con errori non caricati.
HasT

1
In GRASS esiste il comando v.build.polylines: ne ricevo uno da due righe che si intersecano in un vertice (pseudo nodo eliminato), ma questo comando non lo trovo nel plugin
SEXTANTE

@simplexio Puoi per favore suggerire quale opzione di v.clean può essere usata per identificare gli pseudo-nodi
osmjit

2

Ecco i passaggi per trovare i tuoi pseudo nodi usando OpenJump un GIS gratuito.
QGIS e gvSIG hanno il plugin Sextante, quindi questi stessi passaggi dovrebbero funzionare anche loro,
l'unione spaziale potrebbe essere leggermente diversa.
Ho usato la versione 1.2 per i test.

- salva gli endpoint di linea
Sextante toolbox, Topologia, Estrai endpoint di linee -> endpt_0

- unsplit your lines
Toolbox di Sextante, Strumenti per layer di linee, Unisci linee adiacenti

- salva gli endpoint di linea Unsplit
Toolbox di Sextante, Topologia, estrai punti finali di linea -> endpt_1

- i punti finali rimossi da "Unisci linee adiacenti" sono pseudo nodi

Strumenti, Query, Query spaziali,
Livello sorgente "endpt_0"
Relazione "Intersezioni"
Il livello maschera "endpt_1"

abilita o fa clic su Risultato del complemento


Grazie per la risposta! Sto provando a fare questi passi in QGIS Sextante, ma non trovo lì i comandi "Estrai punti finali di linee" e "Unisci linee adiacenti". È possibile aggiungere in QGIS Sextante (in gvSIG 1.12 questi comandi esistono) o il comando v.build.polylines?
HasT

Ho appena installato il plug-in sextante QGIS. Non vedo nemmeno le funzioni complete, molte mancano. Dovrebbe essere facile testare i passaggi in gvSIG su uno shapefile.
Klewis,

Ho appena verificato il flusso di lavoro sopra riportato in gvSIG 2.4.0.2834 e funziona benissimo. Ho sostituito il passaggio finale con altri due geoprocessi della casella degli strumenti: primo, il "Spatial Join" di gvSIG , secondo il "Livello vettoriale filtro" usando DIST > 0come espressione. Inoltre, tutti i geoprocessi possono essere concatenati in un modello SEXTANTE al fine di creare un nuovo strumento, ad esempio "Trova pseudonodi" .
Antonio Falciano,


1

Con PostGIS, è possibile utilizzare una versione modificata della query per trovare i ciondoli discussi in questo argomento , poiché gli pseudonodi sono nodi che intercettano 2 linee e i ciondoli sono nodi che intercettano 1 linea.

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
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.