Attribute von einer Polygonebene in eine andere kopieren?


11

Ich habe ein Problem, bei dem ich meinen Kopf nicht herumkriegen kann. Ich habe zwei Polygonebenen:

  • Polygon A - ist eine Teilmenge von Polygon B mit denselben Feldern und identischen Polygonen wie Polygon B.
  • Polygon B - hat die Attributdaten, die ich in Polygon A haben möchte

Wie kann das gemacht werden? Ich habe das QGIS-Tool "Attribute nach Standort verbinden" ausprobiert, aber da sich einige der Polygone in anderen befinden, wird es in der Regel mit dem ersten gefundenen Schnittpunkt (dem äußeren Polygon) verknüpft.


Erstellen Sie Schwerpunkte (Punkte) von Polygon A und verbinden Sie die Attribute mit B und exportieren Sie sie in eine neue Datei, um die Attribute von A
beizubehalten

3
@Mapperz Dies ist ein gefährlicher Ansatz, da er Fehler verursachen kann, obwohl er normalerweise eine wahrscheinlich aussehende Antwort generiert. Wenn sich die Polygone überlappen, sind alle Wetten ungültig. Selbst wenn es keine Überlappungen gibt, kann der Schwerpunkt eines Polygons innerhalb eines anderen (nicht überlappenden) Polygons liegen. Die Richtigkeit kann im Allgemeinen nur gewährleistet werden, wenn alle Polygone in A nicht überlappend und konvex sind.
whuber

+1 @ Diego - Ihre Frage führte zu einer ziemlich interessanten Diskussion / Debatte; eine interessante dazu!
Dano

Antworten:


9

@Dano wirft zu Recht einige Probleme auf, die am besten in einer vollständigen Antwort behandelt werden.

Eine Schwierigkeit , die bereits von @Celenius festgestellt wurde, besteht darin, dass eine Verknüpfung zwischen B und A (in beide Richtungen) alle Felder dupliziert. es kann mühsam sein, dies zu korrigieren. Ich habe in Kommentaren vorgeschlagen, dass der offensichtlich einfache Weg (Export in eine Tabelle) Fragen der Datenintegrität aufwirft. Eine weitere Schwierigkeit , die bereits in Celenius 'Vorschlag angesprochen wurde, betrifft die Lösung dieses Problems, wenn keine Kombination von Attributen als Schlüssel für A und B dienen kann, da dies einen Datenbank-Join ausschließt. Die räumliche Verknüpfung umgeht dieses Problem.

Was ist dann eine gute Lösung? Ein Ansatz verwendet A, um die entsprechenden Datensätze von B zu identifizieren, die die gewünschten Daten enthalten. Abhängig von den Annahmen über die Konfigurationen der Polygone - ob sie sich überlappen, ob einige andere enthalten können usw. - kann dies auf verschiedene Arten erfolgen: Verwenden einer Ebene zum Auswählen von Objekten in der anderen oder über Verknüpfungen. Der Punkt hier ist, dass wir in diesem Stadium nur die Teilmenge von B auswählen möchten, die A entspricht.

Nachdem Sie diese Auswahl getroffen haben, exportieren Sie die Auswahl und lassen Sie sie A ersetzen. Fertig .

Diese Lösung setzt voraus, dass alle Felder in B ihre Gegenstücke in A ersetzen sollen. Wenn nicht, ist es wirklich notwendig , eine 1-1-Verknüpfung von B (Quelle) mit A (Ziel) durchzuführen. Der auf Bezeichnern basierende Join ist am besten, aber ein Join für die Polygonidentität (Celenius) funktioniert einwandfrei, wenn keine IDs verfügbar sind und die entsprechenden Polygonformen in A und B möglicherweise nicht geringfügig voneinander abweichen . (Dies ist ein subtiler Punkt und die mögliche Ursache für heimtückische Fehler, da frühere Änderungen in B an Polygonen, die nicht A entsprechen, die anderen Polygone in B immer noch unsichtbar modifizieren können, wenn das GIS "schnappt" oder "Topologie beibehält". oder auf andere Weise automatisch globale Änderungen während lokaler Änderungen vornehmen.)

