Geodaten und Application Express: Oracle MAPS mit freien OpenStreetMap-Daten

Wie man mit dem frei verfügbaren Kartenserver von OpenLayers und den Daten des OpenStreetMap-Projekts eine Karte in eine Application Express-Anwendung integrieren kann, war Thema des Community-Tipps von Bruno Unberath. Allerdings wurde die Karte komplett vom externen OpenLayers-Server abgerufen; die Kombination von Fachdaten aus der lokalen Application-Express-Datenbank war nur mit umfangreicher JavaScript-Programmierung möglich.

Heute erfahren Sie, wie Sie die Kartendaten in Ihre Umgebung übernehmen und mit Hilfe von Oracle MAPS in Ihrer Anwendung darstellen können. Die Kombination der Kartendaten mit lokalen Fachdaten wird so wesentlich einfacher; außerdem lassen sich alle Möglichkeiten von Oracle MAPS auch mit der OpenStreetMaps-Karte nutzen.

Das Ziel: OpenStreetMap-Karte mit Oracle MAPS eingebettet in Application Express

Abbildung 1: Das Ziel: OpenStreetMap-Karte mit Oracle MAPS, eingebettet in Application Express

Dieser Tipp gehört zur Reihe Geodaten und Application Express und baut den bereits vorhandenen Tipps der Reihe auf. Heute werden wir die in der letzten Ausgabe genutzte OpenLayers-Karte also durch Oracle MAPS ersetzen. Oracle MAPS stellt die komplette Kartenansicht als AJAX-basierte Web-Oberfläche bereit, wobei die Kartendaten an sich weiterhin vom OpenStreetMap-Projekt kommen, also frei verfügbar sind. Die Application Express-Anwendung wird nun nicht mehr mit dem externen OpenLayers-Server integriert, sondern mit dem zur "lokalen" IT-Infrastruktur gehörenden Oracle MapViewer.

Vorbereitungen

Stellen Sie sicher, dass der Oracle MapViewer und Oracle MAPS installiert und konfiguriert sind. Hinweise zu Download, Installation und Setup des Oracle MapViewer finden Sie in diesem Dokument. Für diesen Tipp sind darin die Schritte 1, 2, 4 und 5 von Bedeutung.

Oracle MAPS wird heute mit einem Dienst im Internet kommunizieren. Wenn Sie sich hinter einer Firewall befinden, müssen Sie dem MapViewer den Proxy-Server bekanntmachen. Dies geschieht ebenfalls in der Datei mapviewerConfig.xml , welche Sie beim Einrichten des MapViewers bereits kennengelernt haben.

Konzept: Wie kommen die OpenStreetMap-Daten in Oracle MAPS?

Die Tipps 1 bis 5 dieser Reihe basieren auf dem Demo-Kartenmaterial von NAVTEQ, welches aus dem Oracle Technet heruntergeladen und in die Datenbank importiert werden kann. Oracle MAPS generiert die Karte dann anhand dieser Daten.

Für die Daten des OpenStreetMap-Projekts gibt es keinen Download, den man direkt in die Oracle-Datenbank importieren könnte. Neben dem Kartenserver OpenLayers stehen noch Web-Dienste bereit, die den Download von Daten im XML-Format erlauben.

Für dieses Beispiel wollen wir die OpenStreetMap-Daten daher nicht als "Spatial-Daten" ( SDO_GEOMETRY) in die Datenbank laden - wir sind ja nur an der Karte interessiert. Diese soll allerdings mit Oracle MAPS dargestellt werden. Um die OpenStreetMap-Karte in Oracle MAPS zu bekommen, kann man den frei verfügbaren WMS-Dienst der WhereGroup GmbH & Co. KG aus Bonn nutzen. WMS steht für Web Map Service und beschreibt einen Kommunikationsstandard für Kartenserver. Mehr zur Kommunikation mit Kartendiensten über das WMS-Protokoll finden Sie im Wikipedia-Artikel zu WMS. Dort können Sie auch nachlesen, wie Sie bei einem WMS-Dienst herausfinden, welche Karten er anbietet (getCapabilities). Oracle MAPS ist in der Lage, einen externen WMS-Dienst anzusprechen und einen Map Cache mit dessen Kartendaten aufzubauen. Mit dieser (statischen) Karte lassen sich dann ganz einfach die Fachdaten aus der lokalen Datenbank kombinieren.

Die OpenStreetMap-Karte wird per WMS-Dienst in Oracle MAPS eingebunden

Abbildung 2: Die OpenStreetMap-Karte wird per WMS-Dienst in Oracle MAPS eingebunden"

