GeoJSON Tutorial

Keine Kommentare

In meinem Artikel über die Identifizierung potentieller EX-Raid Arenen in Pokémon GO habe ich das Thema GeoJSON nur kurz als Exkurs erwähnt. Heute möchte ich etwas detaillierter in dieses Thema einsteigen.

GeoJSON Spezifikation

Was genau sind denn überhaupt Geodaten? Der entsprechende Wikipedia-Eintrag fasst dies sehr prägnant zusammen:

„Geodaten sind digitale Informationen, denen auf der Erdoberfläche eine bestimmte räumliche Lage zugewiesen werden kann (Geoinformation, Georeferenz).“

Die räumliche Lage wird in der Regel mit einer Koordinate aus Längen- und Breitengrad angegeben. Die grundlegenden geometrischen Formen, die man bei der Modellieriung verwendet, sind ein Punkt, eine Linie und eine Fläche, die in ihrer einfachsten Form durch ein Polygon abgebildet wird.

GeoJSON Primitive

Aus diesen Grundformen lassen sich komplexere Formen aggregieren.

Geodaten können in verschiedenen Formaten beschrieben werden. Um eines dieser Formate geht es heute: GeoJSON. Dabei handelt es sich um eine standardisierte, auf JSON basierende Notation.

Visualisierung von GeoJSON-Daten

Bei der Visualisierung wird wegen des Bezugs auf Koordinaten auf dem Erdball eigentlich immer eine Erdkarte im Hintergrund verwendet. Ich werde meine Beispiele über geojson.io darstellen. Dort kann man interaktiv GeoJSON editieren (und validieren lassen), verschiedene Karten-Anbieter verwenden und direkt GeoJSON-Dateien von GitHub einbinden.

GeoJSON-Dateien, die auf GitHub liegen, sind dort auch direkt visualisierbar.

Wenn man in eigenen Browser-basierten Anwendungen GeoJSON-Daten rendern möchte, kann man z.B. das Google Maps JavaScript API verwenden. Dazu schreibe ich vielleicht mal einen eigenen Artikel.

Nun kann es endlich losgehen …

Punkte und Features

Der einfachste Datentyp in GeoJSON ist ein Point.

{
    "type": "Point",
    "coordinates": [7.0069, 51.1623]
}

Der Wert des Attributs type bestimmt, um welche Art von Geodatum es sich handelt, im Attribut coordinates wird das Aussehen festgelegt. Bei einem Punkt sind dies seine Position, bestehend aus Längen- und Breitengrad in dieser Reihenfolge, dargestellt als Dezimalzahl. Optional kann ein dritte Zahl die Höhe über NN angeben, dann hätten wir eine 3-D-Koordinate. Im Folgenden werden wir uns aber auf den zweidimensionalen Raum beschränken.

Da ein Punkt keine Ausdehnung hat, wird er oft mit einem sog. Marker symbolisiert, der auf die Position des Punktes zeigt. Ohne weitere Angaben ist es dann der darstellenden Software überlassen, wie der Marker aussieht. Bei geojson.io wird ein grauer Standard-Marker verwendet:

GeoJSON Point

Da nackte Punkte optisch und auch fachlich wenig anschaulich sind, gibt es das sog. Feature. Das ist eine Erweiterung der eigentlichen Geometrie um Angaben zu dessen Darstellung und Metadaten. Als Feature sieht unser Punkt dann schon ansprechender aus:

GeoJSON Point Feature

Ein Feature besteht neben der geometry aus properties. Damit lassen sich zum einen beliebige fachliche Attribute wie name und address beschreiben. Zum anderen können so auch Farbe und Symbol des Markers festgelegt werden, was allerdings erstmal abhängig von der darstellenden Map ist. geojson.io verwendet die Symbole der MapBox-Bibliothek. Beim Klick auf den Marker wird ein Popup mit den Properties angezeigt.

In der Regel stellt man mehr als ein Geodatum dar. Daher gibt es die FeatureCollection, die dann ein Array von Features aufnimmt:

{
  "type": "FeatureCollection",
  "features": [
  {
    "type": "Feature",
    "properties": {
      "name": "codecentric AG",
      "address": "Hochstr. 11",
      "marker-color": "#008800",
      "marker-symbol": "commercial"
    },
    "geometry": {
      "type": "Point",
      "coordinates": [7.0069, 51.1623]
    }
  }
]
}

An der Darstellung eines einzigen Features ändert sich dadurch nichts.

Linien und Linienzüge

Eine Linie ist die Verbindung zweier Punkte. Verallgemeinert ist ein Linienzug die verkettete Verbindung von jeweils zwei aufeinanderfolgenden Punkten aus einer Menge von Punkten. In GeoJSON wird dies durch ein Objekt vom Typ LineString abgebildet:

GeoJSON LineString

Das Beispiel visualisiert den Planetenweg in Solingen-Ohligs. Bei einem LineString besteht das Attribut coordinates aus einer Liste mit mindestens zwei Punkten. Farbe und Strichstärke lassen sich über entsprechende Properties anpassen.

Polygone

Ein Polygon besteht aus einer (oder mehreren) Koordinaten-Listen, bei denen der erste und letzte Punkt identisch sind und die so eine geschlossene Fläche bilden:

GeoJSON Polygon

Daher beinhaltet das Attribut coordinates auch ein Array von Arrays von Koordinaten. Gibt man hier eine zweite (oder noch mehr) Koordinaten-Listen an, werden diese als „Löcher“ aus der ersten Fläche substrahiert:

GeoJSON Polygon w/ hole

Komplexe Datentypen

Mit den bisher vorgestellten Geodaten-Typen lassen sich bereits recht komplexe Sachverhalte modellieren und darstellen. Darüber hinaus gibt es in GeoJSON noch folgende Typen:

  • MultiPoint
  • MultiLineString
  • MultiPolygon

Allen diesen Multi-Typen ist gemein, dass sie im Attribut coordinates jeweils ein Array des entsprechenden einfachen Datentyps halten bei ansonsten gleichen Eigenschaften.

So lässt sich z. B. effizient eine Menge von 10.000 rot umrandeten, blau gefüllten Polygonen beschreiben, ohne eine FeatureCollection zu definieren, die bei jedem der 10.000 Features immer wieder die gleichen Farbwerte definiert.

Als Beispiel dient hier ein Karte, auf der das Hauptquartier der codecentric AG in Solingen mit allen Niederlassungen verbunden ist. Die Verbindungen sind mit einem MultiLineString realisiert:

GeoJSON MultiLineString

Zusammenfasssung

Sie haben alle wesentlichen Datentypen von GeoJSON kennengelernt und wissen nun, wie Sie diese visualisieren können.

Alle hier vorgestellten Beispiele finden Sie in meinen GitHub-Repository ttrelle/geojson-examples zum direkten Ausprobieren.

Tobias Trelle

Diplom-Mathematiker Tobias Trelle ist Senior IT Consultant bei der codecentric AG, Solingen. Er ist seit knapp 20 Jahren im IT-Business unterwegs und interessiert sich für Software-Architekturen und skalierbare Lösungen. Tobias hält Vorträge auf Konferenzen und Usergruppen und ist Autor des Buchs „MongoDB: Ein praktischer Einstieg“.

Weitere Inhalte zu Data Science

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.