Zu diesem Zeitpunkt gibt es zwei Kopien von jedem Feld: Wenn [Foo] ein gemeinsames Feld für A und B ist, enthält der Join A. [Foo] und B. [Foo]. Kopieren Sie mit einer Feldberechnung B. [Foo] in A. [Foo]. Wiederholen Sie dies für alle benötigten Felder. Entfernen Sie anschließend den Join.

Obwohl dieses Verfahren in vielen Bereichen etwas aufwändig sein kann, gehören zu seinen Vorzügen

  • Es ist einfach und schnell zu schreiben.
  • Durch die Skripterstellung wird ein Prüfpfad hinterlassen , der die Verarbeitung der Daten dokumentiert. Dies ist entscheidend für den Schutz der Datenintegrität.
  • Es verteidigt sich gegen einige Arten von Großhandelsfehlern, z. B. das Beibehalten des falschen Felds nach dem Join (wodurch die alten Daten anstelle der neuen Daten für dieses Feld beibehalten werden) oder das Löschen eines wichtigen Felds.
  • Es nutzt die integrierten Schutzfunktionen des Datenbankverwaltungssystems, z. B. die Durchsetzung von Datentypen und die Durchsetzung von Geschäftsregeln, um Fehler zu verhindern und zu identifizieren und die Konsistenz zwischen allen Tabellen und Ebenen in der Datenbank aufrechtzuerhalten.

Einige der Leitprinzipien dieses Vorschlags sind:

  1. Verwenden Sie ein Datenbankverwaltungssystem, um Daten zu verarbeiten, anstatt Software zu verwenden, die für diese Aufgabe nicht entwickelt oder ungeeignet ist.
  2. Vermeiden Sie es, Datenbankstrukturen zu ändern (z. B. Felder zu löschen oder hinzuzufügen), wenn dies für Vorgänge nicht unbedingt erforderlich ist.
  3. Nutzen Sie die Automatisierungsfunktionen der Software, um die Arbeit zu vereinfachen, zu dokumentieren und die Vorgänge reproduzierbar zu machen.

Man könnte einwenden, dass es in vielen Fällen schnellere und einfachere Wege gibt, um das gleiche Ergebnis zu erzielen. Ja, das kann sein, und sie können effektiv sein und funktionieren normalerweise , wenn sie mit Sorgfalt durchgeführt werden. Lösungen, die die Daten gefährden, sind jedoch schwer zu empfehlen und als allgemeine Antworten zu verteidigen. Sie werden am besten in einmaligen Situationen mit kleinen Datenmengen eingesetzt, in denen eine Beschädigung der Daten schnell offensichtlich werden sollte und die Folgen solcher Fehler unerheblich sind.


+1 @ whuber - Es ist offensichtlich, dass Sie versucht haben, alle Variablen hier abzuwägen. eine gut durchdachte Antwort. Bitte beachten Sie den Zusatz zu meiner ursprünglichen Antwort, da mir im Kommentarfeld der Platz ausgeht.
Dano

1
Für Leute, die sich fragen, was mit dem "Celenius" passiert ist, wurden verschiedene Stellen in diesem Thread erwähnt: Jetzt bekannt als @djq, und seine / ihre Antwort ist hier . Ein großes
Lob

5

In Arcmap können Sie Polygon B räumlich mit Polygon A verbinden. Dies würde die Attribute in Beziehung setzen. Da die Feldnamen identisch sind, wird eine neue Kombination des Namens erstellt.


Das würde ich sagen. In meinen Augen ist diese kurze Antwort die richtige.
Simon

4

Exportieren Sie die Tabelle für Shapefile "B" nach Excel und löschen Sie die redundanten Spalten sowie alle Spalten mit Informationen, die Sie nicht benötigen. Stellen Sie sicher, dass Sie Ihre Spalte mit der freigegebenen Kennung behalten, und speichern Sie sie dann im entsprechenden Ordner. Gehen Sie zu ArcMap, fügen Sie die Tabelle hinzu, klicken Sie mit der rechten Maustaste auf Shapefile "A" und führen Sie eine Tabellenverknüpfung durch . Der Link sollte zu einem Video dazu führen.


