Wie können Attributdaten mit regulären Ausdrücken einfach bearbeitet werden?

30

Ich schreibe ein Tutorial für MSc-Studenten, die QGIS verwenden. Für eine der Aufgaben müssen die Attributdaten geändert werden (siehe PDF-Entwurf des Tutorials hier, wenn Sie interessiert sind).

Die Frage ist, wie sie die Attributdaten bearbeiten können. Ich weiß , diese Frage wurde vor gefragt , und die Antwort verwendet , einfach zu sein: nur verwenden Libreoffice Calc , ihn zu ändern und speichern Sie es, um sicherzustellen , die Zeilenfolge und Spaltentitel gleich gehalten werden. Ich habe diesen Ansatz zuvor mit großer Wirkung eingesetzt.

Leider funktioniert die Lösung nicht mehr: Speichern der DBF-Datei in LibreOffice (5.4.2) oder OpenOffice (3.4.1) erstellt stattdessen eine zusätzliche .dbt-Datei.

Um auf die Frage zu kommen: Wie kann ich einer Klasse von MSc-Schülern sagen, dass sie das nächste Woche tun sollen? Ich habe die folgenden Optionen in Betracht gezogen:

  1. Verwenden Sie stattdessen R (ideal für mich, aber beängstigend für Studenten)
  2. Bearbeiten Sie die Datei als CSV-Datei und fügen Sie sie dann basierend auf dem Zeitstempel hinzu (in Ordnung, scheint aber zu komplex zu sein und kann in den 2 Stunden mehr Fehler verursachen).
  3. Verwenden Sie ein alternatives Programm: Ich habe Gnumeric und Excel ausprobiert, von denen keines schnell gute Ergebnisse lieferte.

Um diese Frage zu beantworten, habe ich ein replizierbares Beispiel erstellt . Öffnen Sie die Datei "points.shp" in QGIS, beobachten Sie die Attributtabelle und schließen Sie sie. Bearbeiten Sie einige Zellen in der Attributtabelle "points.dbf" in LibreOffice - Speichern. Öffnen Sie "points.shp" erneut in QGIS und beobachten Sie die verschlüsselte Attributtabelle. Die anderen Shapefiles im ZIP-Ordner wurden bereits von LibreOffice und OpenOffice beschädigt, um zu veranschaulichen, wie das Problem für mich aussieht.

Kurz gesagt, wie löse ich dieses Problem am besten?

RobinLovelace
quelle
2
Willkommen auf der Website, ich möchte sagen, dass dies eine sehr häufig gestellte Frage ist und wir hoffentlich einige gute Lösungen finden können. Ich
gehe
13
Das direkte Bearbeiten des DBF-Teils eines Shapefiles ist zu gefährlich, um es für den routinemäßigen Gebrauch zu empfehlen, und sollte überhaupt nicht von Anfängern verwendet werden - zumindest nicht, wenn sich jemand um die Daten kümmert. Es steht jedoch eine zuverlässigere Lösung ähnlicher Art zur Verfügung: Verwalten Sie ein eindeutiges Bezeichnerfeld im Shapefile. Bearbeiten Sie es niemals. Bewahren Sie die Attribute stattdessen in einer verwandten Tabelle (in jedem Format, das Ihr GIS lesen kann) auf, die mit derselben ID verknüpft ist. Jetzt können Sie die Attributtabelle weitgehend frei bearbeiten, ohne die Verbindung zwischen Form und Attribut zu verlieren - solange Sie das Bezeichnerfeld schützen.
whuber
1
Python-Lösungen wären in Ordnung, solange sie einfach zu implementieren und zu verstehen sind ... Bezüglich der Beibehaltung einer Identifikationsnummer ist dies eine gute Option - (Option 2 in meiner Frage) und wahrscheinlich meine Standardantwort. Ich hatte jedoch auf eine einfachere "Schnellkorrektur" gehofft, bei der keine zusätzlichen Dateien erforderlich sind (5 pro Shapefile reichen
meiner Meinung nach
3
Was meinst du mit 5 pro Shapefile? Versuchen Sie es mit 9! :-) (Je nachdem, welches GIS verwendet wird, können sich Indexdateien ansammeln.) Wenn Sie mehr als eine zugehörige Datei benötigen, um einen Datensatz zu verwalten, und für Shapefiles mindestens drei erforderlich sind, ist dies kein zusätzlicher Aufwand mehr zusätzliche Dateien einwerfen. Fügen Sie auch eine Metadatendatei hinzu, während Sie gerade dabei sind. :-) Und wenn Sie den Join einmal eingerichtet haben, geschieht dies nicht automatisch? (Ich sehe jedoch nicht, wie der Zeitstempel für den Join verwendet werden könnte. Das würde stattdessen für ein Versionskontrollsystem verwendet.)
whuber
3
Wenn Sie jede Neigung , sie zu Datenbanken einzuführen, hat SpatiaLite eine GUI für die Feldbearbeitung und Kommandozeilen - Tools für die OSM - Daten. Dann könnten Sie ein wenig SQL einbinden und Ihre Schüler wären der Kurve wohl weit voraus.
Scro

