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.
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.
1{ 2 "type": "Point", 3 "coordinates": [7.0069, 51.1623] 4}
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:
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:
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:
1{ 2 "type": "FeatureCollection", 3 "features": [ 4 { 5 "type": "Feature", 6 "properties": { 7 "name": "codecentric AG", 8 "address": "Hochstr. 11", 9 "marker-color": "#008800", 10 "marker-symbol": "commercial" 11 }, 12 "geometry": { 13 "type": "Point", 14 "coordinates": [7.0069, 51.1623] 15 } 16 } 17] 18}
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:
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:
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:
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:
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.
Weitere Beiträge
von Tobias Trelle
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Tobias Trelle
Software Architect
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.