Sonntag, 4. März 2012

Was tun, wenn die Datenbank ein Koordinatensystem nicht kennt?

Ein solcher Fall kann vorkommen. Dann liefert Ihnen die SQL-Abfrage wie im nachfolgenden Fall
select * 
  from cs_srs 
 where srid = 4647;
eine leere Ergebnismenge. Aber das ist kein Grund zur Panik.

Denn das Problem ist mit wenigen INSERT-Befehlen behoben, sofern man nicht bis zum nächsten DB-Release warten möchte.

Was wird benötigt?
  • Die Informationen zum fehlenden Koordinatensystem.
    Für unser Beispiel 4647 sind die über die Suchfunktion auf den EPSG-Seiten zu finden.
  • Dazu braucht es noch die Angaben zur Transformation.
    Die sind im Bereich Conversion zu finden, wenn man auf den Link View öffnet.
    Wie man dort sieht, ist der dazugehörige EPSG-Code 4648. Und auch dafür gibt es einen Eintrag auf den EPSG-Seiten.
So. nun kann es auch schon losgehen.
Zuerst wird die Transformation eingetragen, da später beim INSERT des Koordinatensystems auf diese referenziert wird.
insert into sdo_coord_ops (
  COORD_OP_ID,
  COORD_OP_NAME,
  COORD_OP_TYPE,
  SOURCE_SRID,
  TARGET_SRID,
  COORD_TFM_VERSION,
  COORD_OP_VARIANT,
  COORD_OP_METHOD_ID,
  UOM_ID_SOURCE_OFFSETS,
  UOM_ID_TARGET_OFFSETS,
  INFORMATION_SOURCE,
  DATA_SOURCE,
  SHOW_OPERATION,
  IS_LEGACY,
  LEGACY_CODE,
  REVERSE_OP,
  IS_IMPLEMENTED_FORWARD,
  IS_IMPLEMENTED_REVERSE)
values (
  4648,                                        -- Code
  'UTM zone 32N with prefix',                  -- Name
  'CONVERSION',                                -- Operation
  NULL,
  NULL,
  NULL,
  NULL,
  9807,                                        -- Transverse Mercator (= Operation Method Name)
  NULL,
  NULL,
  'Landesvermessungsamt Schleswig-Holstein.',  -- Information Source
  'OGP',                                       -- Data Source
  1,                                           -- 
  'FALSE',                                     -- Not legacy  
  NULL,
  1,                                           -- Operation is reversible
  1,                                           -- Forward
  1);                                          -- and reverse
Als Wert für die Spalte COORD_OP_TYPE ist CONVERSION einzutragen. Informationen zu möglichen anderen Werten sind im Oracle Spatial Developer's Guide zu finden.
Der Wert für die Spalte COORD_OP_METHOD_ID wurde mit der nachfolgenden Abfrage ermittelt.
-- Operation Method
select * 
  from sdo_coord_op_methods 
 where coord_op_method_name = 'Transverse Mercator';  
-- COORD_OP_METHOD_ID = 9807
Nun sind noch die Parameterwerte wie in der Abbildung angegeben einzufügen.
Dazu braucht es ein paar IDs aus den Tabellen SDO_COORD_OP_PARAMS und SDO_UNIT_OF_MEASURE.
-- Conversion parameters
select parameter_id 
  from sdo_coord_op_params 
 where parameter_name = 'Latitude of natural origin';     -- 8801
select parameter_id 
  from sdo_coord_op_params 
 where parameter_name = 'Longitude of natural origin';    -- 8802
select parameter_id 
  from sdo_coord_op_params 
 where parameter_name = 'Scale factor at natural origin'; -- 8805
select parameter_id 
  from sdo_coord_op_params 
 where parameter_name = 'False easting';                  -- 8806
select parameter_id 
  from sdo_coord_op_params 
 where parameter_name = 'False northing';                 -- 8807

 -- Units of measure
select uom_id 
  from sdo_units_of_measure 
 where unit_of_meas_name = 'degree';                      -- 9102
select uom_id 
  from sdo_units_of_measure 
 where unit_of_meas_name = 'unity';                       -- 9201
select uom_id 
  from sdo_units_of_measure 
 where unit_of_meas_name = 'metre';                       -- 9001
Die 5 Parameter Latitude of natural origin, Longitude of natural origin, Scale factor at natural origin, False easting und False northing werden jetzt nacheinander in die Tabelle SDO_COORD_OP_PARAM_VALS eingetragen.
insert into sdo_coord_op_param_vals (
  COORD_OP_ID,
  COORD_OP_METHOD_ID,
  PARAMETER_ID,
  PARAMETER_VALUE,
  PARAM_VALUE_FILE_REF,
  PARAM_VALUE_FILE,
  PARAM_VALUE_XML,
  UOM_ID)
values (
  4648,
  9807,
  8801,             -- Latitude of natural origin
  0,
  NULL,
  NULL,
  NULL,
  9102);            -- degree

insert into sdo_coord_op_param_vals (
  COORD_OP_ID,
  COORD_OP_METHOD_ID,
  PARAMETER_ID,
  PARAMETER_VALUE,
  PARAM_VALUE_FILE_REF,
  PARAM_VALUE_FILE,
  PARAM_VALUE_XML,
  UOM_ID)
values (
  4648,
  9807,
  8802,             -- Longitude of natural origin
  9,
  NULL,
  NULL,
  NULL,
  9102);            -- degree

insert into sdo_coord_op_param_vals (
  COORD_OP_ID,
  COORD_OP_METHOD_ID,
  PARAMETER_ID,
  PARAMETER_VALUE,
  PARAM_VALUE_FILE_REF,
  PARAM_VALUE_FILE,
  PARAM_VALUE_XML,
  UOM_ID)
values (
  4648,
  9807,
  8805,             -- Scale factor at natural origin
  .9996,
  NULL,
  NULL,
  NULL,
  9201);            -- unity

insert into sdo_coord_op_param_vals (
  COORD_OP_ID,
  COORD_OP_METHOD_ID,
  PARAMETER_ID,
  PARAMETER_VALUE,
  PARAM_VALUE_FILE_REF,
  PARAM_VALUE_FILE,
  PARAM_VALUE_XML,
  UOM_ID)
values (
  4648,
  9807,
  8806,             -- False easting
  32500000,
  NULL,
  NULL,
  NULL,
  9001);            -- metre

insert into sdo_coord_op_param_vals (
  COORD_OP_ID,
  COORD_OP_METHOD_ID,
  PARAMETER_ID,
  PARAMETER_VALUE,
  PARAM_VALUE_FILE_REF,
  PARAM_VALUE_FILE,
  PARAM_VALUE_XML,
  UOM_ID
values (
  4648,
  9807,
  8807,             -- False northing
  0,
  NULL,
  NULL,
  NULL,
  9001);            -- metre
Abschliessend ist dann nur noch das Koordinatensystem 4647 einzutragen in den dafür vorgesehenen View SDO_COORD_REF_SYSTEM.
insert into sdo_coord_ref_system (
  SRID,
  COORD_REF_SYS_NAME,
  COORD_REF_SYS_KIND,
  COORD_SYS_ID,
  DATUM_ID,
  GEOG_CRS_DATUM_ID,
  SOURCE_GEOG_SRID,
  PROJECTION_CONV_ID,
  CMPD_HORIZ_SRID,
  CMPD_VERT_SRID,
  INFORMATION_SOURCE,
  DATA_SOURCE,
  IS_LEGACY,
  LEGACY_CODE,
  LEGACY_WKTEXT,
  LEGACY_CS_BOUNDS,
  IS_VALID,
  SUPPORTS_SDO_GEOMETRY)
values (
  4647,                                       -- Code
  'ETRS89 / UTM zone N32',                    -- Name
  'PROJECTED',                                -- Projected CRS
  4400,                                       -- Erläuterung nachfolgend
  NULL, 
  6258,                                       -- Erläuterung nachfolgend
  4258,                                       -- Erläuterung nachfolgend
  4648,                                       -- Zuvor registrierte Operation
  NULL,
  NULL,
  'Landesvermessungsamt Schleswig-Holstein',  -- Information Source
  'OGP',                                      -- Data Source
  'FALSE',                                    -- Not legacy
  NULL,
  NULL,
  NULL,
  'TRUE',                                     -- Is valid
  'TRUE');

commit;
Um den Wert 4400 für COORD_SYS_ID zu ermitteln, muss man ein bisschen genauer in die Tabelle SDO_COORD_SYS schauen. Und findet dann:
-- Coordinate axes: Easting, Northing. UoM = m
select * 
  from sdo_coord_sys 
 where coord_sys_name like 
       '%2D%Axes: easting, northing (E,N)%Orientations: east, north%UoM: m.';  
-- COORD_SYS_ID = 4400
GEOG_CRS_DATUM_ID und SOURCE_GEOG_SRID sind auch wieder mit den entsprechenden Abfragen zu ermitteln.
-- Geodetic Datum = European Terrestrial Reference System (ETRS) 1989
select * 
  from sdo_datums 
 where datum_name = 'European Terrestrial Reference System 1989';  
-- DATUM_ID = 6258

select * 
  from sdo_coord_ref_sys 
 where coord_ref_sys_name = 'ETRS89'
   and coord_ref_sys_kind like '%2D%';   
-- SRID = 4258                             
Das Ergebnis kann nun begutachtet werden:
select *
  from cs_srs 
 where srid = 4647;
Mehr Infos sind natürlich im Oracle Spatial Developer's Guide zu finden.

Keine Kommentare:

Kommentar veröffentlichen