@ whuber - Der gesamte Ansatz ist solide und gewährleistet die Integrität der Daten. Das einzige, was ich sagen kann, um diese Antwort zu widerlegen, ist, dass bestimmte Situationen / Projekte uns nicht die Zeit oder das Budget bieten, um in unserem Ansatz so methodisch vorzugehen.

Ein naturgetreues Beispiel:

Eine Junior Mining Company sitzt auf einem großen Erzkörper mit Bargeldinfusionen in Höhe von Hunderten von Millionen Dollar, die auf ihrer Fähigkeit beruhen, die Ressource zu "beweisen". Eine Desktop-Überprüfung von Veröffentlichungen und geologischen Karten / Daten führt zu einem sehr gezielten und sehr kostspieligen Bohrprogramm. Wenn die Assays vom ersten Lauf zurückkommen, werden diese Werte über eine Tabellenverknüpfung an ihren jeweiligen Punktpositionen markiert und in einem Excel-Format zurückgepumpt, in dem die Daten sorgfältig für den Import in DataMine vorbereitet werden (für die 3D-Interpolation von Körpern oder Körpern).

Nach meiner Erfahrung forderten die Projektgeologen , dass diese Daten in Excel vorbereitet werden, dass JEDE Formatierungsregel / -konvention dem Buchstaben entspricht (keine Leerzeichen, keine Sonderzeichen usw.) und dass die DataMine-Importdatei in einem CSV-Format geliefert wird (damals sowieso). Dies würde zu mehr Investitionen in gezielte Bohrungen führen, und wir würden den Prozess (in einigen Fällen) um ein Vielfaches wiederholen. All dies geschah im Allgemeinen auf einer außergewöhnlich engen und kritischen Zeitachse.

Jeder von uns hat seine eigene Geschichte und seine eigenen Erfahrungen, die wir in unsere Herangehensweise an unsere Arbeitsweise einbezogen haben. Meine Erfahrung hat jedoch gezeigt, dass Excel eine absolute Notwendigkeit und ein wichtiges Werkzeug in meinen Arbeitsabläufen ist. es ist was ich weiß. Bei der Aufbereitung dieser Daten haben wir alle QA / QC-Vorsichtsmaßnahmen getroffen. Wo ihr euch vor Excel scheut, hatte ich keine andere Wahl, als es zu benutzen.


(-1) Die Verwendung von Excel für einen Join ist nicht nur schwieriger als die Ausführung mit einem GIS oder RDBMS, sondern führt auch zu schwerwiegenden Fehlern.
whuber

8
Excel ist einfach, funktioniert und ist daher wahrscheinlich für mehr unentdeckte Fehler im Großhandel verantwortlich als jede jemals produzierte Software. Es verstößt gegen die Grundprinzipien von DBMS, die entwickelt wurden, um vor Fehlern zu schützen, die Excel nur allzu leicht festschreiben lässt, z. B. (1) Sortieren einiger Spalten, andere jedoch nicht; (2) Tippfehler, die den Datentyp ändern; (3) streunende Tastenanschläge, die Daten löschen; (4) versehentliches Löschen von Zeilen oder Spalten; (5) versteckte Umwandlung von Daten wie Text in Daten; (6) versteckte Kürzung von Daten; (7) versteckte Rundung numerischer Werte; und viele mehr.
whuber

2
Diese Antwort und der daraus resultierende Kommentar sind ein wunderbares Beispiel dafür, wie eine "schlechte" Antwort zu guten Ergebnissen führen kann und Informationen enthüllt, die sonst möglicherweise nicht ans Licht kommen. Bitte haben Sie nicht das Gefühl, dass Sie es löschen sollten, um zu vermeiden, dass Sie einen Treffer erzielen.
Matt Wilkie

3
... und um den Treffer auszugleichen, wäre eine GROSSE FRAGE die Frage, warum die Verwendung von Excel zur Datenverarbeitung zu sehr schwerwiegenden Problemen führen kann. Und wie man es sicher benutzt.
Matt Wilkie

1
(+1) Für die nachdenkliche und gut beschriebene Bearbeitung. @matt Lesen Sie die Diskussionen auf stats.stackexchange.com über Was wäre ein guter Weg, um mit einem großen Datensatz in Excel zu arbeiten? und Excel als Statistik-Workbench .
whuber

