Montag, 30. Mai 2011

Aus Oracle nach Google Earth mit Hilfe von KML

Das SDO_UTIL Package (Utility) bietet seit der Version 11g der Oracle Datenbank neue Möglichkeiten für einen direkten Umgang mit der Keyhole Markup Language (KML). 

So können beispielsweise spatiale Geometrien mit Hilfe der Funktion sdo_util.to_kmlgeometry in KML umgewandelt werden. Umgekehrt können mit Hilfe der Funktion sdo_util.from_kmlgeometry KML-Geometrien in spatiale Geometrien umgewandelt werden. 

In diesem Artikel erfahren Sie, wie die Funktion  sdo_util.to_kmlgeometry angewendet wird und wie Sie das Ergebnis zu einem vollständigen KML-Dokument, welches anschließend in Google Earth geladen wird, umwandeln können.  

Schauen wir uns einen einfachen Anwendungsfall an:
SELECT sdo_util.to_kmlgeometry(geometry) KML
FROM  M_ADMIN_AREA2
WHERE
feature_name = 'BERLIN';
Als Ergebnis dieser Abfrage erhalten wir eine KML-Geometrie für das Bundesland Berlin:

KML
---------------------------------------------------------------------------
<Polygon><extrude>0</extrude><tessellate>0</tessellate><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><coordinates>
13.56177,52.5804 13.54188,52.58915 13.53483,52.59068 13.50847,52.59241 13.49723,52.60583 13.49827,52.60961 13.50573,52.62563 13.51852,52.63162 13.52244,52.64464 13.5124,52.64478 13.49034,52.65466 13.48478,52.65872 
...
...
13.65677,52.52511 13.65713,52.52987 13.62592,52.53013 13.62523,52.53815 13.63451,52.53879 13.63662,52.54234 13.58706,52.54958 13.58239,52.56993 13.56894,52.57295 13.56177,52.5804
</coordinates></LinearRing></outerBoundaryIs></Polygon>
---------------------------------------------------------------------------
Wenn Sie dieses Ergebnis in einer KML-Datei abspeichern und diese Datei in Google Earth öffnen, dann wird die oben abgefragte Geometrie zunächst nicht angezeigt. Zu einem vollständigen KML-Dokument fehlen neben dem XML-Header noch einige Angaben, die wir mit Hilfe der XML DB, einem Feature welches in jeder Oracle Datenbank enthalten ist, ergänzen werden.

Überprüfen Sie zuerst, ob XML DB bei der Datenbank-Installation mit installiert wurde. Führen Sie dazu im SQL*PLUS die folgende Abfrage aus:
select comp_name, status from dba_registry where comp_name='Oracle XML Database';
Falls diese Funktionalität in Ihrer Datenbank nicht installiert sein sollte, dann können Sie das XML DB Repository mit Hilfe des folgenden Scripts nachinstallieren
 $ORACLE_HOME/rdbms/admin/catqm.sql
Kommen wir zu unserer Ausgangsabfrage zurück und ergänzen diese um die fehlenden Angaben:
SELECT
  xmlelement("kml",
   xmlattributes('http://www.opengis.net/kml/2.2' as "xmlns"),
   xmlelement("Document",
    xmlelement("Placemark",
     xmlelement("name", 'Berlin'),
     xmlelement("Description", 'Flaeche des Bundeslandes Berlin'),
     xmltype(sdo_util.to_kmlgeometry(geometry))
    )
   )
  )
FROM  M_ADMIN_AREA2 WHERE
feature_name = 'BERLIN';
 Das Ergebnis bildet ein vollständiges KML-Dokument:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>Berlin</name>
<Description>Flaeche des Bundeslandes Berlin</Description>
<Polygon>
<extrude>0</extrude>
<tessellate>0</tessellate>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>13.56177,52.5804 13.54188,52.58915 13.53483,52.59068 13.50847,52.59241 13.49723,52.60583 13.49827,52.60961 13.50573,52.62563 13.51852,52.63162 13.52244,52.64464 13.5124,52.64478 13.49034,52.65466 ...
...
...
13.62592,52.53013 13.62523,52.53815 13.63451,52.53879 13.63662,52.54234 13.58706,52.54958 13.58239,52.56993 13.56894,52.57295 13.56177,52.5804
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
Speichern Sie das Dokument ab und öffnen Sie es in Google Earth:

Spatiale Geometrie in Google Earth
Mit Hilfe der XML-Funktionen können Sie das KML-Dokument erweitern und weitere Attribute hinzufügen. Probieren Sie diese Abfrage aus:

SELECT
  xmlelement("kml",
   xmlattributes('http://www.opengis.net/kml/2.2' as "xmlns"),
   xmlelement("Document",
    xmlelement("name", 'Berlin.kml'),
    xmlelement("StyleMap", XMLATTRIBUTES('mp' as "id"),
     xmlelement("Pair",
       xmlelement("key",'normal'),
       xmlelement("styleUrl",'#mp_border')
     )
    ),
    xmlelement("Style", XMLATTRIBUTES('mp_border' as "id"),
     xmlelement("LineStyle",
       xmlelement("color",'ffff0000'),
       xmlelement("width",'10')
     )
    ),
    xmlelement("Placemark",
     xmlelement("name", 'Berlin'),
     xmlelement("styleUrl", '#mp'),
     xmlelement("Description", 'Flaeche des Bundeslandes Berlin'),
     xmltype(sdo_util.to_kmlgeometry(geometry))
    )
   )
  )
FROM  M_ADMIN_AREA2 WHERE feature_name = 'BERLIN';
Als Ergebnis erhalten Sie einen blauen Rand um die angezeigte Geometrie:

Spatiale Geometrie mit blauer Umrandung in Google Earth

1 Kommentar:

  1. Hallo, gute und einfache Erklärung, aber es fehlt der Hinweis, dass in KML nur WGS 84 unterstützt wird. Ist eventuell noch ein wichtiger Hinweis für die Leute, die später in Google ihre Daten suchen... ;-)

    Gruß, Arnd Spiering

    AntwortenLöschen