Auf den Ort kommt es an: Geodaten in Application Express-Anwendungen nutzen

Kennen Sie Google Maps? Wahrscheinlich schon.

Dann stellt sich die Frage, ob geografische Informationen auch in Ihren Anwendungen einen Nutzen stiften können.

Der geografische Ort wird meist nur indirekt verwendet, etwa als postalische Adresse oder als Kennziffer für das Vertriebsgebiet - was für viele Aufgabenstellungen völlig ausreichend ist. Der erfolgreiche Einsatz von Navigationssystemen oder Diensten wie Google Maps zeigt deutlich, welchen Stellenwert Anwendungen mit Ortsbezug erreichen können. Auf die gleiche Weise kann die Verwendung geografischer Informationen in Ihren Application Express-Anwendungen deutlich zur Wertschöpfung beitragen.

So wird zum Beispiel die Frage, welche Kunden im Umkreis um eine bestimmte Filiale wohnen, durch die Verwendung von Geokoordinaten exakt beantwortet. Solche Informationen können hervorragend als Entscheidungsgrundlage für den Einsatz von Ressourcen oder zur Planung von Kampagnen dienen. Es entstehen vielfältige Möglichkeiten - mit Business Intelligence oder Geomarketing seien hier nur zwei Beispiele genannt.

In dieser und einigen der folgenden Ausgaben werden Sie daher mehr über geografische Informationen (Geodaten) in der Oracle-Datenbank und zum Umgang mit denselben in Application Express erfahren. Das Ziel wird es sein, räumliche Informationen mit fachlichen zu kombinieren und zusätzlich eine Landkarte mit Informationen über Standorte, Kunden oder Vertriebsgebiete in Ihre Application Express-Anwendung zu integrieren.

Zu Beginn benötigen Sie einige Geodaten zum Ausprobieren und zum "Spielen". In der Vergangenheit war genau dies das Problem - umfassende Geodaten zum Testen waren nur schwierig zu bekommen. Dieses Problem ist behoben: Inzwischen finden Sie im Oracle Technet Geodaten von NAVTEQ zum kostenlosen Download. Laden Sie sich das "World Sample" herunter - Es enthält:

  • Ländergrenzen
  • Administrative Bereiche (Bundesländer, Regierungsbezirke)
  • Wichtige Fernstraßen (Major Highways)
  • Städte (für Deutschland sind auch kleinere Orte dabei)

Sie benötigen ca. 600 MB freien Plattenplatz für die Geodaten - ein eigenes Tablespace ist empfehlenswert. Das ZIP-Archiv enthält in der README-Datei Anweisungen zum Importieren der Daten mit Data Pump - unter Umständen müssen Sie den Import gemeinsam mit dem Datenbankadministrator durchführen. Achten Sie darauf, dass Sie von Ihrem Application Express-Workspace aus Zugriff auf die erzeugten Tabellen haben - Importieren Sie also in Ihr Workspace-Schema oder vergeben Sie (wenn die Tabellen in ein anderes Schema importiert werden) entsprechende SELECT-Privilegien. Ihre Datenbankversion muss mindestens 10g Release 2 (10.2.0.x) sein.

Übrigens: Die hier vorgestellte Geodaten-Technologie ist, soweit nicht anders erwähnt, in allen Editionen der Datenbank vorhanden. Die Spatial-Option muss nur bei Verwendung bestimmter Funktionalitäten lizensiert werden - werden solche Funktionalitäten hier verwendet, so wird dies ausdrücklich erwähnt.

Wenn Sie die Daten erfolgreich importiert haben, stehen in Ihrem Workspace mehrere neue Tabellen bereit - Abbildung 1 zeigt eine der Tabellen (WORLD_CITY_SMALL) im SQL Workshop.

Geodaten-Tabellen im SQL Workshop

Abbildung 1: Geodaten-Tabellen im SQL Workshop

Die Geokoordinaten selbst befinden sich in der Tabellenspalte GEOMETRY. Lässt man sich die Tabelle beschreiben, so erfährt man, dass diese vom Datentyp SDO_GEOMETRY ist. SDO_GEOMETRY speichert in der Oracle-Datenbank räumliche Daten als geometrische Objekte.

  • Punkte beschreiben einen Ort, bspw. die Lokation eines Kunden
  • Linienzüge können Wege (Strassen oder Schienenwege) beschreiben
  • Polygone beschreiben Flächen, bspw. Seen oder Bundesländer
    Das Land "Niedersachsen" ist dabei ein "Polygon mit Loch"; da Bremen ein eigenes Bundesland ist, muss dessen Fläche aus der von Niedersachsen ausgenommen werden.

