Mittwoch, 11. März 2015

DOAG Spatial Community Day - 7. Mai 2015 in Frankfurt

Nach einer etwas längeren Pause trifft sich die deutschsprachige Spatial / Geodaten Community zum DOAG Spatial Community Day - am 7. Mai 2015 in Dreieich bei Frankfurt. Im Mittelpunkt stehen diesmal unter anderem folgende Themen.

  • News Update zu Oracle Locator, Spatial und Oracle Maps
  • HERE (NAVTEQ)-Daten in der Oracle-Datenbank: Erfahrungen aus der Praxis
  • OpenStreetMap und Oracle Spatial im Zusammenspiel
  • Adressvalidierung mit Hilfe des Oracle-Geocoders
Wie jedes Mal kommen Diskussion und Austausch nicht zu kurz. Schaut euch die Agenda mal an - wenn's interessant ist, gleich anmelden unter:

http://www.doag.org/termine/termine.php?tid=496872

Freitag, 6. März 2015

Kleines Anwendungsbeispiel für PointInPolygon

Letztens erhielt ich mal wieder eine kleine Fragestellung, dessen Lösungsansatz ich hier vorstellen möchte.

Frage:
Wie kann mittels SQL festgestellt werden, welche Linien-Geometrien ihren Startpunkt in einem definierten Gebiet (Polygon) haben? (Abflüge, Startpunkte für Wege zu Fuss oder mit einem Fahrzeug, ...)

Visuell kann das Ergebnis einer solchen Frage wie in dieser Abbildung dargestellt werden:

Es gibt sprichwörtlich viele Wege nach Rom.

Einer davon ist mein Lösungsansatz mittels des ab Oracle DB 12c verfügbaren neuen SDO_POINTINPOLYGON Operators. (Infos dazu gibt es auch in diesem Blog-Posting.)

Und das ist mein SQL-Statement:

WITH temp AS (
  SELECT r.id, first_vertex(r.geom) coord, r.geom geom 
    FROM t_routen r)                    -- T_ROUTE: Tabelle mit Liniengeometrien
SELECT * FROM (
  TABLE(
    SDO_POINTINPOLYGON(
      CURSOR(                           -- X,Y müssen die ersten beiden Parameter sein
        SELECT t.coord.sdo_point.x x, t.coord.sdo_point.y y, t.id  
          FROM temp t),
      (SELECT g.geom FROM t_gebiet g),  -- T_GEBIET: Tabelle mit Polygon für das Startgebiet
      0.05,
      'mask=inside'))) a;               -- Mask=INSIDE: Startpunkt soll im Polygon liegen
Wie zu sehen ist, verwende ich darin eine Funktion, first_vertex von mir benannt, die den 1. Stützpunkt einer (2D) Linien-Geometrie ermittelt. Und so sieht die Funktion aus:
CREATE OR REPLACE FUNCTION first_vertex(geom SDO_GEOMETRY)
RETURN SDO_GEOMETRY DETERMINISTIC
IS
  vertx MDSYS.VERTEX_SET_TYPE;
BEGIN
  vertx := SDO_UTIL.GETVERTICES(geom);
  RETURN SDO_GEOMETRY(2001, geom.sdo_srid, sdo_point_type(vertx(1).x, vertx(1).y, NULL), NULL, NULL);
END;
/
Warum verwende ich im Lösungsansatz nicht SDO_INSIDE(geometry1, geometry2);?

Der Grund ist recht einfach: Ich benötige auf geometry1 einen Spatial Index.
Den habe ich zwar auf der Tabelle T_ROUTEN selbst, jedoch nicht auf dem 1. Stützpunkt der Geometrien. Ich müsste also einen Function-Based Index anlegen, damit SDO_INSIDE funktioniert. Das spare ich mir, weil es ja SDO_POINTINPOLYGON gibt.



Die Fragestellung kann dann noch sehr leicht dahingehend erweitert werden, festzustellen, ob irgendwo auf meiner Route bestimmte andere Gebiete (Bundesländer, Umweltzonen, etc.) durchfahren, überflogen, etc. wurden.

Dazu vergleiche ich das Ergebnis der Anfrage oben in der WHERE-Klausel mit einer 2. Polygon-Geometrie (hier Tabelle T_ZONE).

