Freitag, 16. Oktober 2015

Oracle Spatial: Releases und Patches

Für Betreiber von Oracle Spatial auf Datenbanken der Version 11.2 oder 12.1 gibt es eine Patch-Empfehlung aus dem Development.

Any customer running 11.2.0.4, 12.1.0.1 or 12.1.0.2 releases should have the following one off spatial patches applied:

  • 12.1.0.2:
    21453611: Performance and other fixes for spatial statistics generation 
              (supersedes patches 19544707, 20653340, 20808043)
    21376696: 12.1.0.2 spatial patch bundle - Also includes faster sdo_intersection 
              with spatial_vector_acceleration=true
    
  • 12.1.0.1 or 11.2.0.4
    21453611: Performance and other fixes for spatial statistic generations 
              (supersedes patches 19544707, 20653340, 20808043)

Beim nächsten anstehenden Wartungsfenster dürfte es also eine gute Idee sein, diese Patches einzuspielen. Nutzer von älteren Datenbankversionen (11.2.0.3 und älter) wird naheliegenderweise das Upgrade auf 11.2.0.4 (oder besser: 12.1.0.2) empfohlen.



Montag, 5. Oktober 2015

Liniengeometrien glätten direkt in der Datenbank

Geometrien zu vereinfachen (auch Generalisierung genannt) ist eines der grundlegenenden Probleme in der Kartografie. Ich möchte diese Thematik speziell für Linienzüge betrachten.

Ein Linienzug wird durch Herausnehmen von Stützpunkten vereinfacht oder geglättet. Wichtig dabei ist, dass dessen grobe Gestalt erhalten bleibt.
Die Oracle Datenbank unterstützt derzeit 2 Algorithmen für die Linienglättung über vorgefertigte Funktionen:
  1. den Douglas-Peucker Algorithmus über die Funktion SDO_UTIL.SIMPLIFY
  2. den Visvalingham-Whyatt Algorithmus über die Funktion SDO_UTIL.SIMPLIFYVW
Hinweis: Als Funktionen innerhalb des SDO_UTIL-Packages sind diese für jede Edition der Oracle Datenbank als Teil von Oracle Locator anwendbar.

Wie arbeiten diese beiden Algorithmen?
Beim Douglas-Peucker Algorithmus wird der Grad der Vergröberung gesteuert durch die Angabe des maximalen Abstandes zwischen den ursprünglichen Punkten und dem approximierten Linienzug. Dies ist ein recht einfacher, rekursiver Algorithmus.
Der Visvalingham-Whyatt Algprithmus betrachtet die effektiven Flächen der Stützpunkte und entfernt Stützpunkte dann auf Basis der kleinsten effektiven Flächen.

Die Glättung ist jeweils einfach aufgerufen. Ich benutze dazu wieder ein Testdatenset des Oracle Partners GfK GeoMarketing, speziell die Tabelle DE_MAJOR_HYDRO_LINES mit dem Koordinatensystem 8307 (Oracle SRID für WGS84) und einer Toleranz von 0.05:

select name,
       sdo_util.simplify(geometry, 1)   -- Douglas-Peucker
  from de_highways
/

bzw.

select name,
       sdo_util.simplifyvw(geometry,10) -- Visvalingham-Whyatt
  from de_highways
/

Der 2. Parameter bei SDO_UTIL.SIMPLIFY, in der Dokumentation als threshold bezeichnet, muss ein Wert größer 0 sein. Für geodätische Koordinatensysteme ist die Einheit immer Meter. Für alle anderen entspricht die Einheit dem für das Koordinatensystem.
Der 2. Parameter bei SDO_UTIL.SIMPLIFYVW, in der Dokumentation als vertex_threshold bezeichnet, ist eine Prozentangabe. Der Wert kann also zwischen 0 und 100 variieren. Je größer er ist, umso gröber fällt die Glättung aus.
Letzteres gilt auch für SDO_UTIL.SIMPLIFY.

Bevor ich die Ergebnisse in einer visualisierten Form darstelle für unterschiedliche threshold-Werte, will ich noch zeigen, wie die Anzahl der Stützpunkte verglichen werden können.
Dazu bedarf es nur eines einfachen SELECT.

select name, 
       sdo_util.getnumvertices(geometry) "#Verts orig", 
       sdo_util.getnumvertices(sdo_util.simplify(geometry,1)) "#Verts D-P",
       sdo_util.getnumvertices(sdo_util.simplifyvw(geometry,20)) "#Verts V-W" 
  from de_major_hydro_line
 where name = 'Weser'
/


Und so sehen die Ergebnisse aus.

D-P: threshold = 1 | V-W: threshold = 20
Orginal Liniengeometrie: scharz
D-P Liniengeometrie: gelb
V-W Liniengeometrie: rot


D-P: threshold = 10 | V-W: threshold = 30

D-P: threshold = 20 | V-W: threshold = 50

Die Unterschiede sind marginal bei den in den ersten 3 Abbildungen gewählten Threshold-Werten und der Skalierung. Sie werden besser erkennbar, wenn noch weiter in die Geometrie hineinge"zoomed" wird bzw. die Treshold-Werte noch größer gewählt werden.

D-P: threshold = 100 | V-W: threshold = 90