Alle Daten eines geometrischen Objektes sind in SDO_GEOMETRY enthalten, neben Angaben über den Typ (Punkt, Linie, Polygon, ...) also auch alle Koordinaten. Der Aufbau von SDO_GEOMETRY folgt dem Industriestandard OGC Simple Features For SQL und ist vollständig dokumentiert. Die Geodaten des World Sample, welche Sie importiert haben, verwenden Längen- und Breitengrade als Koordinaten (für die Experten: WGS84) - dies lässt sich auf einfachem Wege nachprüfen. Abbildung 2 zeigt, wie Sie im SQL-Workshop die Koordinaten von München selektieren.

Längen- und Breitengrade von München

Abbildung 2: Längen- und Breitengrade von München

select 
  e.geometry.sdo_point.y "Breite",
  e.geometry.sdo_point.x "Länge" 
from world_city_metropolis e
where name='MÜNCHEN'

Mit diesen Grundlagen wollen wir eine erste Application Express-Anwendung erstellen - sie enthält zwar (noch) keine Karte, wird aber schon in der Lage sein, räumliche Berechnungen durchzuführen. Erstellen Sie also eine neue Application Express-Anwendung mit wenigstens einer leeren Seite (Abbildung 3).

Eine leere Application Express-Anwendung

Abbildung 3: Eine leere Application Express-Anwendung

Fügen Sie Ihrer Anwendung zunächst eine Entferungstabelle hinzu. Dazu arbeiten Sie mit der Tabelle WORLD_CITY_CAPITAL, welche 61 Hauptstädte enthält. Starten Sie mit einer Auswahlliste, in welcher Sie eine der Städte auswählen können. Nennen Sie die Liste P1_START_CITY. Das SQL für die Werteliste sollte wie folgt aussehen:

select initcap(name) d, name r from world_city_capital order by 2

Nachdem Sie eine neue Schaltfläche Go zum Absenden der ausgewählten Stadt eingerichtet haben (wählen Sie eine Schaltfläche, die zwischen den Elementen der Region dargestellt wird), fügen Sie nun einen Bericht mit der Entfernungstabelle hinzu. Zur Berechnung des Abstands zwischen zwei Geometrie-Objekten dient die Funktion SDO_GEOM.SDO_DISTANCE. Sie berücksichtigt nicht nur die Tatsache, dass die Erde eine Kugel (oder genauer: ein Ellipsoid) ist, sondern darüber hinaus die Besonderheit, dass der kürzeste Weg manchmal über die Pole führen kann.

SDO_GEOM.SDO_DISTANCE wird mit vier Parametern aufgerufen:

  1. Die Geometrie, von der aus der Abstand gerechnet wird
  2. Die Geometrie, zu der Abstand gerechnet wird
  3. Die "Toleranz"; diese setzen wir hier mit einem Meter (1m) fest
  4. Die Einheit, in der das Ergebnis zurückgeliefert werden soll

Demnach sieht die SQL-Abfrage für den Bericht wie folgt aus:

select
  d.name, 
  sdo_geom.sdo_distance(
    a.geometry,
    d.geometry,
    1,
    'unit=KM'
  ) entfernung,
  d.population 
from world_city_capital a, world_city_capital d
where a.name = :P1_START_CITY and d.name != :P1_START_CITY

Das Ergebnis sollte dann in etwa wie in Abbildung 4 aussehen.

Entfernungstabelle: Berechnung mit SDO_GEOM.SDO_DISTANCE

Abbildung 4: Entfernungstabelle: Berechnung mit SDO_GEOM.SDO_DISTANCE

Der praktische Nutzen dieser Anwendung wird sofort klar - eine solche Abfrage ist natürlich auch mit den Lokationen der eigenen Kunden denkbar; man kann also herausfinden, wie weit Kunden von der nächsten eigenen Niederlassung entfernt sind ... (und ob dies etwas mit dem Umsatz zu tun hat) ...

