Vergleichen Sie ähnliche Zeilen und aktualisieren Sie die Ebenen


16

Hier gibt es zwei Ebenen mit der Darstellung der Straßen und die Idee ist: Wir möchten die neueste Ebene (mit der roten Linie) mit einigen der Daten aktualisieren, die in der anderen (der hellblauen) gespeichert sind, aber diese Ebenen sind Ähnlich in der geografischen Position, die abhängig von der Position auf der Karte sehr nahe und etwas weiter entfernt sein kann. In Fällen, in denen eine Linie mit der anderen identisch ist (codlog x codlog5), stimmt nur ein Attribut überein.

Qgis Schichten.

Beispiel: In der Mitte des Bildes befindet sich in beiden Ebenen ein Quadrat. Wie kann ich in der Karte feststellen, dass die blaue und die grüne Ebene identisch sind und die aktuelle Ebene aktualisieren?

Wie kann ich es tun? Gibt es ein Plugin oder Tool, das dabei hilft?


Sie möchten die rote Ebene mit Attributen aus der blauen Ebene oder mit zusätzlichen Funktionen aus der blauen Ebene aktualisieren?
dmh126,

Die Attribute. Situation: Die rote Ebene enthält die Spalten (a, b, c, d) und die blaue die Spalten (d, e, f). Ich möchte in die rote Ebene die Spalten (e, f) der anderen Ebene und die entsprechenden Ergebnisse einfügen.
Jhonatan Oliveira

Es gibt hier eine Dokumentation für ein Conflation-Plugin. Ich bin nicht sicher, ob die Entwicklung abgeschlossen ist.
Barbarossa

1
Hast du es mit Jump versucht?
Radouxju

Aber die Spalte "d" der blauen Linie und das "d" der roten sind eine eindeutige gemeinsame ID? Was enthalten sie?
Sergio

Antworten:


6

Dies ist eine großartige Frage. Ich musste in letzter Zeit etwas Ähnliches tun, allerdings mit einem viel kleineren Datensatz. Daher konnte ich eine einfache Kreuzung mit zusätzlichen visuellen Qualitätsprüfungen verwenden und es war in Ordnung.

Aber hier ist eine Idee dafür, obwohl ich keinen Code habe, und es ist eine Art heftiger Prozess. Testen Sie auf jeden Fall zuerst mit einer Probe aus dem vollständigen Datensatz. Hier können Sie wahrscheinlich nützlichen Code finden. (Die Einrückung wurde unten etwas seltsam.):

  1. nimm den guten Geometriesatz (wo die Attribute enden sollen) und erstelle einen Puffer davon *

  2. Durchlaufen Sie alle Pufferfunktionen:

    2a. Berechnen Sie die allgemeine Ausrichtung des Features (max_y - min_y / max_x - min_x oder ähnliches)

    2b. Treffen Sie mit dieser Funktion eine Auswahl nach Standortabfrage auf der anderen Ebene

    1. Sie haben mehr als eine Funktion, die mit der Abfrage "Auswahl nach Standort" übereinstimmt. Durchlaufen Sie diese ausgewählten Funktionen und berechnen Sie die Ausrichtung der einzelnen Funktionen

    2. Abrufen der Attribute von jedem Feature, dessen Ausrichtung der des Puffer-Features am nächsten kommt.

* Ich würde mit einer sehr kleinen Entfernung beginnen (eine Karteneinheit oder so) und diesen Vorgang dann mit zunehmender Entfernung ausführen, wobei ich darauf achten sollte, keine Attribute zu überschreiben, die Sie bereits übertragen haben.

** Sie könnten wahrscheinlich sogar auf die Erstellung der Pufferfunktionen verzichten und nur die Abfrage nach Speicherort mit einem Pufferabstand durchführen. Ich bin nicht sehr vertraut mit QGIS, aber ich bin mir sicher, dass Sie dazu in der Lage sind.

Es gibt keine Möglichkeit, dass dies für alle Ihre Funktionen perfekt funktioniert, aber es ist ein Anfang, und dann kommt es nur darauf an, eine gute QA / QC-Strategie zum Überprüfen und Abschließen der Übertragung zu entwickeln.