1

In den späten 90er Jahren erhielten wir ein umfangreiches Update aller unserer Gewässer und Wasserläufe, das etwa 55 NTS-Kartenblätter und eine nicht erinnerte Anzahl von Tausenden von Funktionen umfasste. Wir mussten die Mehrwertattribute unserer alten Hydrologie (Seenamen, Oberflächenhöhe usw.) beibehalten und die Geometrie ersetzen. Die Geometrie von Alt und Neu war so nah, dass wir garantieren konnten , dass die Schwerpunkte jedes Polygons immer noch durch die neuen Polygongrenzen begrenzt sind - dies ist ein wichtiger Punkt, ohne diese grundlegende Gewissheit ist der folgende Ansatz keine gute Idee.

Die Lösung in diesem speziellen Fall bestand darin, anstatt die Attribute in die Geometrie zu bringen, die Geometrie in die Attribute zu bringen. Also konzeptionell:

  1. Löschen Sie aus * Layer_with_attributes * Polygone, aber behalten Sie Tabellendatensätze bei.
  2. aus * Layer_with_polys * Geometrie kopieren und in * Layer_with_attributes einfügen *
  3. zusammenführen und speichern.

Sehen Sie hier für eine erweiterte Beschreibung und Rezept für . Ich bin mir nicht sicher, ob es in modernen Arcgis oder Qgis überhaupt möglich ist, eine Geometrie zu löschen, ohne gleichzeitig den Attributdatensatz zu löschen, aber hey, nur für den Fall, hier ist die Idee.


1

Ich bin nicht sicher, aber vielleicht führen einige DBMS Gleichheitsoperationen für Formfelder in SQL (?) Aus. Wenn zwei Geometrien identisch sind, sollte der SQL- =Operator true ( WHERE A.Shape = B.Shape) zurückgeben.

Wenn dies für die von Ihnen verwendete Datenbank zutrifft, sollten Sie in der Lage sein, einen räumlichen Join mit derselben Syntax durchzuführen, die Sie für einen nicht räumlichen Join verwenden würden.


Es sieht so aus, als könnte hierfür die ST_Equals- Methode (ein OGC-Standard) verwendet werden.


0

Wie immer hat whuber recht. Sie müssen gründlich über Ihren Prozess nachdenken. Insbesondere wenn es sich um große Datenmengen handelt und dieser Vorgang viele Male ausgeführt wird oder die Daten geschäftskritisch sind.

Berücksichtigen Sie Ihre Daten und Verantwortlichkeiten:

Was hast du getan?

Was tust du?

Was hast du vor zu machen?

Und immer fragen: Warum?


Nun zu einer einfachen Antwort, die direkt auf die gestellte Frage abzielt. Denken Sie daran, es gibt immer mindestens 5 Möglichkeiten, Dinge zu tun, aber normalerweise nur eine beste.

Angenommen, die Gesamtmenge enthält alle Attribute, die in der Teilmenge enthalten sein sollen, und die Teilmenge enthält nur veraltete Informationen, die noch nicht in der Teilmenge enthalten sind.

Vermutung, dass die Topologie der Teilmenge mit der Gesamtmenge übereinstimmt (einschließlich Ursprung / Projektion und XY-Toleranz).

1) Verwenden Sie Feature to Point mit aktiviertem Kontrollkästchen "Inside" und erstellen Sie eine Feature-Klasse oder ein Shapefile für Punkte aus der Teilmenge.

2) Verwenden Sie eine Auswahl nach räumlicher Verknüpfung, um alle Polygone im vollständigen Satz zu finden, die der Teilmenge basierend auf der neu erstellten Punkt-Feature-Class oder dem Shapefile entsprechen.

3) Exportieren Sie die Auswahl aus dem gesamten Satz, und das kann Ihre neue Teilmenge sein.


0

Wenn Polygon A eine Teilmenge von Polygon B ist, besteht der einfachste Ansatz darin, Polygon A zu durchlaufen und die ID in Polygon A (und B, wenn A eine Teilmenge oder B wäre) zu verwenden, um nach den Zeilendaten in zu suchen Polygon B und aktualisieren Sie dann die Zeile in Polygon A.

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.