Aus einer zusammengesetzten Geometrie (Multipolygon, welches mehrere Elemente, optional auch Subelemente/Ringe enthält) können mit Hilfe der Funktion EXTRACT einzelne Elemente herausgezogen werden.
Diese Funktion für 2D-Vektordaten, sowie analog EXTRACT3D für 3D-Vektordaten, steht im PL/SQL Package SDO_UTIL zur Verfügung. Letztere Funktion gibt es allerdings erst seit der DB Version 11.1 im Package.
Das Format ist wie folgt kurz beschrieben:
sdo_util.extract (
geometry IN SDO_GEOMETRY,
element IN NUMBER,
ring IN NUMBER default 0
) return sdo_geometry; -- 2D
Und wie geht´s konkret?
Gegeben sei das Multipolgyon "Brandenburg" (SDO_GTYPE = 2007) aus dem World Sample NAVTEQ Data Bundle.
-- Extraction von Element 1, Ring 1
SQL> select sdo_util.extract(geometry, 1, 1) from m_admin_area2 where feature_name = 'Brandenburg';
-- Ergebnis ist der äußere Ring von Brandenburg
-- Extraction von Element 1, Ring 2
SQL> select sdo_util.extract(geometry, 1, 2) from m_admin_area2 where feature_name = 'Brandenburg';
-- Ergebnis ist der innere Ring von Brandenburg, gleichzeitig die administrative Grenze des Bundeslandes Berlin
-- Extraction von Element 2, Ring 2
SQL> select sdo_util.extract(geometry, 2, 1) from m_admin_area2 where feature_name = 'Brandenburg';
-- Ergebnis hier ist eine kleine Brandenburgische Exklave in Sachsen-Anhalt
Weitere Infos finden sich natürlich in der Online-Doku auf OTN (http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14255/sdo_util.htm#sthref1955).
Wer übrigens herausfinden möchte, wieviel Elemente eine Geometrie enthält, kann hierfür die Funktion GETNUMELEM im gleichen Package benutzen.
AntwortenLöschenWieder auf das Beispiel Brandenburg bezogen:
select sdo_util.getnumelem(geometry) from m_admin_area2 where feature_name = 'Brandenburg';
Im Ergebnis werden 6 Elemente angezeigt. Und wenn man sich diese anschaut, stellen diese insgesamt fünf Exklaven in Sachsen-Anhalt dar.