--- title: Übung Bomber's Baedeker 1 description: Übung zum Umgang mit CSV-Dateien in QGIS date: 12.7.2021 author: Kai-Christian Bruhn affiliation: Hochschule Mainz contact: kai-christian.bruhn@hs-mainz.de license: cc by 4.0 tags: GIS, QGIS, Spatial Humanities, Übung, CSV, Digital Humanities --- Übung Bomber's Baedeker 1 === --- Link zu diesem Dokument: https://hackmd.io/@KaCeBe/qgis_csv_bombers_baedeker --- GitHub-Repository mit Daten: https://github.com/ieg-dhr/bombers_baedeker Weitere Informationen: * Bach, Felix, und Cristian Secco. „*Text zu XML mit Python auf Basis des ‚Bomber’s Baedeker‘*“. Billet. Digital Humanities Lab. Leibniz-Institut für Europäische Geschichte (blog), 29. Januar 2021. https://dhlab.hypotheses.org/1820. * Bach, Felix, Stefan Schmunk, Cristian Secco, und Thorsten Wübbena. „*Bomber’s Baedeker – vom Text zum Bild zur Datenquelle*“. In *Fabrikation von Erkenntnis. Experimente in den Digital Humanities*, herausgegeben von Manuel Burghardt, Lisa Dieckmann, Timo Steyer, Peer Trilcke, Niels-Oliver Walkowski, Joëlle Weis, und Ulrike Wuttke, Bd. 5. Sonderbände der ZfdG. Wolfenbüttel, 2021. https://doi.org/10.17175/sb005_004. ## Hintergrund *1943 veröffentlichte das britische Ministry of Economic Warfare einen "Guide to the Economic Importance of German Towns and Cities", der Bombenziele in Deutschland verzeichnete. Eine erweiterte zweite Auflage folgte 1944. Eines der wenigen Exemplare befindet sich in der Bibliothek des Leibniz-Instituts für Europäische Geschichte. Es wurde nun online gestellt, da das Original aus konservatorischen Gründen nicht mehr verwendet werden kann.* Quelle: Johannes Paulmann, Bomber’s Baedeker, 7.10.2019, https://europehist.hypotheses.org/tag/digital-history (Eigene Übersetzung) --- Die Digitalisate des Verzeichnisses sind in zwei Bänden hier zu finden: **Band 1**: The Bomber's Baedeker : (guide to the economic importance of German towns and cities) : . Aachen - Küstrin. London. London : Enemy Branch (Foreign Office & Ministry of Economic Warfare): 1944. Universitätsbibliothek Mainz, [`https://nbn-resolving.de/urn:nbn:de:hebis:77-vcol-20176`](https://nbn-resolving.de/urn:nbn:de:hebis:77-vcol-20176) / Public Domain Mark 1.0 **Band 2**: The Bomber's Baedeker : (guide to the economic importance of German towns and cities) : . Lahr - Zwickau. London. London : Enemy Branch (Foreign Office & Ministry of Economic Warfare): 1944. Universitätsbibliothek Mainz, [`https://nbn-resolving.de/urn:nbn:de:hebis:77-vcol-20184`](https://nbn-resolving.de/urn:nbn:de:hebis:77-vcol-20184) / Public Domain Mark 1.0 In dem Verzeichnis sind wirtschaftlich relevante Daten zu potentiellen Zielen verzeichnet. Zu jeder Stadt werden in einer Kopfzeile der Breiten- und Längengrad, die Distanz zu London und die Einwohnerzahl aufgeführt. vgl. auch https://de.wikipedia.org/wiki/Baedeker_Blitz#Bomber%E2%80%99s_Baedeker ![Eintrag zur Stadt Mainz im Bomber's Baedeker](https://i.imgur.com/xWQrppq.jpg) --- ## Fragestellung **Wie präzise sind die Geokoordinaten für die deutschen Städte im Bomber's Baedker?** Die Frage zielt also auf die Präzision, nicht die Genauigkeit der Koordinaten ab. In der Übung sollen die heute genutzten Lageangaben mit denen im Bomber's Baedeker verglichen werden. * Wie hoch sind die Abweichungen? * Sind die Abweichungen systematisch falsch? --- ## Datengrundlage Datensatz: [`coords_dariah_format.csv`](https://github.com/ieg-dhr/bombers_baedeker/blob/d635654323c99c4540b390c0a5a39d4121760cc5/visualisation/coords_dariah_format.csv) aus GitHub-Repository ![Auszug aus coords_dariah_format.csv](https://i.imgur.com/TP3Tfi8.png) Sollte dieser Hinweis auf github erscheinen, bitte nach dem Herunterladen der Datei den Fehler korrigieren (in Zeile 39 fehlt ein Komma am Ende der Zeile). ![Fehlermeldung auf GitHub bei Anzeige der Datei coords_dariah_format.csv](https://i.imgur.com/SikIlBx.png) Analyse der Tabelle: * Fünf Spalten (Name, Address, Description, Latitude und Longitude) * Ortsnamen in Spalte *Name* in Großbuchstaben * Die Felder *Address* und *Description* enthalten keine Werte * Die Koordinaten sind auf zwei Dezimalstellen beschränkt, es handelt sich aber um Koordinaten im Schema `dd°.mm′` also Grad und Minuten. * Der Datensatz enthält Angaben zu 516 Städten Die Genauigkeit der Koordinatenangaben umfasst zwei Stellen im Dezimalbereich. Diese Übersicht verdeutlicht, dass Präzision und Genauigkeit also bei etwa 1 km auf der Erdoberfläche liegen (hier sind zwar Dezimalgrad angegeben und keine Grad/Minuten, im groben bleiben die Aussagen aber gültig): ![https://xkcd.com/2170/ cc by-nc 2.5](https://imgs.xkcd.com/comics/coordinate_precision.png) Source: https://xkcd.com/2170/ cc by-nc 2.5 Etwas genauer diese Aufstellung mit Angaben zu Distanzen von Dezimalstellen der Grad-Angaben von Koordinaten am Äquator: ![Tabelle mit Angaben zu Distanzen von Dezimalstellen der Grad-Angaben von Koordinaten am Äquator](https://i.imgur.com/vXCYIoy.png) Für Details s. die Diskussion auf [gis.stackexchange.com](https://gis.stackexchange.com/questions/8650/measuring-accuracy-of-latitude-and-longitude) --- ## Vorgehen 1. Einlesen der Datei `coords_dariah_format.csv` in QGIS (Getrennte Textdatei als Layer hinzufügen...) inkl. Bereinigung und Speichern als layer `dariah_csv` in einem Geopackage 2. Exkurs: Fehlerquellen beim Einlesen der Daten 3. Export der Städtenamen in eine neue Datei `bb_staedte.csv` 4. MMQGIS-Plugin installieren und die Ortsangaben in der Datei `bb_staedte.csv` geokodieren und bereinigen 5. Zusammenführen der der bereinigten Daten (Ausgangsdaten und geokodierte Ortsliste) 6. Berechnung des Abstands ### 1. Einlesen der Datei ![QGIS Dialog "Getrennte Textdatei als Layer hinzufügen" aufrufen](https://i.imgur.com/opaILLs.png) * [X] Folgende Einstellungen in dem Import-Dialog übernehmen: * Dateiname * Kodierung (UTF-8) * Dateiformat (CSV) * Datensatz- und Feldoptionen * Geometriedefinition * X: Longitude, Y: Latitude * Geometrie-KBS (EPSG 4326, WGS 84) * Räumlichen Index benutzen ![QGIS Dialog "Getrennte Textdatei als Layer hinzufügen" mit Einstellungen für den Import](https://i.imgur.com/VFj0Hs8.png) * [X] Hinzufügen und Schließen Ergebnis: ![Ergebniskartierung des Imports](https://i.imgur.com/DkfjdsG.png) #### Überprüfung des Imports * [X] Der Import umfasst 516 Städte * [X] Eine visuelle Inspektion zeigt ca. 13 Ausreißer Die Außreißer lassen wir in der Übung unberücksichtigt. Bereinigung des Import-Layers: 1. Speichern als Layer `dariah_csv` in einem Geopackage `qgis_uebung_csv_import.gpkg` inkl. Löschung leerer Spalten. 2. Spalten für `Longitude(X)` und `Latitude(Y)` mit Komma als Dezimalseparator hinzufügen. **(1a)** ![Kontextmenü des Layers, Exportieren, Objekte speichern als...](https://i.imgur.com/H76BwzH.png) **(1b)** ![Exportdialog Geopackage](https://i.imgur.com/HSwJtvV.png) **(2a)** Feldrechner in Attributtabelle des Geopackage Layers mit Anlegen eines neues Felds `x_lon` und Übernahme des Wertes aus Variable `$x`. ![Feldrechner in Attributtabelle des Geopackage Layers mit Anlegen eines neues Felds x_lon und Übernahme des Wertes aus Variable $x](https://i.imgur.com/6W3Uprq.png) **(2b)** Feldrechner in Attributtabelle des Geopackage Layers mit Anlegen eines neues Felds y_lat und Übernahme des Wertes aus Variable $y ![Feldrechner in Attributtabelle des Geopackage Layers mit Anlegen eines neues Felds y_lat und Übernahme des Wertes aus Variable $y](https://i.imgur.com/YOMVL4c.png) Ergebniskartierung mit Attributtabelle ![Ergebniskartierung mit Attributtabelle](https://i.imgur.com/PZwLq5x.png) In der Kartierung fällt auf, das die Punkte in Rasterzellen angeordnet sind. ![](https://i.imgur.com/dSxLSMi.png) Darauf haben die Autoren der Daten bereits aufmerksam gemacht: ![](https://raw.githubusercontent.com/ieg-dhr/bombers_baedeker/main/visualisation/Koordinaten_Raster.PNG) vgl. https://github.com/ieg-dhr/bombers_baedeker/blob/main/visualisation/Koordinaten_Raster.PNG > Hier ist erkennbar, dass die Ersteller*innen des Bomber’s Baedeker eine klassische (Raster-)Papierkarte als Vorlage benutzt haben müssen, mit deren Hilfe die entsprechenden Geokoordinaten in die Textfassung übertragen wurden. Quelle: https://zfdg.de/sb005_004#pid27 --- ### 2. Exkurs: Fehlerquellen beim Einlesen der Daten Die erkannte "Rasterung" der Daten ist auch anhand der Werte nachvollziehbar. Kein Nachkomma-Wert ist größer 59. Tatsächlich sind die Koordinaten als Dezimalwerte importiert. Die leeren Streifen in der Verteilung der Orte sind jeweils die Nachkommawerte zwischen 60 und 99, die in Dezimalgrad vorkommen, in Gradminuten aber nicht. Das gilt sowohl für die X- als auch die Y-Werte. Als Beispiel nehmen wir den ersten Eintrag: `AACHEN,,,50.47,6.5,` Die Koordinaten für Aachen in Grad und Minuten ergeben in Dezimalgrad: `AACHEN,,,50.7833333,6.083333333333333,` Damit QGIS die Daten als Gradminuten erkennt und importiert, muss zunächst der Dezimaltrennpunkt in das Grad-Zeichen **°** umgewandelt werden. Hier vorgenommen mit einem schlichten Suchen-Ersetzen in einem Texteditor. ![Punkt als Dezimalseperator in Texteditor, hier VSCodium mit ° ersetzen](https://i.imgur.com/5D6R0Vj.png) Für die ersten drei Einträge ergibt sich so: ``` Name,Address,Description,Latitude,Longitude, AACHEN,,,50°47,6°5, AALEN,,,48°50,10°5, AHLEN,,,51°45,7°55, ``` Im Importdialog für die csv-Datei in QGIS muss dann zusätzlich die Option GMS-Koordinaten aktiviert werden: ![Importeinstellungen in QGIS, Ausschnitt](https://i.imgur.com/55LLvwa.png) Im Ergebnis sieht die Verteilung der Orte dann so aus: ![Verteilung der Orte mit Koordinaten in Gradminuten](https://i.imgur.com/gd0zBtO.png) Und im Vergleich (rot: Dezimalgrad, blau: Gradminuten) ![Vergleich der Lage importieren Orte](https://i.imgur.com/KHSF67K.png) --- ### 3. Export der Städtenamen Exportdialog aufrufen ![Kontextmenü des Layers, Exportieren, Objekte speichern](https://i.imgur.com/oRh75TZ.png) Exportformat Komma-getrennte Werte [CSV] auswählen ![Exportformat Komma-getrennte Werte [CSV] auswählen](https://i.imgur.com/P3DjmZm.png) * [X] Einstellungen übernehmen Exportieren der Daten in `bb_staedte.csv` ![Exportdialog](https://i.imgur.com/CjCJi47.png) --- ### 4. MMQGIS Was ist MMQGIS? > MMQGIS is a set of Python plugins for manipulating vector map layers in Quantum GIS: CSV input/output/join, geocoding, geometry conversion, buffering, hub analysis, simplification, column modification, and simple animation. MMQGIS provides verbose progress reporting, an intuitive user interface, direct file access, and some additional capabilities missing from other plugin sets such as the Processing toolbox. Quelle: http://michaelminn.com/linux/mmqgis/ **Wichtig** > Input CSV File: Table of addresses to geocode. This file should be encoded in the UTF-8 character set. Although other 8-bit encodings (like Windoze ISO-8859-x) will work if only ASCII characters are present, non-ASCII characters may cause unpredictable behavior. Tatsächlich können auch Sonderzeichen in den Feldwerten der csv, die nicht in ASCII vorkommen (ä,ö,ü etc.) Probleme verursachen. MMQGIS-Installation über Erweiterungsdialog ![QGIS-Dialog Erweiterungen verwalten und installieren](https://i.imgur.com/VDGQ6tB.png) Nach der Installation ist MMQGIS ein Menüeintrag, über den *Geocode CSV with Webservice* aufgerufen werden kann: ![Aufruf des Dienstes "Geocode CSV with Web Service" im Menü MMQGIS](https://i.imgur.com/6jZUXln.png) Einstellungen für das Geocoding der `bb_staedte.csv`-Datei im Dialog übernehmen. Die Ortsnamen in der Spalte `Name` sind als `City` an den Dienst zu übergeben: ![Dialogeinträge für die Geocodierung der Datei bb_staedte.csv](https://i.imgur.com/WauXSJE.png) ***Nach dem Klick auf "Anwenden" geduldig bleiben...*** ***...die Sonderzeichen wollen verarbeit werden...*** Nach erfolgreicher Codierung meldet das Plugin 443 von 505 Orten als erfolgreich codiert. Die Daten sind in dem im Feld `Output File Name` angegebenen Shapefile `bb_staedte_geocode.shp` gespeichert. Dass nicht alle Orte geocodiert wurden, liegt an der Schreibweise einiger Ortsnamen, die der Dienst nicht kennt und vor der Kodierung von Hand normalisiert werden müssten. ![Ergebnis im QGIS-Dialog](https://i.imgur.com/1EIt9GE.png) * [X] mit "Schließen" den Dialog jetzt schließen. In QGIS kann jetzt das erzeugte Shapefile als Layer hinzugefügt und visuell die Unterschiede betrachtet werden. Kartierung des Ergebnis': | Layer | Farbe | | ------------------ | ---- | | dariah_csv | grün | | bb_staedte_geocode | rot | ![](https://i.imgur.com/Mchqe6W.png) ## 5. Zusammenführen der bereinigten Daten Zusammenführen der Layer `dariah_csv` und `bb_staedte_geocodiert` mit dem Werkzeug `Menü - Vektor - Datenmanagement-Werkzeuge - Vektorlayer zusammenführen`: ![GIS Menü - Vektor - Datenmanagement-Werkzeuge - Vektorlayer zusammenführen](https://i.imgur.com/6vewBTB.png) Informationen zum Werkzeug: > Der Algorithmus kombiniert mehrere Vektorlayer mit dem gleichen Geometrietyp zu einem zusammen. Die Attributtabelle des Ergebnislayer enthält die Felder aller Eingabelayer. Wenn gleichnamige Felder mit unterschiedlichen Typen gefunden werden, wird das exportierte Feld automatische in Zeichenketten umgewandelt. Neue Attribute werden für den Originallayernamen und -Quelle hinzugefügt. Wenn eine Eingabelayer Z- oder M-Werte enthält, hat der Ausgabelayer auch diese Werte. Ebenso wird der Ausgabelayer mehrteilig, wenn einer der Eingabelayer mehrteilig ist. Optional kann das Ziel-KBS für den Ausgabelayer gesetzt werden. Wenn es nicht angegeben ist, wird das des ersten Layers verwendet. Alle Layer werden auf des KBS reprojiziert. **DIALOG fehlt** Attribute und Werte des Ergebnislayers: ![](https://i.imgur.com/YwPtnon.png) ## 6. Berechnung des Abstands Toolbox: *Punkte zu Weg* bzw. *Points to Path* ![](https://i.imgur.com/bLiGJ4F.png) Orte mit identischen Werten in der Spalte Name sind durch eine Linie miteinander verbunden: ![](https://i.imgur.com/vgkfljL.png) Eine schnelle Durchsicht der Daten zeigt, dass die Lagekoordinaten zu identischen Ortsnamen erheblich voneinander abweichen. ## 7. Zum Nachdenken Welche Gründe kommen als Erklärung in Frage? Ziehen Sie folgende Ebenen der Datenprozessierung in Betracht: * Koordinatenbezugssystem(e) * Encoding * Geocodierungs-Services Eine systematische Untersuchung steht noch aus. Zur Erleichterung hier einige Ausschnitte mit aktuellem Kartenhintergrund: ![](https://i.imgur.com/Z1fBRTK.jpg) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/yl3AuHW.png) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/lY13Ffp.png) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/ydGjJup.jpg) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/LbttXaH.png) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/ydGjJup.jpg) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ![](https://i.imgur.com/DGzq40J.jpg) Basemap data copyrighted OpenStreetMap contributors and available from https://www.openstreetmap.org" ## Auswertung Für eine quantitative Auswertung ist die Qualität der Daten nicht ausreichend. Ein entsprechendes Skript mit normalisierten Daten finden Sie [hier](https://hackmd.io/@KaCeBe/qgis_csv_bombers_baedeker2).