Einrichten des Map Cache

MapViewer Admin-Bereich Starten Sie Ihren Browser und navigieren Sie zur MapViewer-Startseite.

http://[Server-name]:8888/mapviewer
MapViewer Startseite

Abbildung 3: MapViewer Startseite

Klicken Sie oben rechts auf das Symbol Admin - im dann folgenden Login-Fenster melden Sie sich als Administrator der J2EE-Umgebung an. Der Username ist normalerweise oc4jadmin; das Passwort haben Sie beim ersten Start der MapViewer-Umgebung festgelegt.

MapViewer Administrationsbereich

Abbildung 4: MapViewer Administrationsbereich

Um eine neue Karte für die OpenStreetMap-Daten zu erzeugen, klicken Sie zunächst oben auf Manage Map Tile Layers und dann links auf Create, um einen neuen Map Tile Layer zu erzeugen. Da die Daten vom einem externen WMS-Dienst und nicht aus der Datenbank kommen, wählen Sie External als Data Source aus und klicken dann auf Continue (Abbildung 5). Achten Sie im folgenden darauf, dass Sie alle Angaben exakt wie hier vorgegeben machen; selbst scheinbar banale Dinge wie zusätzliche Leerzeichen führen später zu Fehlermeldungen.

Neuen Map Tile Layer erzeugen: Externe Datenquelle

Abbildung 5: Neuen Map Tile Layer erzeugen: Externe Datenquelle

Geben Sie dem Map Tile Layer zunächst einen Namen und wählen Sie eine MapViewer Data Source aus. Auch für externe Datenquellen benötigt Oracle MAPS eine Data Source; dort werden Metadaten zum WMS-Dienst abgelegt. Die o.g. Hinweise zu Installation und Setup des MapViewer beschreiben auch, wie eine Data Source eingerichtet wird - am besten ist es, wenn die Data Source das Parsing Schema der Application Express-Anwendung (wo auch alle anderen Tabellen liegen) nutzt.

Neuen Map Tile Layer erzeugen: Name und Datenbankverbindung für Metadaten festlegen

Abbildung 6: Neuen Map Tile Layer erzeugen: Name und Datenbankverbindung für Metadaten festlegen

Fahren Sie anschließend mit dem Ausfüllen des Formulars fort:

  • Als Map Service URL tragen Sie die Adresse des WMS-Dienstes ein:
    http://osm.wheregroup.com/cgi-bin/mapserv
    
  • Bei Adapter class muss exakt folgender Text eingetragen werden (achten Sie auf Groß- und Kleinschreibung):
    mcsadapter.WMSAdapter
    
  • Die Jar File Location müssen Sie auf Ihrem System nachsehen. Suchen Sie (ausgehend vom Verzeichnis, in welches die MapViewer-Umgebung installiert ist), nach der Datei mvadapter.jar. Sie befindet sich "recht tief" im Verzeichnisbaum der MapViewer-Umgebung; schauen Sie im Verzeichnis .../applications/mapviewer/web/WEB-INF im Ordner tileserver/mvadapter nach (Abbildung 7).

    Lage der Datei mvadapter.jar herausfinden

    Abbildung 7: Lage der Datei mvadapter.jar herausfinden

    Wenn Sie die Datei gefunden haben, tragen Sie den vollständigen Pfad zu dieser Datei inklusive des Dateinamen mvadapter.jar unter Jar File Location ein.

    Auf Unix/Linux-Systemen geben Sie den Pfad dann so an:

    /pfad/zur/mapviewer/umgebung/{...}/j2ee/home/applications/mapviewer/web/WEB-INF/tileserver/mvadapter/mvadapter.jar
    

    Auf Windows-Systemen beginnen Sie mit dem Laufwerkbuchstaben. Verwenden Sie dort allerdings nicht den üblichen Backslash (\), sondern den normalen Schrägstrich (/):

    C:/pfad/zur/mapviewer/umgebung/{...}/j2ee/home/applications/mapviewer/web/WEB-INF/tileserver/mvadapter/mvadapter.jar
    
Adresse des WMS-Dienstes und Java-Klasse für den WMS-Adapter einrichten

Abbildung 8: Adresse des WMS-Dienstes und Java-Klasse für den WMS-Adapter einrichten

Dann geht es mit dem Ausfüllen des Formulars weiter - bei der Checkbox für die Adapter Properties. Markieren Sie sie - daraufhin sollte das Formular sich erweitern.

Adapter Properties (WMS-Parameter) einrichten

Abbildung 9: Adapter Properties (WMS-Parameter) einrichten

