Kategorie: Karten

Geodaten aus Open Street Map importieren

Die Open Street Map (OSM) bietet kostenlos Geodaten zu verschiedenen Themen. Die einzelnen Layer der Open Street Map lassen sich über eine Schnittstelle abrufen und weiterverwenden. Typische Anwendungsfälle sind beispielsweise:

  • Ich möchte eine Karte aller Landkreise (Polygone) Deutschlands erstellen.
  • Ich möchte eine Karte aller Autobahnen (Ways) in Europa erstellen.
  • Ich möchte eine Karte aller Spielplätze (Nodes) in München erstellen.

Bei der Verwendung von Open Street Map-Daten ist immer die Quelle zu nennen. Für den deutschen Sprachraum muss der Quellennachweis © OpenStreetMap-Mitwirkende lauten. Mehr Informationen dazu hier.

Datenanfrage mit Overpass Turbo
Overpass Turbo ist eine Webanwendung mit einem Wizard, der das Erstellen von Anfragen erleichtert. Zudem bietet Overpass Turbo vielen Exportmöglichkeiten.

Um zum Beispiel alle Autobahnen in Bayern zu bekommen, würde man im Wizard highway=motorway and type:way in bavaria eingeben. Eine Dokumentation der Wizard-Syntax findet sich hier. Der Wizard übersetzt die Anfrage in die Syntax der OSM Overpass API:

1
2
3
4
5
6
7
8
[out:json][timeout:25];
{{geocodeArea:bavaria}}->.searchArea;
(
  way["highway"="motorway"](area.searchArea);
);
out body;
>;
out skel qt;

Bei größeren Anfragen kann es sein, dass man das Timeout hochsetzen muss. Die Angabe des Timeouts erfolgt in Sekunden. Hat die Anfrage geklappt, kann man die Daten zum Beispiel im GeoJSON-Format exportieren und in QGIS weiterverarbeiten.

Overpass Turbo

Weitere Beispiele für Anfragen in Overpass Turbo:

  • Alle Landkreise Deutschlands: boundary=administrative and admin_level=6 and type:relation in germany
  • Touristenattraktionen in der Nähe des Marienplatzes: tourism=attraction around "Marienplatz, München"

Für das Auffinden der einzelnen Orte (Bavaria, Marienplatz etc.) nutzt Overpass Turbo den sehr mächtigen OSM-Geocoder Nominatim.

Datenanfrage mit Quick OSM (QGIS)
Quick OSM ist ein Plugin für das Gedodatenprogramm QGIS. Genau wie in Overpass Turbo hilft Quick OSM dabei Anfragen an die  OSM-API zu formulieren. Quick OSM hat jedoch den Vorteil, dass man schon eine  Übersicht der verfügbaren Layer hat und so Datensätze entdecken kann. Die so erstellte Anfrage kann dann noch verändert werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<osm-script output="xml" timeout="300"> 
  <id-query ref="3600051477" type="area" into="area"/> 
  // <id-query {{geocodeArea:Germany}} into="area"/> 
  <union>
    <query type="relation">
      <has-kv k="boundary" v="administrative"/>
      <has-kv k="admin_level" v="6"/> 
      <area-query from="area"/>
    </query>
  </union>
  <union>
    <item />
    <recurse type="down"/>
  </union>
  <print mode="body" />
</osm-script>

In diesem Fall wurde das Timeout auf 300 Sekunden erhöht und als zusätzlicher Filter <has-kv k="admin_level" v="6"/> eingefügt. Der zusätzliche Filter führt dazu, dass man nur Verwaltungsgrenzen auf Landkreisebene zurück bekommt. Ohne diesen Filter würde man sehr viele Daten zurückbekommen, da auch Bundeslandgrenzen, Regierungsbezirke usw. enthalten wären.

QGIS mit Overpass Turbo

Es bietet sich an, Anfragen an die OSM-API immer so einfach wie möglich zu halten und die Daten später in QGIS zu filtern. Komplexe Anfragen an die OSM-API dauern ewig.

Exportieren der Daten
Sowohl in Overpass Turbo als auch QGIS kann man die Daten als GeoJSON exportieren. GeoJSON-Dateien sind recht platzsparend, werden von einer Vielzahl an Anwendungen unterstützt und sind im Nachhinein noch berarbeitbar. Für die finale Anwendung empfiehlt sich das Format TopoJSON, welches noch deutlichen kleiner ist.

