Erhalten Sie mithilfe von QGIS Punkte, die eine Linie berühren, zurück zur Linienebene?


12

Ich benutze QGIS 2.14.4-Essen. Ich habe zwei Schichten:

  • points.shp, das Punkte mit einer YEAR-Spalte enthält
  • lines.shp, die Linien enthält, die die Punkte von points.shp genau verbinden

Ich möchte das YEAR-Attribut von points.shp zurück zu lines.shp erhalten. Jede Linie ist ein einzelnes Segment mit einem Punkt an jedem Ende (siehe Bild unten). Was ich erhalten möchte, ist JAHR vom ersten Punkt und JAHR vom zweiten Punkt zurück in jedes Linienattribut.

Zum Beispiel: Zeile 1 berührt einen ersten Punkt mit YEAR = 2010 und einen zweiten Punkt mit YEAR = 2011. Ich möchte etwas wie '2010-2011' in die Attribute von Zeile 1 zurückbringen. Das Ergebnis sollte folgendermaßen aussehen:

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

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, dies mit QGIS zu erreichen?

Antworten:


9

Obwohl die Antwort von @radouxju gültig ist, werde ich sie etwas detaillierter erklären.

  1. Sie müssen sicherstellen, dass das Polylinien-Feature genau über den Punktpositionen aufgeteilt ist.
  2. Verwenden Sie Join attribute by location. Wählen Sie die Funktion für geteilte Linien an Punktpositionen als Zielebene - in meinem Fall nenne ich sie "explodiert".
  3. Wählen Sie im Abschnitt "Zusammenfassung" die Option "Zusammenfassung der sich überschneidenden Funktion erstellen". Hier, anstatt das Tool zweimal auszuführen; eine für Min und eine andere für Max. Sie können sie einmal ausführen und sowohl Min als auch Max auswählen.

Geben Sie hier die Bildbeschreibung ein

  1. Die out-Datei hat das folgende Attribut:

Geben Sie hier die Bildbeschreibung ein

  1. Fügen Sie dem neuen Shapefile ab Schritt 4 ein neues Feld vom Typ string mit dem Namen "Year" hinzu.
  2. Verwenden Sie den Feldrechner und aktualisieren Sie das vorhandene Feld. Wählen Sie "Jahr" und schreiben Sie den folgenden Ausdruck:

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

  3. Das endgültige Ausgabeattribut sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

  1. Die endgültige Ausgabe sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein


Hier ist die Ausgabe nach dem Testen Ihrer Daten:

Geben Sie hier die Bildbeschreibung ein

Die Tabelle links enthält die Punktdaten nach dem Erstellen eines neuen Felds vom Typ Integer, und die Tabelle rechts enthält die Verbindung der Linie mit Punktdaten unter Verwendung des oben genannten Schritts 2. Dann habe ich die Schritte 5-6 verwendet, um die endgültigen Daten zu erstellen.

Aktualisieren

Ich habe versucht, das Feld YEAR mit dem Ausdruck to_int () von einer Zeichenfolge in eine Ganzzahl umzuwandeln, und es hat funktioniert. Sie müssen dies also nicht manuell tun. Der Feldtyp sollte jedoch vom Typ Integernicht sein Integer64. Stellen Sie sicher, dass die Feldlänge bis zu 9 beträgt. Wenn Sie eine Feldlänge von 10 gewählt haben, wird diese in konvertiert Interger64und funktioniert nicht mit Interger64. Dann können Sie den Vorgang von Schritt 2-6 aus verfolgen

Hier ist die endgültige Ausgabe nach Verwendung des Ausdrucks to_int ():

Geben Sie hier die Bildbeschreibung ein

In der obigen Attributtabelle links ist YEAR vom Typ string und YEAR2 vom Typ Integer, der mit dem Ausdruck to_int () konvertiert wurde. Sie können in der Attributtabelle rechts sehen, nachdem Sie die Schritte 2 bis 6 ausgeführt haben. Ich habe MINYEAR2 und MAXYEAR2 erhalten und dann wieder in einen String zurückkonvertiert, um alles im Feld YEAR miteinander zu verketten.


Danke vielmals! Genau das habe ich mehrmals gemacht. Ich vermute, dass die Polylinien-Features genau über den Punktpositionen aufgeteilt sind, da ich die Linien aus Punktebenen mit dem Points2One-Plugin erstellt habe. Können Sie es mit dieser Datenuntermenge versuchen: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Danke noch einmal!
Wiltomap