Mit einem Klick auf die Schaltfläche Add fügen Sie einen neuen WMS-Parameter hinzu. Fügen Sie folgende fünf WMS-Parameter hinzu (achten Sie darauf, dass ab dem zweiten Parameter stets einer markiert ist, wenn Sie auf Add klicken).

Adapter Properties (WMS-Parameter) einrichten

Abbildung 10: Adapter Properties (WMS-Parameter) einrichten

Die Parameter für Copy & Paste ...

namevalue
serviceWMS
srsEPSG:31467
layersOSM_Basic
map/data/umn/osm/osm_basic.map
formatimage/png

Fahren Sie danach beim Eingabefeld für die Tile Storage fort. Wenn Sie die vom WMS-Dienst abgeholten Karten in einem speziellen Verzeichnis ablegen möchten, tragen Sie es dort ein - ansonsten lassen Sie das Feld unverändert; MapViewer wählt das Verzeichnis dann selbst aus. Ändern Sie die SRID auf 31467 um und geben Sie 0 (Null) für MinX und MinY und 10000000 (Zehn Millionen) für MaxX und MaxY ein. Für die Experten: Die SRID 31467 fordert die Karte als Gauss-Krüger-Projektion an.

Koordinatensystem und Kartenraum konfigurieren umstellen

Abbildung 11: Koordinatensystem und Kartenraum konfigurieren umstellen

Lassen Sie alle anderen Felder unverändert. Bevor Sie nun unten im Formular auf die Schaltfläche Submit klicken, um die Karte in Oracle MAPS zu erzeugen, überprüfen Sie nochmals alle Angaben - achten Sie dabei darauf, dass die Angaben exakt wie in diesem Dokument gemacht sind. Die Groß- und Kleinschreibung ist dabei ebenso bedeutsam wie die Tatsache, dass vor und nach den Parametern keine zusätzlichen Leerzeichen vorhanden sein dürfen.

Der neue Map Tile Layer wurde erzeugt

Abbildung 12: Der neue Map Tile Layer wurde erzeugt

Die neue Karte in Application Express nutzen

Navigieren Sie nun zu Ihrer Application Express-Anwendung - fügen Sie ihr eine neue Seite hinzu und versehen Sie diese mit einer neuen Region Karte vom Typ HTML. Diese Seite sollte dann wie folgt aussehen:

Anwendungsseite: (noch) ohne Oracle Maps

Abbildung 13: Anwendungsseite: (noch) ohne Oracle Maps

Navigieren Sie nun wiederum zum Quelltext der HTML-Region und hinterlegen Sie folgenden Code:

<div id="map" style="left:0; top:0;width: 600px; height: 400px">
</div>

Der nötige JavaScript-Code wird im Seiten-Header hinterlegt:

<script src="/mapviewer/fsmc/jslib/oraclemaps.js"></script>
<script type="text/javascript">
  var baseURL  = "http://"+document.location.host+"/mapviewer";
  var mapCenterLon = 10;
  var mapCenterLat = 50;
  var mapZoom      = 0;

  var mapview;
  var mpoint = MVSdoGeometry.createPoint(mapCenterLon,mapCenterLat,8307);

  function show_map() {
    mapview = new MVMapView(document.getElementById("map"),baseURL);      
    var basemap  = new MVBaseMap("geows.OPENSTEETMAP_WMS");
    mapview.addBaseMapLayer(basemap);
    mapview.setCenter(mpoint);
    mapview.setZoomLevel(mapZoom);
    mapview.addNavigationPanel("WEST");
  
    mapview.display();
  }
</script>

Rufen Sie die erzeugte JavaScript-Funktion show_map() im onLoad-Handler des HTML Body Tags auf (Sie müssen zusätzlich das Feld Cursor-Fokus auf Cursor nicht fokussieren stellen):

Aufruf der JavaScript-Funktion im HTML Body Tag
Cursor-Fokus in den Seitenattributen nicht setzen

Aufruf der JavaScript-Funktion im HTML Body Tag und Einrichten des Cursor-Fokus

Die Dokumentation für die JavaScript-Bibliothek ist auf Ihrem MapViewer-Server bereits vorhanden. Geben Sie einfach im Browser folgende URL ein:

http://[mapviewer-host]:[port]/mapviewer/fsmc/apidoc/index.html

