Riportare gli attributi punti-toccanti-a-line al livello linee usando QGIS?


12

Sto usando QGIS 2.14.4-Essen. Ho due livelli:

  • points.shp che contiene punti con una colonna ANNO
  • lines.shp che contiene linee che collegano esattamente i punti da points.shp

Vorrei ottenere l'attributo YEAR da points.shp a lines.shp. Ogni linea è un singolo segmento con un punto ad ogni estremità (vedi figura sotto). Quello che vorrei ottenere è ANNO dal primo punto e ANNO dal secondo punto negli attributi di ciascuna riga.

Ad esempio: la riga 1 tocca un primo punto con ANNO = 2010 e un secondo punto con ANNO = 2011. Vorrei ripristinare qualcosa come "2010-2011" negli attributi della riga 1. Il risultato dovrebbe apparire così:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

inserisci qui la descrizione dell'immagine

C'è un modo per raggiungere questo obiettivo usando QGIS?

Risposte:


9

Sebbene la risposta di @radouxju sia valida, la spiegherò un po 'più in dettaglio.

  1. È necessario assicurarsi che la funzione polilinea sia divisa esattamente sopra le posizioni dei punti.
  2. Usa Join attribute by location. Scegli la linea di divisione in punti come livello di destinazione - nel mio caso la definisco "esplosa".
  3. Nella sezione di riepilogo, seleziona "Prendi un riepilogo della funzione di intersezione". Qui, invece di eseguire lo strumento due volte; uno per Min e un'altra volta per Max, puoi eseguirlo una volta e scegliere sia Min che Max.

inserisci qui la descrizione dell'immagine

  1. Il file out avrà il seguente attributo:

inserisci qui la descrizione dell'immagine

  1. Aggiungere un nuovo campo di tipo stringa con un nome "Anno" al nuovo file di forma dal passaggio 4.
  2. Usa il calcolatore di campo e vai per aggiornare il campo esistente. Seleziona "Anno" e scrivi la seguente espressione:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. L'attributo output finale sarà simile al seguente:

inserisci qui la descrizione dell'immagine

  1. L'output finale sarà così:

inserisci qui la descrizione dell'immagine


Ecco l'output dopo aver testato i tuoi dati:

inserisci qui la descrizione dell'immagine

La tabella a sinistra è i dati dei punti dopo aver creato un nuovo campo di tipo intero e la tabella a destra è dopo aver unito la linea con i dati dei punti utilizzando il passaggio 2 sopra menzionato. Quindi ho usato i passaggi 5-6 per creare i dati finali.

Aggiornare

Ho provato a convertire il campo ANNO da stringa a numero intero usando expression to_int () e ha funzionato. Quindi non è necessario farlo manualmente. Tuttavia, il tipo di campo dovrebbe essere di tipo Integerno Integer64. Assicurarsi che la lunghezza del campo sia fino a 9. Se si sceglie una lunghezza del campo di 10, verrà convertita in Interger64e non funzionerà Interger64. Quindi è possibile seguire la procedura dal passaggio 2-6

Ecco l'output finale dopo aver usato l'espressione to_int ():

inserisci qui la descrizione dell'immagine

Nella tabella degli attributi sopra a sinistra, YEAR è di tipo stringa e YEAR2 è di tipo numero intero convertito usando expression to_int (). Puoi vedere nella tabella degli attributi sulla destra dopo aver seguito i passaggi 2-6, ho ottenuto MINYEAR2 e MAXYEAR2, quindi convertito nuovamente in stringa per concatenare tutto insieme nel campo ANNO.


Molte grazie! Questo è esattamente quello che ho fatto più volte. Immagino che le caratteristiche della polilinea siano divise esattamente sopra le posizioni dei punti perché ho creato le linee dai livelli punti usando il plugin Points2One. Puoi provare con questo sottoinsieme di dati: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Grazie ancora!
Wiltomap,

Il campo ANNO nella tabella degli attributi è di tipo stringa. È necessario aggiungere un nuovo campo di tipo intero e inserire manualmente gli anni. Dopo aver creato il campo del tipo intero e aver salvato le modifiche, rimuovere il vecchio campo stringa. Quindi, seguire la procedura dettagliata sopra.
ahmadhanb,

Ho provato a convertire il campo ANNO da stringa a numero intero utilizzando expression to_int (), ma non ha funzionato. Quando ho inserito manualmente gli anni, ha funzionato come previsto.
ahmadhanb,

Spiegazione chiara @ahmadhanb
Shiko

Grazie @ahmadhanb! Il fatto è che i dati che ho condiviso sopra sono un sottoinsieme. Ho diverse migliaia di linee e punti, quindi inserire manualmente gli anni richiederà parecchio lavoro! è un insetto?
Wiltomap,

5

Quando unisci i punti di unione alla linea avrai più relazioni. Con "Unisci attributo per posizione", sarai in grado di chiedere un determinato metodo di riepilogo. Nel tuo caso, fallo due volte: una volta con il minimo e una volta con il massimo. Dopodiché puoi concatenare i due campi in un nuovo campo e finire con quello che ti serve.

inserisci qui la descrizione dell'immagine

Nel calcolatore di campo:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Questo metodo restituisce una colonna aggiuntiva denominata COUNTe contenente valore 2per ogni riga. Le opzioni Min e Max restituiscono queste informazioni. Ho selezionato il livello linee come livello target e il livello punti come livello join, giusto?
Wiltomap

è il tuo anno campo numerico o testo?
Radouxju,

Il YEARcampo è intero. Ho provato a creare una nuova colonna con to_string("YEAR")ma il risultato è esattamente lo stesso ...
wiltomap

Ho fatto un rapido test per assicurarmi (QGIS 2.8.3) e ha funzionato. Se il tuo conteggio è 2, significa che hai 2 punti per ogni segmento, il che è corretto. Ma con me ho i valori dell'attributo MINYEAR MAXYEAR nel nuovo vettore di linea creato dall'unione spaziale. Non capisco perché non funzioni nel tuo caso. Potresti provare con un altro file?
Radouxju,

4

Supponendo che la topologia sia perfetta, creando un campo "WKT" con l'espressione

geom_to_wkt( $geometry) 

nel tuo livello punti, puoi usare l'espressione:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

nel calcolatore di campo del layer pipe, creando una stringa di testo.

  • attributo (feature, nome_attributo) Restituisce il valore di un attributo specificato da una funzione, qui, l'anno della funzione punto
    ottenuta.
  • get_feature (layer, attributo, valore) restituisce la prima funzione di un layer corrispondente a un determinato valore di attributo. Qui controlliamo se possiamo trovare un punto con le stesse coordinate (in formato WKT) di
    quelle dei vertici di inizio e fine della linea.
  • start_point (geometria) restituisce il primo nodo da una geometria. Ecco il primo vertice della tua linea.
  • end_point (geometria) restituisce l'ultimo nodo da una geometria. Ecco l'ultimo vertice della tua linea.
  • geom_to_wkt (geometria) restituisce la rappresentazione del testo ben noto (WKT) della geometria. inserisci qui la descrizione dell'immagine

Potresti anche aggiornarlo a:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

per mostrare solo un anno se sono collegati due punti con lo stesso anno (ottenendo 200X anziché 200X-200X).

Il vantaggio principale di questo metodo è che se i tuoi dati cambiano nei tuoi punti, puoi aggiornarli molto velocemente con un solo calcolatore di campo.
Puoi anche aggiungere questa regola come Autofield quando crei nuove linee.
Saluti,

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.