Antworten:

18

Die einfachste Antwort, die ich gefunden habe, basierend auf dem Rat von Ryan Garnett, dies in QGIS zu tun:

Verwenden Sie regexp_replace

Diese Funktion wurde vor 1 Jahr von Jürgen Fischer zum Feldrechner hinzugefügt (wie in diesem Fehlerbericht dargestellt ). Ich habe eine Weile versucht, herauszufinden, wie das geht, habe aber nicht nach "qgis regex" und anderen vagen Begriffen gesucht.

Die Funktionalität wird wahrscheinlich am besten durch die Notwendigkeit veranschaulicht, alle Werte in der Spalte "Name" zu standardisieren. Wenn wir zum Beispiel alle Zellen, die das Muster "Tesc" enthalten, durch "Tesco" ersetzen müssen und überflüssige Informationen wie "Tesco, Infirmary Road" (die von OSM-Mitarbeitern häufig hinzugefügt werden) entfernen müssen, kann die folgende Funktion verwendet werden:

regexp_replace ("name", 'Tesc. *', 'Tesco')

Bildbeschreibung hier eingeben

Ich denke, dies ist die Funktionalität für reguläre Ausdrücke in Pythonic, da sie sich ein wenig von der von mir zuvor verwendeten grep-Funktion unterscheidet.

Ich denke, dass weitere Dokumentation (Details auf der QGIS-Website beschränken sich auf ein paar Wörter) zur Funktionsweise erforderlich ist. Daher habe ich die folgenden Seiten als Lesezeichen für zukünftige Referenz gespeichert:

