Mehr

Vergleichen Sie ähnliche Linien und aktualisieren Sie Ebenen

Vergleichen Sie ähnliche Linien und aktualisieren Sie Ebenen


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 je nach Ort auf der Karte sehr nahe und etwas weiter entfernt sein kann und nur ein Attribut stimmt, wenn eine Linie in der anderen gleich ist (codlog x codlog5).

Zum Beispiel: In der Mitte des Bildes befindet sich in beiden Ebenen ein Quadrat, aber wie kann ich in der Karte erkennen, dass die blaue mit der grünen übereinstimmt und die aktuelle Ebene aktualisiert?

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


Dies ist eine großartige Frage, ich musste kürzlich etwas Ähnliches tun, jedoch mit einem viel kleineren Datensatz, sodass ich eine einfache Schnittmenge mit einer zusätzlichen visuellen Qualitätsprüfung verwenden konnte, und es war in Ordnung.

Aber hier ist eine Idee dafür, obwohl ich keinen Code habe, und es ist ein ziemlich heftiger Prozess. Testen Sie auf jeden Fall zuerst mit einer Probe aus dem vollständigen Datensatz. Sie können hier 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 jede der Pufferfunktionen:

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

    2b. eine Auswahl nach Standort-Abfrage auf dem anderen Layer mit dieser einzelnen Funktion durchführen

    1. Sie haben mehr als ein Feature, das der Abfrage "Nach Standort auswählen" entspricht, also durchlaufen Sie diese ausgewählten Features und berechnen Sie die Ausrichtung jedes einzelnen.

    2. Rufen Sie die Attribute von dem Feature ab, dessen Ausrichtung der des Puffer-Features am nächsten ist.

*Ich würde mit einer sehr kleinen Entfernung beginnen (eine Karteneinheit oder so) und diesen Vorgang dann mit zunehmenden Entfernungen ausführen, wobei darauf geachtet wird, keine bereits übertragenen Attribute zu überschreiben.

**Sie könnten wahrscheinlich tatsächlich darauf verzichten, die Pufferfunktionen zu erstellen, und einfach die Abfrage nach Standort auswählen mit einem Pufferabstand darin ausführen. Ich bin mit QGIS nicht sehr vertraut, aber ich bin sicher, dass Sie das tun können.

Dies wird auf keinen Fall für alle Ihre Funktionen perfekt funktionieren, aber es ist ein Anfang, und dann kommt es nur darauf an, eine gute QA/QC-Strategie für die Überprüfung und den Abschluss der Übertragung zu entwickeln.

BEARBEITEN Wenn man genauer darüber nachdenkt, hier ist ein grundlegendes Beispiel, das das System vollständig zerstören würde, wenn Sie mit einem sehr kleinen Pufferabstand beginnen und das Feature mit der am besten passenden Ausrichtung auswählen, wie ich es empfohlen habe:

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

BEARBEITEN 2 Ups, sind das Polygone? Ich glaube, ich habe einfach angenommen, dass es sich um Linien auf grauem Hintergrund handelt. Wenn es sich um Polygone handelt, weiß ich nicht wirklich, ob dieses Orientierungskonzept gut ist. Sie könnten jedoch alle sich überschneidenden Features auswählen und herausfinden, welches die meisten Überlappungen aufweist (führen Sie ein Werkzeug vom Typ Union aus und verwenden Sie dann das Polygon mit der größten Fläche ... ).


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

Darüber habe ich hier geschrieben.

  1. Klicken Sie mit der rechten Maustaste auf Ihre rote Shapefile-Ebene im Ebenenbedienfeld und wählen Sie Eigenschaften.
  2. Dann geh zu Tritt bei Tab.
  3. Drücken Sie die + Schaltfläche, wird ein neuer Join erstellt.
  4. Join-Ebene ist Ihre rote Shapefile-Ebene. Join-Feld ist ein Feld mit den gemeinsamen Werten in beiden. Das Zielfeld ist Ihr Feld, mit dem Sie aus der blauen Ebene verbinden möchten.
  5. Danach erhalten Sie ein neues Attribut in Ihrer Shapefiles-Tabelle.

Das ist es.

Hier haben Sie ein Beispiel mit Screenshots.


Ich bevorzuge die Antwort von @dmh126, da seine Methode es Ihnen erlaubt rote Linie Schicht ganz einfach aktualisiert werden.

Um eine Alternative hinzuzufügen, können Sie die Tabelle der Join-Attribute Werkzeug aus dem Verarbeitungs-Toolbox und wählen Sie Ihre Ebenen mit dem gemeinsamen Feld aus. Beachten Sie, dass diese Methode schafft ein neues Shapefile, anstatt ein vorhandenes zu aktualisieren:


Wenn Sie in beiden Ebenen eine eindeutige ID haben, mit der Sie einfach Werte aus der alten mit einer neuen Ebene verbinden können, ist dies ein Kinderspiel. Aber das scheint nicht der Fall zu sein.

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

Ansonsten glaube ich nicht, dass Sie dies ohne etwas Codierung tun können. Mit QGIS können Sie Shapely verwenden und wenn Sie Buffering und Intersecting kombinieren, sollten Sie in der Lage sein, einige signifikante automatische Prüfungen durchzuführen.

Ein Ansatz könnte darin bestehen, einen einigermaßen großen Puffer aus roten Linien mit blauen Linien zu vergleichen und übereinstimmende Attribute und das Verhältnis zu erhalten, wie stark es übereinstimmt. Im Pseudocode:

für r_line in red_lines: r_line_buf = r_line.buffer() intersecting_b_lines = [] für b_line in blue_lines: if r_line_buf.intersects(b_line): intersect_length = computeIntersectionLength(r_line_buf,b_line) b_line_line(appting_values ​​= getlineAttributes(appting_values ​​= get) 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_line, b_line_best_atio…