Die Frage kann jedoch auch anders gestellt werden. Welche Städte befinden sich innerhalb einer bestimmten Distanz? Diese Fragestellung kennen Sie wahrscheinlich bereits aus der ein oder anderen Internet-Seite: Viele Dienste geben Ihnen zu einem bestimmten Ort an, welche Theater, Hotels oder andere Dinge sich innerhalb einer bestimmten Distanz befinden.

Fügen Sie Ihrer Anwendung also ein neues Textfeld hinzu, in welches die gewünschte maximale Distanz eingegeben werden kann. Nennen Sie es P1_MAX_DISTANZ. Ändern Sie anschließend das SQL Ihres Berichtes wie folgt:

select
  d.name, 
  sdo_geom.sdo_distance(
    a.geometry,
    d.geometry,
    1,
    'unit=KM'
  ) entfernung,
  d.population 
from world_city_capital a, world_city_capital d
where a.name = :P1_START_CITY and d.name != :P1_START_CITY
and sdo_within_distance(a.geometry, d.geometry, 'unit=KM distance='||:P1_MAX_DISTANZ) = 'TRUE'

Nun können Sie, wie in Abbildung 5 dargestellt, eine maximale Entfernung angeben. Mit Hilfe der Funktion SDO_WITHIN_DISTANCE wird in der SQL WHERE-Klausel eine zusätzliche Einschränkung vorgenommen - es werden nur die Städte zurückgeliefert, welche sich innerhalb der gewünschten Distanz befinden.

Entfernungstabelle: Einschränkung mit SDO_WITHIN_DISTANCE

Abbildung 5: Einschränkung mit SDO_WITHIN_DISTANCE

Natürlich können solche räumlichen Kriterien in einer Abfrage problemlos mit fachlichen Kriterien gemischt werden. So soll eine weitere Einschränkung hinsichtlich der Einwohnerzahl vorgenommen werden. Erzeugen Sie dazu eine Auswahlliste P1_POPULATION mit einer statischen Werteliste:

STATIC:weniger als 500.000;500000,
       weniger als 1.000.000;1000000,
       weniger als 2.000000;2000000,
       weniger als 5.000000;5000000

Anschließend ändern Sie das SQL des Berichts wiederum ein wenig um:

select
  d.name, 
  sdo_geom.sdo_distance(
    a.geometry,
    d.geometry,
    1,
    'unit=KM'
  ) entfernung,
  d.population 
from world_city_capital a, world_city_capital d
where a.name = :P1_START_CITY and d.name != :P1_START_CITY
and sdo_within_distance(a.geometry, d.geometry, 'unit=KM distance='||:P1_MAX_DISTANZ) = 'TRUE'
and d.population <= :P1_POPULATION
Entfernungstabelle: zusätzliche Einschränkung anhand der Einwohnerzahl

Abbildung 6: Entfernungstabelle: zusätzliche Einschränkung anhand der Einwohnerzahl

Man sieht, wie einfach räumliche Informationen in SQL-Abfragen integriert werden können. Neben der hier vorgestellten Funktion SDO_DISTANCE bietet das PL/SQL-Paket SDO_GEOM viele weitere räumliche Funktionen an. Einige Beispiele dafür sind:

  • Berechnen des Flächeninhaltes mit SDO_GEOM.SDO_AREA
  • Berechnung der Länge (eines Strassenzugs) mit SDO_GEOM.SDO_LENGTH
  • Finden der nächsten Nachbarn mit SDO_NN
  • Finden der direkt angrenzenden Geometrieobjekte (direkte Nachbarn) mit SDO_TOUCH
  • und viele mehr ...

In den nächsten Ausgaben wird dieses Beispiel fortgesetzt. Sie werden erfahren ...

  • ... wie Sie diese Daten in einer Karte darstellen
  • ... und diese Karte in Ihre Application Express-Anwendung integrieren können
  • ... wie Sie die Karte mit fachlichen Informationen (Einwohnerzahlen) anreichern können
  • ... wie Sie neue Geodaten "erfassen" können (bspw. Kunden)

Wenn Sie mehr über die Geodaten-Technologie erfahren möchten, finden Sie hier weitere Informationen:

Zurück zur Community-Seite