Diese Lösung hat einige Vorteile:

  1. Einfach: Keine zusätzlichen Programme oder Add-Ons erforderlich
  2. Führt die Schüler in die Macht der regulären Ausdrücke ein, indem sie (Pythonic?) - Funktionen (das "'" für Text ist interessant. Warnung: "oder kein Symbol schlägt fehl) und Befehlszeilenfunktionen verwenden.

Entschuldigung für die Beantwortung meiner eigenen Frage und vielen Dank an andere, die mich zum Licht geführt haben! Ich hoffe, dieser Fragenthread ist für andere, die mit ähnlichen Problemen konfrontiert sind, von erzieherischem Nutzen.

RobinLovelace
quelle
3
Keine Sorge, die Beantwortung eigener Fragen ist kein Problem.
Underdunkel
Ich bin froh, dass Sie etwas gefunden haben, das Ihnen helfen wird. Vielen Dank für das Teilen, ich weiß, dass ich dies nutzen werde.
Ryan Garnett
1
Ich habe die QGIS-Entwickler gefragt, es ist Qt Regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Dies mag eine blöde Antwort sein, da es für die Absolventen ein Lernziel sein mag, aber gibt es einen Grund, warum Sie die Attribute in QGIS nicht mit dem Feldrechner bearbeiten? In früheren Versionen von QGIS (vor 1.7) war es nicht möglich, Attribute direkt in QGIS zu bearbeiten. Daher müssen DBF-Dateien in OpenOffice usw. bearbeitet werden.

Ab 1.7 und 1.8 können Sie Attributdaten direkt im Feldrechner bearbeiten und bedingte Ausdrücke ausführen. Es sind auch Python-Attribut-Plugins verfügbar, die zusätzliche Optionen für die Attributbearbeitung bieten. Dies ist möglicherweise eine Lösung und / oder eine Option für Ihr Lernprogramm.

Als ehemaliger Masterstudent und jetzt Universitätsangestellter verstehe ich dieses Problem, die vorherige Anforderung, es außerhalb von QGIS auszuführen, und schätze jetzt die Fähigkeit, alle Attributbearbeitungen in QGIS durchzuführen. Gerne helfe ich Ihnen dabei weiter, wenn Sie es wünschen.

Ryan Garnett
quelle
1
Hallo Ryan, ja das wäre die ideale Lösung. Es ist die Fähigkeit, Text in der Attributtabelle zu suchen und zu ersetzen, unordentliche OSM-Namen zu standardisieren, die mich dazu drängt, die DBF-Datei direkt zu bearbeiten. Ich würde es lieber in QGIS bearbeiten. Werde das Python Attribute Plugin ausprobieren - könnte die Lösung sein. Hätte die Tatsache, dass ich nach Regex-Such- / Ersetzungsfunktionen suche, in der Frage klarer machen sollen.
Robin Lovelace
@ user1694378 Sie können Ihre Frage noch klären.
Underdunkel
Vielen Dank underdark, dass Sie mich dazu veranlasst haben - spiegelt besser wider, was ich eigentlich tun wollte.
Robin Lovelace
3

Sie können LibreOffice's Base verwenden, um Ihre DBF-Dateien zu ändern .

  1. Open Base (Hauptmenü erhalten)
  2. Wählen Sie "Mit einer vorhandenen Datenbank verbinden" und geben Sie "dBASE" ein.
  3. Wählen Sie den Ordner mit Ihren DBF-Dateien.
  4. Wählen Sie die gewünschten endgültigen Optionen und "Fertig stellen".
  5. Benennen Sie Ihre Datenbankverbindungsdatei nach Belieben (z. B. "MyxBasefiles.odb") und speichern Sie sie irgendwo. Von nun an greifen Sie auf Ihre Datenbankdateien zu, indem Sie auf diese Datei klicken.
  6. Wählen Sie im linken Bereich "Tabellen" aus, und es gibt Ihre Datendateien ("Tabellen" genannt). Leg dich mit ihnen an.

Sie können sie jetzt bearbeiten. Hoffentlich sollte das für Ihre Zwecke gut genug sein.

Sie können auch DBF Explorer ausprobieren, obwohl dies nur Windows ist. Es hat aber Suchen und Ersetzen.

Bildbeschreibung hier eingeben

RK
quelle
1
Hallo RK Danke für die prompte Antwort: Scheint eine zuverlässige und sichere Möglichkeit zu sein, die .dbf-Dateien zu bearbeiten. Ich habe gerade versucht, was Sie gesagt haben, und ich freue mich zu sagen, dass es funktioniert.
Robin Lovelace
Gut zu wissen. Schöne Lektion, die Sie dort haben. :)
RK
Aber ... ich habe gerade ausprobiert, was Sie gesagt haben, und ich bin erfreut zu sagen, dass es für einzelne Zellen funktioniert. Leider ist dies keine 100% ige Lösung für diese spezielle Anwendung, da OOBase anscheinend aufgrund eines [Fehlers] ( lists.freedesktop.org/archives/libreoffice-bugs/2010) nicht über die für das Lernprogramm erforderliche Such- / Ersetzungsfunktion verfügt -Dezember /… ). Auf jeden Fall an einzelnen Zellen gearbeitet: getestet. Das ist also eine 90% ige Lösung für die zellenweise Bearbeitung, es sei denn, ich habe die Funktion zum Suchen und Ersetzen verpasst. Irgendwelche Ideen, wie man zum Beispiel alle "Tesc. *" - Einträge durch "Tesco" ersetzt?
Robin Lovelace
Besserer Link für OO Base-Fehler: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Aktualisiert meine Antwort.
RK