Anwendungsfall Verwaltungsgrenzen
OpenStreetMap bietet Daten für Verwaltungsgrenzen, Wahlkreise und Postleitzahlgebiete. Vor allem die Verwaltungsgrenzen braucht man im Alltag immer wieder. Im OpenStreetMap-Kontext sind diese Grenzen von Typ boundary=administrativ. Um die jeweils richtigen Grenzen zu bekommen, muss man sich mit dem Konzept des admin_levels, sprich der Verwaltungsebene, auseinandersetzen. Diese können von Land zu Land anders sein. Für Deutschland gibt es diese Verwaltungsebenen:

  1. Landesgrenze
  2. Bundesland
  3. Regierungsbezirk
  4. Landkreis / Kreis / kreisfreie Stadt / Stadtkreis
  5. Amtsgemeinde, Verwaltungsgemeinschaft
  6. Stadt, Gemeinde
  7. Stadtbezirk / Gemeindeteil mit Selbstverwaltung
  8. Stadtteil / Gemeindeteil ohne Selbstverwaltung

Um also an die Stadtbezirksteile Münchens zu kommen, müsste man die Verwaltungsgrenze (boundary=administrativ) auf der Verwaltungseben 10 (admin_level=0) anfragen.

Ich hoffe ihr könnt etwas mit dieser kurzen Anleitung anfangen. Wenn nicht, einfach in den Kommentaren nachfragen.

Beitrag teilen:

Lobbyliste: Adressen direkt in Google Docs geocodieren

Wenn man eine Datensatz mit vielen Adressen hat, muss man diese manchmal von Hand geocodieren. Geocodieren heißt in diesem Fall, dass man jedem Ort Koordinaten zuweist.

Beispiel:
Adresse: Deutscher Bundestag, Platz der Republik 1, 11011 Berlin
Koordinaten: 51.1758057 Nord (Breitengrad = Latitude), 10.4541194 Ost (Längengrad = Longitude)

Manche Dienste (Google Fusion Tables, CartoDB usw.) bieten diesen Dienst schon von Haus aus an. Doch oftmals gibt es für nicht-zahlende Benutzer Beschränkungen. In meinem Beispiel versuche ich die Lobbyliste des Bundestags mit über 2000 Adressen zu geocodieren. Mit meinem kostenlosen CartoDB-Account könnte ich zum Beispiel nur 100 Adressen gecodieren.

Ich schreibe gerade noch eine Anleitung, wie ich das PDF in eine Tabelle umgewandelt habe. Diese werde ich in Kürze hier verfügbar machen. Soweit kann ich euch verraten: PDFs in Tabellen umzuwandeln ist kein Spaß 😉
geocode-01-data

Als ersten Schritt muss man ein Skript kopieren, dass wir später in Google Docs einfügen. Das JavaScript findet sich hier und wurde vom Kartendienstleister MapBox entwickelt. Einfach alles markieren und kopieren.

Nun muss man den Skripteditor öffnen…
geocode-03-scripteditor

… und den kompletten, bisher bestehenden Code function() {} mit dem eben kopiertem Code ersetzen. Außerdem muss man oben in der Titelzeile, wo noch Unbenannt steht, als Titel geo eintragen. Nach einem Klick auf Datei > Speichern kommt man wieder zur Tabelle zurück.
geocode-04-insertcode

Jetzt dürfte in der Menüleiste neben Hilfe noch ein weiterer Reiter Geo auftauchen. Ist das nicht der Fall, einfach die ganze Seite neu laden. Wenn der Reiter Geo jetzt auftaucht, können wir mit dem Geocodieren beginnen. Einfach im Reiter Geo > Geocode adresses auswählen. Nun muss das Skript einmalig autorisiert werden.

geocode-06-authorise

Nach der Autorisierung muss man in der Tabelle die Spalten auswählen, welche man geocodieren möchte. In unserem Fall ist das Adresse und Postleitzahl. Nun kann man nochmals auf Geo > Geocode adresses gehen. Es sollte nun das Geocodieren-Fenster aufgehen.

geocode-07-service

Unter Geocoding service kann man zwischen mapquest, yahoo und cicero auswählen – Bei mir funktionierte jedoch nur mapquest ohne API-Key. Mit einem Klick auf Geocode geht’s los. Bei mir hat das Geocodieren etwa ein dreiviertel Stunde gedauert.

geocode-08-done

Was sofort auffällt ist, dass da Geocoding-Skript der Tabelle drei neue Spalten hinzugefügt hat: geo_latitude, geo_longitude und geo_accuracy. Die ersten beiden Werte sind die Koordinaten, der dritte Wert gibt die Genauigkeit an.
geocode-09-columns

