Donnerstag, 24. Mai 2012


Artikel

Mai 2010 | Artikel

JAK – Java API for KML

(Link zum Artikel: http://www.entwickler.de/jaxenter//003111)

Open Source Geo

Text: Florian Bachmann
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Das Open-Source-Projekt Java API for KML (kurz JAK) bietet eine komfortable Möglichkeit, mittels einer objektorientierten Java-Schnittstelle KML-Dateien zu erstellen, zu speichern, zu laden und zu bearbeiten. JAK ist ein objektorientiertes API (Application Programming Interface), das die Nutzung von KML in bestehenden Java-Umgebungen ermöglicht.

Mit JAK ist es möglich, KML in Java zu erstellen, zu speichern (marshal), zu laden (unmarshal), zu editieren und auf Korrektheit zu validieren. Dies ist sowohl für KML- als auch für KMZ-Dokumente möglich (gezippte KML-Dokumente). Das API wurde als Open-Source-Projekt unter der New BSD License veröffentlicht und ist auf labs.micromata.de frei zur Verfügung gestellt.

KML ist eine XML-basierte Auszeichnungssprache (Markup Language), um Geodaten darzustellen. Bekannte Anwendungsfälle sind webbasierte Karten (2-D – Google Maps) oder so genannte "Earth Browser" (3-D – Google Earth, NASAs Earth Wind und Microsofts Virtual Earth). Es wurde im April 2008 vom Open Geospatial Consortium (OGC) als offizieller Standard verabschiedet.

JAK deckt die Referenzimplementierung des von der OGC verabschiedeten KML-Standards ebenso wie Googles GX-Erweiterung für KML in Java komplett ab. Die Besonderheit von JAK ist, dass das komplette API automatisch aus dem vom OGC definierten Schema erzeugt wird. Dies bietet den Vorteil, dass JAK das zugrunde liegende Schema komplett widerspiegelt und Änderungen am Schema (infolge einer Schema-Weiterentwicklung) sofort in das API einfließen. Somit entfallen aufwendige und fehleranfällige Anpassungsarbeiten per Hand eines jeden Elements, das im KML-Standard definiert ist.

JAK profitiert dabei von JAXB (Java Architecture for XML Binding). JAXB bietet die Möglichkeit, Java-Klassen aus dem vom OGC definierten KML-Schema heraus zu generieren. Die erzeugten POJOs werden automatisch mit Mapping-Regeln versehen. Diese Mapping-Regeln sind Java-Annotationen, die zur Laufzeit ausgewertet werden. Sie definieren, wie Java-Objekte in XML umgewandelt werden. Anhand dieser Annotationen ist JAXB in der Lage, die generierten Klassen zu marshallen und zu unmarshallen. Beim Marshallen durchläuft JAXB einen Graph von POJOs und erstellt eine äquivalente XML-Repräsentation, ähnlich der von Java bekannten Serialisierung von Objekten. Dieser Ansatz ermöglicht (Java-)Programmierern, vertraute Methoden zu verwenden, um auf Schema-basierte XML-Daten zuzugreifen. Die Gegenrichtung – XML-Daten in Java-Objekte zu transferieren – wird als Unmarshalling bezeichnet. Dies hat den Vorteil, dass es nicht notwendig ist, einen eigenen XML/KML-Parser zu entwickeln bzw. einen Objektgraphen in eine Textdatei zu serialisieren.

Es wäre ein Leichtes, POJOs für das KML-Schema des OGC mittels JAXB zu generieren und sie als API auszugeben. Ein gutes API besteht jedoch aus mehr als ein paar generierten POJOs.

Das Projekt ist im Rahmen einer von der Micromata GmbH in Auftrag gegebenen Masterarbeit der Universität Kassel entstanden. Die Zielsetzung hatte der Kasseler Experte für Software Engineering klar definiert: Es sollte eine Open-Source-basierte Java-Schnittstelle entwickelt werden, die einen direkten und einfachen Zugang zu KML ermöglicht. Dabei stand von Anfang an fest, dass die Ergebnisse der Arbeit der Allgemeinheit als Open-Source-Version zur Verfügung gestellt werden.

APIs für XML-Dialekte werden üblicherweise in zwei Schichten implementiert. Die erste Schicht besteht aus den automatisch generierten Klassen. Automatisch generierter Code ist oftmals kein Paradebeispiel für einen nutzerfreundlichen Code. Dies gilt vor allem für den Standardcode, der von JAXB generiert wird. Er ist für die Gestaltung eines funktionalen und leicht zu benutzenden API suboptimal. Deshalb wird über diesen eine zweite (meist) von Hand programmierte Schicht gelegt, die auf die untere Schicht zugreift und das semantische Modell sowie deren wohlgeformte Zugriffsmethoden nach außen definiert.

JAXB bietet einen Plug-in-Mechanismus, der es ermöglicht, auf das semantische Modell des Schemas zuzugreifen und den zu generierenden Code zu beeinflussen. JAK macht sich diese Eigenschaften zunutze und bietet ein JAXB-Plug-in namens XJCPluginJavaApiforKML an. Dieses Plug-in ist in der Lage, die semantische Schicht des KML-API komplett automatisch zu generieren. Dadurch wird JAK in ein in sich konsistentes API verwandelt, das mehr ist als nur ein paar automatisch von JAXB generierte POJOs mit ihren Settern und Gettern. Es gibt JAK eine Struktur und erzeugt ein wohldefiniertes API, das genau auf KML zugeschnitten ist. Von Hand geschriebener Code ist somit obsolet und beide Schichten verschmelzen zu einer.

Um das API zu nutzen, ist es nicht relevant, den automatischen Generierungsprozess von JAKs zu verstehen. Es reicht völlig aus, die Struktur des generierten Codes, also das Resultat, zu verstehen und zu verwenden.

JAK ist ein Java-API, das KML erzeugen, speichern, einlesen und verändern kann. Dabei stellt es mit seinem Fluent-Interface und seinen vielen Komfortfunktionen mehr als nur eine bloße Ansammlung von automatisch generierten POJOs dar, dank derer das Hantieren mit riesigen KML-Datenmengen Spaß macht.

  1. http://labs.micromata.de/display/jak/Home

Kommentare