Confronta linee simili e aggiorna i livelli


16

Qui ci sono due livelli con la rappresentazione delle strade e l'idea è: vogliamo aggiornare il livello più recente (con la linea rossa) con alcuni dei dati memorizzati nell'altro (il blu chiaro), ma questi livelli sono simile nella posizione geografica che può essere molto vicino e un po 'più distante a seconda del luogo nella mappa e solo un attributo corrisponde nel caso in cui una linea sia la stessa nell'altra (codlog x codlog5).

Livelli Qgis.

Ad esempio: al centro dell'immagine, c'è un quadrato in entrambi i livelli, ma come posso fare nella mappa per riconoscere quello blu è lo stesso di quello verde e aggiornare il livello recente?

Come posso farlo? C'è qualche plugin o strumento che aiuta con esso?


Vuoi aggiornare il livello rosso con gli attributi del livello blu o con funzionalità aggiuntive dal livello blu?
dmh126,

Gli attributi. Situazione: il livello rosso contiene le colonne (a, b, c, d) e quello blu le colonne (d, e, f). Voglio aggiungere nel livello rosso le colonne (e, f) dell'altro livello e i risultati corrispondenti.
Jhonatan Oliveira,

C'è della documentazione qui per un plugin di conflazione. Non sono sicuro se lo sviluppo è stato completato.
Barbarossa,

1
hai provato a saltare?
Radouxju,

Ma la colonna "d" della linea blu e la "d" di quella rossa sono un ID comune unico? Cosa contengono?
Sergio,

Risposte:


6

Questa è un'ottima domanda, ho dovuto fare qualcosa di simile di recente ma con un set di dati molto più piccolo, quindi sono stato in grado di utilizzare un semplice incrocio con qualche controllo di qualità visiva extra e andava bene.

Ma ecco un'idea per questo, anche se non ho codice, ed è una specie di processo pesante. Sicuramente prova prima con un campione dall'insieme di dati completo. Probabilmente puoi trovare del codice utile qui. (Il rientro è diventato un po 'strano di seguito.):

  1. prendi il buon set di geometrie (dove vuoi che finiscano gli attributi) e creane un buffer *

  2. scorrere attraverso ciascuna delle funzionalità del buffer:

    2a. calcola l'orientamento generale della funzione (max_y - min_y / max_x - min_x o qualcosa del genere)

    2b. effettuare una query di selezione per posizione sull'altro livello utilizzando questa singola funzione

    1. avrai più di una funzione che corrisponde alla query di selezione per posizione, quindi esegui l'iterazione di queste funzionalità selezionate e calcola l'orientamento di ciascuna

    2. ottenere gli attributi da qualunque funzione abbia un orientamento più vicino a quello della funzione buffer.

* Vorrei iniziare con una distanza molto piccola (un'unità della mappa o qualcosa del genere) e quindi eseguire questo processo con distanze crescenti, facendo attenzione a non sovrascrivere gli attributi già trasferiti.

** Probabilmente potresti probabilmente rinunciare a creare le funzionalità del buffer ed eseguire semplicemente la query di selezione in base alla posizione con una distanza del buffer in essa. Non conosco molto bene QGIS, ma sono sicuro che saresti in grado di farlo.

Non è possibile che funzioni perfettamente con tutte le tue funzionalità, ma è un inizio e quindi si riduce allo sviluppo di una buona strategia di controllo qualità / controllo qualità per il controllo e il completamento del trasferimento.

MODIFICA A questo proposito, ecco un esempio di base che romperebbe completamente il sistema se si stesse iniziando con una distanza del buffer molto piccola e scegliendo la funzione con l'orientamento migliore corrispondente come ho raccomandato:

inserisci qui la descrizione dell'immagine

Verranno presi gli attributi dalla linea rossa sbagliata. Per evitare ciò, potresti voler creare una sorta di tolleranza e assumere gli attributi della funzione solo se il suo orientamento (rispetto all'orientamento della funzione blu originale) rientra in quella tolleranza.

EDIT 2 Oops, sono questi poligoni? Immagino di aver appena pensato che fossero linee su uno sfondo grigio. Se sono poligoni, non so davvero se questo concetto di orientamento sia valido. Ma potresti selezionare tutte le caratteristiche che si intersecano e capire quale ha la maggior sovrapposizione (esegui uno strumento di tipo Unione, quindi usa il poligono con l'area più grande ...).


Questa logica è sana. Ho usato un approccio simile in C # / ArcObjects per copiare gli attributi da un set di dati impreciso con attributi in un set di dati accurato senza attributi ... corretto al 95%. Il controllo / fissaggio manuale era necessario in aree ristrette, ma era certamente più veloce che farlo tutto manualmente.
Michael Stimson,

2

Se si desidera aggiungere alcuni attributi dal livello rosso al livello blu e un attributo è comune in entrambi i livelli, è necessario utilizzare Aggiungi unione vettoriale .

Ne ho scritto qui .

  1. Fai clic con il pulsante destro del mouse sul livello del file di forma rosso nel pannello Livello e scegli Proprietà .
  2. Quindi vai a Join scheda .
  3. Premi + pulsante , creerà un nuovo join.
  4. Unisci livello è il tuo livello forma rosso. Il campo Join è field con i valori comuni in entrambi. Il campo target è il campo a cui vuoi unirti dal livello blu.
  5. Successivamente otterrai un nuovo attributo nella tabella dei tuoi shapefile.

Questo è tutto.

Ecco un esempio con gli screenshot.


1

Preferisco di gran lunga la risposta di @ dmh126 poiché il suo metodo consente di aggiornare il tuo livello red_line abbastanza facilmente.

Solo per aggiungere un'alternativa, è possibile utilizzare lo strumento tabella degli attributi Join dalla Casella degli strumenti di elaborazione e selezionare i livelli con il campo comune. Si noti che questo metodo crea un nuovo shapefile invece di aggiornarne uno esistente:

Unisci la tabella degli attributi


0

Se hai un ID univoco in entrambi i livelli che puoi usare per unire facilmente i valori a un nuovo livello da quello vecchio, è un gioco da ragazzi. Ma questo non sembra così.

In caso contrario, è un problema piuttosto difficile. Mi chiedo perché il commento di user30184 che suggerisce di usare OpenJUMP e il plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher non sia stato pubblicato come risposta perché in questo caso mi sembra del tutto legittimo.

Altrimenti non penso che tu possa farlo senza un po 'di codice. Con QGIS puoi usare perfettamente e quando combini buffering e intersecando dovresti essere in grado di fare un controllo automatico significativo.

Un approccio potrebbe essere quello di confrontare alcuni buffer ragionevolmente grandi di linee rosse con linee blu e ottenere attributi di corrispondenza e rapporto di quanto è corrispondente. In pseudo-codice:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
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.