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:
- den Douglas-Peucker Algorithmus über die Funktion SDO_UTIL.SIMPLIFY
- 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 |