BEARBEITEN Wenn Sie mehr darüber nachdenken , ist hier ein grundlegendes Beispiel, das das System komplett zerstören würde, wenn Sie mit einem sehr kleinen Pufferabstand beginnen und die Funktion mit der von mir empfohlenen besten Ausrichtung auswählen:

Bildbeschreibung hier eingeben

Die Attribute von der falschen roten Linie würden genommen. Um dies zu vermeiden, möchten Sie möglicherweise eine Art Toleranz erstellen und die Attribute des Features nur dann übernehmen, wenn seine Ausrichtung (im Vergleich zur Ausrichtung des ursprünglichen blauen Features) innerhalb dieser Toleranz liegt.

EDIT 2 Ups, sind das Polygone? Ich nehme an, dass es sich nur um Linien auf grauem Hintergrund handelt. Wenn es sich um Polygone handelt, weiß ich nicht genau, ob dieses Orientierungskonzept gut ist. Sie können jedoch alle sich überschneidenden Features auswählen und herausfinden, welche die meisten Überlappungen aufweisen (führen Sie ein Werkzeug vom Typ Union aus und verwenden Sie dann das Polygon mit der größten Fläche ...).


Diese Logik ist gesund. Ich habe einen ähnlichen Ansatz in C # / ArcObjects verwendet, um Attribute aus einem ungenauen Dataset mit Attributen in ein genaues Dataset ohne Attribute zu kopieren ... 95% korrekt. In engen Bereichen war eine manuelle Überprüfung / Korrektur erforderlich, die jedoch mit Sicherheit schneller ging als die manuelle Durchführung.
Michael Stimson

2

Wenn Sie einige Attribute von der roten zur blauen Ebene hinzufügen möchten und ein Attribut in beiden Ebenen gemeinsam ist, müssen Sie die Option "Vektorverbindung hinzufügen" verwenden .

Darüber habe ich hier geschrieben .

  1. Klicken Sie mit der rechten Maustaste auf die rote Shapefile-Ebene im Ebenenbedienfeld und wählen Sie Eigenschaften .
  2. Gehen Sie dann zur Registerkarte Joins .
  3. Drücken Sie die Taste + , um eine neue Verknüpfung zu erstellen.
  4. Join-Ebene ist Ihre rote Shapefile-Ebene. Das Verknüpfungsfeld ist ein Feld mit den gemeinsamen Werten in beiden. Zielfeld ist Ihr Feld, zu dem Sie eine blaue Ebene hinzufügen möchten.
  5. Danach erhalten Sie ein neues Attribut in Ihrer Shapefiles-Tabelle.

Das ist es.

Hier haben Sie ein Beispiel mit Screenshots.


1

Ich bevorzuge die Antwort von @ dmh126, da seine Methode es ermöglicht, Ihre red_line- Ebene ganz einfach zu aktualisieren.

Um eine Alternative hinzuzufügen, können Sie das Tabellenwerkzeug Verbindungsattribute aus der Verarbeitungs-Toolbox verwenden und Ihre Ebenen mit dem gemeinsamen Feld auswählen. Beachten Sie, dass diese Methode erstellt eine neue Shape - Datei stattdessen einen vorhandenen zu aktualisieren:

Attributtabelle verbinden


0

Wenn Sie in beiden Layern eine eindeutige ID haben, mit der Sie Werte auf einfache Weise mit neuen Layern aus alten verbinden können, ist dies ein Kinderspiel. Dies scheint jedoch nicht der Fall zu sein.

Wenn nicht, ist es ein ziemlich schwieriges Problem. Ich frage mich, warum der Kommentar von User30184, der OpenJUMP und das Plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher vorschlägt, nicht als Antwort gepostet wurde, da er in diesem Fall für mich völlig legitim klingt.

Ansonsten glaube ich nicht, dass Sie dies ohne ein bisschen Codierung tun können. Mit QGIS können Sie Shapely verwenden und beim Kombinieren von Pufferung und Überschneidung sollten Sie in der Lage sein, eine signifikante automatische Überprüfung durchzuführen.

Ein Ansatz könnte darin bestehen, einige einigermaßen große Puffer roter Linien mit blauen Linien zu vergleichen und übereinstimmende Attribute und Verhältnisse zu erhalten, um wie viel es sich handelt. Im Pseudocode:

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