Manchmal kommt es vor das eine Adresse nicht geocodiert wurde. Bei mir war das zum Beispiel bei Adressen der Fall, bei denen ein Postfach angegeben wurde. Diese Adressen habe ich einfach noch mal geocodieren lassen, diesmal aber nur die Postleitzahl und der Ort. Die Genauigkeit der Geocodierung fällt in diesem Fall auf city, was aber für meine Visualisierungsidee vollkommen ausreicht.

Die Visualisierung habe ich in CartoDB gemacht. Wie man ein solche Cluster-Visualiserung macht, werde ich ein anderes Mal erklären.

geocode-10-visualize

Die vollständige Visualisierung findet ihr hier, den vollständigen Datensatz im Google Drive gibt es hier. Die Tabelle ist noch nicht perfekt und es fehlen noch einige Felder. Ich werde versuchen, dass noch besser hinzubekommen.

Sagt mir Bescheid wie ihr mit der Anleitung klar kommt.

Viel Spaß beim Experimentieren!

Beitrag teilen:

Vektorkarten: Shapefiles nach KML exportieren mit QGIS

Digitale Vektorkarten müssen oft als KML vorliegen, damit man sie zum Beispiel mit CartoDB oder Google Fusion Tables verwenden kann. Die Ausgangskarten kann man oft als sogenanntes ESRI-Shapefile herunterladen. Das Problem ist, dass Shapefiles aus mehreren Dateien bestehen (*.shp für die Geometrie, *.dbf für Daten, *.prj für die Projektion usw.). Das an XML angelehnte Dateiformat KML ist da deutlich praktischer, da es alle Daten in eine Datei zusammenfasst und diese für Menschen halbwegs lesbar bleiben.

In unserem Fall wollen wir eine Karte der Wahlkreise Deutschlands von der Website des Bundeswahlleiterbüros ins KML-Format umwandeln. Zum Konvertieren verwenden wir die mächtige Open Source Geo-Software QGIS. Diese ermöglicht es, Shapefiles zu bearbeiten und in verschiedene Formate zu exportieren.

Importieren kann man das Shapefile über Layer > Vektorlayer hinzufügen oder in dem man die Datei einfach auf die Arbeitsfläche von QGIS zieht. Sieht man jetzt eine Karte der Wahlkreise, hat alles geklappt. Im folgenden Schritt schauen wir uns an, was für Daten die Karte beinhaltet. Dazu klickt man mit Rechts auf den Layer Namen und geht anschließen auf Attributtabelle öffnen.qgis-open-table

Hier sieht man die Namen und Nummern der Wahlkreise. Wichtig ist es, sich zu überlegen, worüber man später seine Wahlkreise identifizieren möchte. In unserem Fall bietet sich WKR_NR an. Merken!qgis-attribute-table

Nach Schließen des Fensters öffnen wir den Export-Dialog Speichern als mit einem weiteren Rechts-Klick auf den Layer-Namen.

In dem aufgehenden Fenster muss als Format Keyhole Markup Language ausgewählt und ein Speicherort festgelegt werden. Unter mehr Einstellungen kann man nun die WKR_NR im Feld NameField eintragen und wenn man möchte, im Feld DescriptionField noch den Wahlkreisname WKR_NAME.qgis-export-dialog

Ältere Versionen von QGIS: In älteren Versionen von QGIS gibt es die beiden Felder Name- und Description-Field noch nicht. Hier gibt es nur eine Textfeld OGR Attributerzeugung. Um zum gleichen Ergebnis zu kommen, muss man hier einfach folgendes eintragen:

NameField=WKR_NR
DescriptionField=WKR_NAME

Mit einem Klick auf OK wird das KML exportiert. Ob alles geklappt hat, kann man überprüfen, indem man das KML mit Google Earth öffnet. Liegen die Wahlkreise dort wo sie liegen sollten (Deutschland) hat man gewonnen. Der Weiterverarbeitung der KML-Datei mit anderen Programmen und Anwendungen steht nun nichts mehr im Wege.

Für die Nerds: Durch das Ausfüllen von Name- und DescriptionField hat später jedes Polygon, beziehungsweise jeder Wahlkreis, die folgende Datenstruktur:

<Placemark>
    <name>1</name>
    <description>Flensburg Schleswig</description>
    <Polygon>9.982564417898971,54.644060720627934</Polygon>
</Placemark>

Happy coding!

Beitrag teilen: