Tags:

Oracle Spatial (Teil 2) - Füllen der USER_SDO_GEOM_METADATA

Von Tobias Arnhold 9.25.2015
Damit Tools wie
  - Oracle Spatial Reader
  - FeatureReader
  - OracleQuerier
  - GeoServer
mit Oracle Spatial Tabellen arbeiten können, müssen diese in einer Meta-Schicht bekannt gemacht werden. Dies ist im Prinzip ganz einfach, denn dazu muss nur die View USER_SDO_GEOM_METADATA gefüllt werden.

Die View beinhaltet die folgenden Spalten:
(
  TABLE_NAME   VARCHAR2(32),
  COLUMN_NAME  VARCHAR2(32),
  DIMINFO      SDO_DIM_ARRAY,
  SRID         NUMBER
);

Um diese richtig zu füllen muss neben Tabelle, Spalte und SRID (Geotyp), auch die Matrix in welchen Bereich sich die Daten befinden hinterlegt werden.

Dies ist relativ einfach über ein SQL Statement abbildbar.

Hierbei beziehe ich mich auf meine Testtabelle aus dem 1. Teil meiner Spatial Posts:
-- Komplette Matrix
INSERT INTO USER_SDO_GEOM_METADATA
VALUES (
  'GV_STANDORT_LAYER2_LIST',
  'GEO_WGS84',
  MDSYS.SDO_DIM_ARRAY( 
    MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.5),
    MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.5)
  ),
  8307
);

----------------------------------------------------
-- Insert auf Basis eines vorhandenen Eintrags
INSERT INTO USER_SDO_GEOM_METADATA
(
  TABLE_NAME,
  COLUMN_NAME,
  DIMINFO,
  SRID
)
select 
  'GV_STANDORT_LAYER2_LIST' as TABLE_NAME,
  COLUMN_NAME,
  DIMINFO,
  SRID
from USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'GV_STANDORT_LAYER1'

----------------------------------------------------
-- Teilmenge aus Ausgangsdaten
INSERT INTO USER_SDO_GEOM_METADATA 
(
  TABLE_NAME,
  COLUMN_NAME,
  DIMINFO,
  SRID     
)
SELECT
  'MEINE_GEO_DATEN' AS TABLE_NAME,
  'GEO_WGS84' COLUMN_NAME,
  MDSYS.SDO_DIM_ARRAY( 
         MDSYS.SDO_DIM_ELEMENT('X', MINX, MAXX, 0.05), 
         MDSYS.SDO_DIM_ELEMENT('Y', MINY, MAXY, 0.05) 
  ) AS DIMINFO,
  8307  AS SRID -- WGS84
FROM ( 
       SELECT
         TRUNC( MIN( V.X ) - 1,0) AS MINX,
         ROUND( MAX( V.X ) + 1,0) AS MAXX,
         TRUNC( MIN( V.Y ) - 1,0) AS MINY,
         ROUND( MAX( V.Y ) + 1,0) AS MAXY
       FROM (
          SELECT SDO_AGGR_MBR(DS.GEO_WGS84) AS AMBR
          FROM MEINE_GEO_DATEN DS
          --WHERE DS.X_KOORDINATE IS NOT NULL -- Geodaten dürfen nicht leer sein
       ) DA,
       TABLE(MDSYS.SDO_UTIL.GETVERTICES(DA.AMBR)) V
     )

Die Quelle des Teilmenge-Statements stammt von dem Spatial Blog: http://spatialdbadvisor.com/

Wenn Ihr tiefergehendes Wissen zum Thema USER_SDO_GEOM_METADATA sucht, dann schaut euch mal diese Beiträge an:
docs.oracle.com - Geometry Metadata Views
knowledge.safe.com - Adding metadata entries for Oracle spatial tables or views

Ergebnis:

Der hinterlegte Bereich kann nun noch mit den Detaildaten verifiziert werden:
SELECT
  ADRESSE, 
  SDO_GEOM.VALIDATE_GEOMETRY(LAY.GEO_WGS84, MET.DIMINFO)  RESULT
FROM MEINE_GEO_DATEN LAY
CROSS JOIN USER_SDO_GEOM_METADATA MET
WHERE ROWNUM BETWEEN 1 AND 10
Oftmals wird auch ein Spatial-Index zur Datenvisualisierung benötigt:
CREATE INDEX "MEINE_GEO_DATEN_IDX" ON "MEINE_GEO_DATEN" ("GEO_WGS84") 
   INDEXTYPE IS "MDSYS"."SPATIAL_INDEX" ;

Post Tags: