Heute erhielt ich die Frage, wie man mittels SQL die Hochwerte von Geometrien z.B. um 100 Meter erhöhen kann.
Die Antwort darauf ist relativ einfach: z.B. mit einer Funktion.
Für die Funktion habe ich mit folgenden Prämissen gearbeitet:
Damit sieht die Funktion dann wie folgt aus:
- Bei den Geometrietypen handelt sich um Linien oder Polygone.
- Die Geometrien sind zweidimensional.
- Die Masseinheit für die Verschiebung ist "m".
- Ausgangsgeometrie
- Offset für den Rechtswert
- Offset für den Hochwert
Damit sieht die Funktion dann wie folgt aus:
create or replace function geom_add_offset( p_geom sdo_geometry, p_offset_east number default 0, -- Offset für den Rechtswert in Metern p_offset_north number default 0 -- Offset für den Hochwert in Metern ) return sdo_geometry deterministic is l_geom sdo_geometry := p_geom ; begin for i in 1..p_geom.sdo_ordinates.count loop if mod(i,2) = 0 then -- Hochwert: 2. Wert in einem Koordinatenpaar l_geom.sdo_ordinates(i) := l_geom.sdo_ordinates(i) + p_offset_north; else -- Hochwert: 1. Wert in einem Koordinatenpaar l_geom.sdo_ordinates(i) := l_geom.sdo_ordinates(i) + p_offset_east; end if; end loop; return l_geom; end geom_add_offset; /
Diese Funktion kann ich jetzt in jedes beliebige SQL-Statement einbauen.
Beispielhaft lege ich eine neue Tabelle, welche den Hochwert aller Geometrien um 100 erhöht.
Beispielhaft lege ich eine neue Tabelle, welche den Hochwert aller Geometrien um 100 erhöht.
create table geom_tab_with_offset as select id, name, geom_add_offset(geometry, 0, 100) as geometry from geom_tab;
Visuell dargestellt sieht das für ein Beispiel-Polygon dann ausschnittsweise so aus:
Mit recht wenig Aufwand lässt sich also die gewünschte Verschiebung direkt mittels SQL in der Datenbank vornehmen.