Dort finden Sie eine genaue Beschreibung der hier verwendeten und aller verfügbaren JavaScript-Aufrufe. Starten Sie die Seite nun. Wenn Sie den Kartenaufbau verfolgen, fällt Ihnen wahrscheinlich sofort auf, dass die Karte aus mehreren Kacheln besteht. Sie können den Kartenausschnitt nun bequem mit der Maus per Drag & Drop verschieben oder über die Navigationsleiste links oben verschieben - auch das Herein- und Herauszoomen ist mit der Navigationsleiste ganz einfach: Probieren Sie es aus!

Das Ergebnis: Deutschlandkarte mit Oracle Maps - in Application Express

Abbildung 14: Das Ergebnis: OpenStreetMap-Karte mit Oracle Maps - in Application Express

Oracle Maps ermittelt zunächst, welche Kacheln nötig sind, um den angeforderten Kartenausschnitt darzustellen. Ist die Kachel bereits im Map Cache enthalten, so wird sie sofort ausgeliefert, andernfalls wird sie zuerst erstellt. Aus diesem Grund dauert der erste Abruf einer Kachel stets länger.

Um diese Wartezeiten für den Endanwender zu vermeiden, besteht die Möglichkeit, die Kacheln im voraus zu generieren. Navigieren Sie dazu in den Administrationsbereich des MapViewer und dort zu Manage Tile Layers. Wählen Sie Ihren Layer OPENSTREEPMAP_WMS aus und klicken Sie die Schaltfläche View Map / Manage Tiles. Dort können Sie sich die Karte ansehen und Kacheln für von Ihnen gewählte Kartenausschnitte und Zoom Levels im voraus generieren lassen. Ist eine Kachel einmal im Cache vorhanden, wird der externe WMS-Dienst bis zum Löschen des Cache nicht mehr angesprochen.

Administrationsbereich des MapViewers: Kacheln im Voraus berechnen

Abbildung 15: Administrationsbereich des MapViewers: Kacheln im Voraus berechnen

Stellen Sie die Zoom-Level und den Kartenausschnitt ein, für den Sie die Kacheln vorberechnen möchten; klicken Sie anschließend auf Prefetch Tiles. Die Kacheln werden dann im Hintergrund vom WMS-Dienst abgeholt - bis der MapViewer damit fertig ist, kann allerdings einige Zeit vergehen.

Dynamische Elemente hinzufügen: Features Of Interest!

Im letzten Teil geht es nun darum, die in 3. Tutorial: Die Karte wird erweitert per Zufallsgenerator generierten und in der Tabelle KUNDEN enthaltenen Daten in die Karte einzubinden (SQL-Skript zum Erstellen der Tabelle). Lassen Sie das SQL-Skript im SQL Developer oder in SQL*Plus laufen, nehmen Sie nicht den SQL Workshop in Application Express.

In Oracle Maps werden solche Daten als Features Of Interest (FOI) eingebunden. Features Of Interest müssen vorher in der Datenbank als MapViewer Theme definiert sein. Dies kann mit dem Werkzeug Oracle MapBuilder, welches im Paket der MapViewer-Software enthalten ist (mapbuilder.jar), erfolgen (Abbildung 9).

Kartendefinitionen mit dem Oracle Map Builder

Abbildung 16: Kartendefinitionen mit dem Oracle Map Builder

Mit dem MapBuilder kann aus Aussehen der Karten komplett selbst definiert werden. Die Styles definieren, wie etwas gezeichnet wird, die Themes legen fest, wo die Daten herkommen und welcher Style zur Darstellung verwendet wird. Die Base Maps bestehen schließlich aus mehreren übereinandergelegten Themes und bilden so eine vordefinierte Karte. Sie können sich mit dem MapBuilder auch die bereits vorhandenen Kartendefinitionen des NAVTEQ World Sample ansehen und ggfs. verändern.

Das Theme, welches für die dynamische Darstellung der Kunden benötigt wird, soll nun durch ein einfaches SQL INSERT erstellt werden - hier verwenden wir den MapBuilder nicht. Setzen Sie das folgende SQL-Kommando von SQL*Plus aus (nicht dem SQL Workshop) ab. Melden Sie sich im SQL*Plus mit dem Parsing Schema Ihrer Application Express-Anwendung an.

insert into user_sdo_themes (
  NAME,
  DESCRIPTION,
  BASE_TABLE,
  GEOMETRY_COLUMN,
  STYLING_RULES
) values (
  'KUNDEN',
  null,
  'KUNDEN',
  'LOKATION',
  '<?xml version="1.0" standalone="yes"?>
     <styling_rules>
       <hidden_info>
         <field column="ID" name="#"/>
         <field column="NAME" name="Name"/>
       </hidden_info>
       <rule>
         <features style="M.CYAN PIN"> </features>
       </rule>
     </styling_rules>'
)
/