WITH temp AS (
  SELECT r.id, first_vertex(r.geom) coord, r.geom geom 
    FROM t_routen r)                    -- T_ROUTE: Tabelle mit Liniengeometrien
SELECT * FROM (
  TABLE(
    SDO_POINTINPOLYGON(
      CURSOR(                           -- X,Y müssen die ersten beiden Parameter sein
        SELECT t.coord.sdo_point.x x, t.coord.sdo_point.y y, t.id  
          FROM temp t),
      (SELECT g.geom FROM t_gebiet g),  -- T_GEBIET: Tabelle mit Polygon für das Startgebiet
      0.05,
      'mask=inside'))) a                -- Mask=INSIDE: Startpunkt soll im Polygon liegen
WHERE a.id IN  (
  SELECT r.id
    FROM t_zone z, t_routen r
   WHERE a.id = r.id 
     AND SDO_ANYINTERACT (r.geom, z.geom) = 'TRUE');

Viel positives Feedback zu den Oracle Spatial Workshops mit Albert Godfrind

Im Januar und Februar haben wir in Frankfurt zwei jeweils 2-tägige Workshops zu Oracle Spatial 12c durchgeführt. Beide Termine waren sehr gut besucht. Und wir haben sehr viel positives Feedback erhalten, wie dieses hier (was ich aus dem Gedächtnis zitiere):

"Ich wusste nicht, dass ich mit Oracle auf einer solch detaillierten technischen und fachlichen Ebene sprechen kann, wenn es raumbezogene Daten geht ..".

Ja, Leute: Wir können auch technisch. Und nicht nur eine/r oder zwei von uns, wird sind mehr ;-).
Wir teilen unser Wissen gern, so gern, wie wir auch auf das Wissen von Anderen immer wieder zurückgreifen. Denn auch wir müssen das Rad ja nicht jedes Mal neu erfinden.

In diesem Sinne also vielen Dank an alle, die aktiv durch Teilnahme, Diskussion und / oder Fragen zum Gelingen dieser Workshops beigetragen haben.

Besonderer Dank geht an:

Übrigens: Wiederholungen sind nicht ausgeschlossen.
Lasst Carsten und mich wissen, wenn Ihr daran Interesse habt.

Donnerstag, 19. Februar 2015

Alle Präsentationen vom BIWA / Oracle Spatial Summit 2015

Die Materialien vom Oracle Spatial Summit am 27.-28. Januar 2015 in Redwood Shores / CA sind jetzt online verfügbar.
Hier ist eine Auswahl mit direkten Links:
 Eine Übersicht zu allen Sessions mit den Verweisen auf die Download-Links findet sich hier.

Wer spannende Projekte im Umfeld der Oracle Spatial Technologies hat und diese gern auf dem nächsten Spatial Summit vorstellen möchte, sollte sich schon mal diesen Termin vormerken:
  • 26.-28. Januar 2016 im Oracle Conference Center in Redwood Shores
Mehr Infos gibt es auf den BIWA Summit Seiten. 

Dienstag, 20. Januar 2015

Vergleichender Test von Oracle DB 12 mit eingeschaltetem Vector Performance Accelerator (VPA)

Simon Greener hat die Auswirkungen des Oracle Spatial 12c Features "Vector Performance Acceelerator" auf die Performance von räumlichen Abfragen untersucht. Darüberhinaus hat er die Ergebnisse mit anderen Hersteller verglichen.
Vorgehensweise und Ergebnisse sind hier veröffentlicht. Die Ergebnisse gibt es auf Nachfrage per Formular oder als Zusammenfassung in diesem Foliensatz von der OOW 2014 (Folien 11 bis 13).

Die Nutzung von VPA ist sehr einfach, indem der entsprechende Datenbank-Parameter auf TRUE gesetzt wird. Damit l&aum;sst sich sehr schnell in der eigenen Umgebung evaluieren, welchen Nutzen das Feature haben kann.

ALTER SYSTEM SET SPATIAL_VECTOR_ACCELERATION = TRUE;
Es ist zu beachten, dass Simon bei diesen Tests keine weiteren performance-beeinflussenden Techniken wie z.B. Parallelisierung betrachtet hat.

Wenn jemand eigene Tests mit VPA und Parallelisierung aufsetzen möchte, kann sie oder er sich gern an uns wenden.