Das Feld YEAR in der Attributtabelle ist vom Typ string. Sie müssen ein neues Feld vom Typ Ganzzahl hinzufügen und die Jahre manuell eingeben. Entfernen Sie das alte Zeichenfolgenfeld, nachdem Sie das Feld für den Ganzzahltyp erstellt und die Änderungen gespeichert haben. Befolgen Sie dann den oben beschriebenen detaillierten Vorgang.
Ahmadhanb

Ich habe versucht, das Feld YEAR mit dem Ausdruck to_int () von String in Integer zu konvertieren, aber es hat auch nicht funktioniert. Als ich die Jahre manuell eingegeben habe, hat es wie erwartet funktioniert.
Ahmadhanb

Klare Erklärung @ahmadhanb
Shiko

Danke @ahmadhanb! Tatsache ist, dass die Daten, die ich oben geteilt habe, eine Teilmenge sind. Ich habe mehrere tausend Linien und Punkte, daher ist die manuelle Eingabe von Jahren eine Menge Arbeit! Ist das ein Fehler?
Wiltomap

5

Wenn Sie Verbindungspunkte mit Linien verbinden, haben Sie mehrere Beziehungen. Mit "Attribut nach Ort verbinden" können Sie nach einer bestimmten Zusammenfassungsmethode fragen. In Ihrem Fall tun Sie dies zweimal: einmal mit Minimum und einmal mit Maximum. Danach können Sie die beiden Felder in einem neuen Feld verketten und erhalten das, was Sie benötigen.

Geben Sie hier die Bildbeschreibung ein

Im Feldrechner:

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

Diese Methode gibt eine zusätzliche Spalte mit dem Namen COUNTund dem Wert 2für jede Zeile zurück. Die Optionen Min und Max geben diese Informationen zurück. Ich habe die Linienebene als Zielebene und die Punktebene als Verknüpfungsebene ausgewählt. Stimmt das?
Wiltomap

Ist Ihr Jahr Feld numerisch oder Text?
Radouxju

Das YEARFeld ist eine Ganzzahl. Ich habe versucht, eine neue Spalte mit zu erstellen, to_string("YEAR")aber das Ergebnis ist genau das gleiche ...
wiltomap

Ich habe einen kurzen Test gemacht, um sicherzugehen (QGIS 2.8.3) und es hat funktioniert. Wenn Sie 2 zählen, bedeutet dies, dass Sie für jedes Segment 2 Punkte haben, was korrekt ist. Aber bei mir habe ich die Attributwerte MINYEAR MAXYEAR in dem neuen Linienvektor, der durch die räumliche Verknüpfung erstellt wurde. Ich verstehe nicht, warum es in Ihrem Fall nicht funktioniert. Könnten Sie es mit einer anderen Datei versuchen?
Radouxju

4

Angenommen, die Topologie ist perfekt, erstellen Sie ein Feld 'WKT' mit dem Ausdruck

geom_to_wkt( $geometry) 

In Ihrer Punktebene können Sie den folgenden Ausdruck verwenden:

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'))

Erstellen Sie im Feldrechner der Pipe-Ebene eine Textzeichenfolge.

  • attribute (feature, attribute_name) Gibt den Wert eines angegebenen Attributs aus einem Feature zurück, hier das Jahr des erhaltenen Punkt-Features
    .
  • get_feature (Ebene, Attribut, Wert) gibt das erste Merkmal einer Ebene zurück, das einem bestimmten Attributwert entspricht. Hier prüfen wir, ob wir einen Punkt mit denselben Koordinaten (im WKT-Format) finden können wie die
    Start- und Endscheitelpunkte Ihrer Linie.
  • start_point (Geometrie) gibt den ersten Knoten aus einer Geometrie zurück. Hier der erste Scheitelpunkt Ihrer Linie.
  • end_point (Geometrie) gibt den letzten Knoten aus einer Geometrie zurück. Hier der letzte Scheitelpunkt Ihrer Linie.
  • geom_to_wkt (Geometrie) gibt die WKT-Darstellung (Well-Known Text) der Geometrie zurück. Geben Sie hier die Bildbeschreibung ein

Sie können es sogar aktualisieren auf:

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

um nur ein Jahr anzuzeigen, wenn zwei Punkte mit demselben Jahr verbunden sind (200X statt 200X-200X).

Der Hauptvorteil dieser Methode besteht darin, dass Sie Ihre Daten mit nur einem Feldrechner sehr schnell aktualisieren können, wenn sich Ihre Daten in Ihren Punkten ändern.
Sie können diese Regel sogar als Autofeld hinzufügen, wenn Sie neue Linien erstellen.
Prost,

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.