Navigieren Sie in Ihrer Application Express-Anwendung wieder zum Seiten-Header und ändern Sie den JavaScript-Code wie folgt um:

<script src="/mapviewer/fsmc/jslib/oraclemaps.js"></script>
<script type="text/javascript">
  var baseURL  = "http://"+document.location.host+"/mapviewer";
  var mapCenterLon = 10;
  var mapCenterLat = 50;
  var mapZoom      = 0;

  var mapview;
  var mpoint = MVSdoGeometry.createPoint(mapCenterLon,mapCenterLat,8307);

  function show_map() {
    mapview = new MVMapView(document.getElementById("map"),baseURL);      
    var basemap  = new MVBaseMap("GEOWS.OPENSTREETMAP_WMS");
    mapview.addBaseMapLayer(basemap);
    mapview.setCenter(mpoint);
    mapview.setZoomLevel(mapZoom);
    mapview.addNavigationPanel("WEST");
    
    var foi_kunden = new MVThemeBasedFOI('foi_kunden','geows.kunden');
    foi_kunden.setVisible(false);
    mapview.addThemeBasedFOI(foi_kunden);   
  
    mapview.display();
  }
  
  function setVisible(foi_name) {
    var foi = mapview.getThemeBasedFOI(foi_name); 
    foi.setVisible(!foi.isVisible());
  }
</script>

Um einen Link als "Schalter" für die Kunden einzurichten, ändern Sie den HTML-Code der Region Karte wie folgt:

<div id="map" style="left:0px; top:0px; width:600px; height: 400px">
</div>
<div>
<a href="javascript:setVisible('foi_kunden');">Kunden ein/ausblenden</a>
</div>

Starten Sie die Seite anschließend neu. Klicken Sie dann einmal auf den Link Kunden ein/ausblenden unterhalb der Karte - dann sollte für jeden Kunden eine Stecknadel auf Ihrer Karte erscheinen. Mit nochmaligem Klick auf den Link verschwinden die Stecknadeln wieder.

Das Ergebnis: Die Karte mit dynamisch ein- und ausblendbaren Informationen zu Kunden

Abbildung 17: Das Ergebnis: Die Karte mit dynamisch ein- und ausblendbaren Informationen zu Kunden

Das ist jedoch noch nicht alles. Wenn Sie auf eine der Stecknadeln klicken, wird ein Information Window mit Details zu diesem Kunden eingeblendet - im Moment sind dies lediglich die ID und der Name - mehr Informationen gibt es zu diesen zufällig generierten "Kunden" nicht. Im einer "realen" Applikation können auf diesem Weg weitere Informationen wie die komplette Adresse oder Angaben zum Umsatz angezeigt werden.

Zusammenfassung und Ausblick

Sie haben hier nun Kartendaten des freien OpenStreetMap-Projekts als Kacheln in Oracle MAPS und damit in Ihre Infrastruktur übernommen und darüber hinaus mit Daten aus Ihrer lokalen Tabelle kombiniert. Da nun die Möglichkeiten der Datenbank und von Oracle MAPS genutzt werden können, wird gerade diese Integration sehr einfach.

Übrigens nutzt nicht nur die WhereGroup den WMS-Standard zur Bereitstellung eines Kartendienstes. Auch die Landesvermessungsämter der einzelnen Bundesländer stellen Kartendaten und Luftbilder über diese Schnittstelle bereit - eine Übersicht finden Sie hier. Achten Sie dabei allerdings an die Lizenz- und Nutzungsbedingungen; diese Daten sind nicht frei. Nehmen Sie ggfs. Kontakt zu den auf der Übersichtsseite gelisteten Ansprechpartnern auf.

Abbildung 18 zeigt, wie - analog zur in diesem Tipp geschilderten Vorgehensweise - ein WMS-Dienst für Luftbilder (Digitale Orthofotos) eingebunden und in Application Express dargestellt werden kann. Die Vorgehensweise ist die gleiche - ein anderer WMS-Dienst erwartet jedoch andere Parameter; hierfür benötigen Sie ein wenig Hintergrundwissen über WMS (siehe Wikipedia-Artikel) und die Antwort des Dienstes auf eine getCapabilities-Anfrage. Mit diesen Informationen sollte es ein Leichtes sein, den entsprechenden WMS-Dienst in Oracle MAPS einzurichten.

Einbindung eines anderen WMS-Dienstes - hier: Digitale Orthofotos

Abbildung 18: Einbindung eines anderen WMS-Dienstes - hier: Digitale Orthofotos

Zurück zur Community-Seite