プライマリ・コンテンツに移動
Oracle® Spatial and Graph開発者ガイド
12cリリース1 (12.1)
B72470-07
目次へ移動
目次
索引へ移動
索引

前
次

6.9 ユーザー定義の座標参照系の作成

Oracleから提供されている座標系でニーズを十分に満たすことができない場合は、ユーザー定義の座標参照系を作成できます。

注意:

「座標系(空間参照システム)」で述べたように、coordinate systemという用語とcoordinate reference system(CRS)という用語は、通常、区別なく使用されます。ただし、「座標参照系」は、地球をベースにしている必要があります。

ユーザー定義のCRSを作成する手順は、厳密には、それが測地座標参照系であるか、投影座標参照系であるかによって異なります。どちらの場合も、座標系に関する情報(座標軸、軸の名前、測定単位など)を指定する必要があります。測地CRSの場合は、データに関する情報(楕円体、本初子午線など)を指定します(「測地CRSの作成」を参照)。投影CRSの場合は、ソース(測地)CRSと投影法に関する情報(操作およびパラメータ)を指定します(「投影CRSの作成」を参照)。

ユーザー定義の座標系の場合、SRID値は1000000以上にする必要があります。

6.9.1 測地CRSの作成

測定単位、座標軸、SDO_COORD_SYS表の行、楕円体、本初子午線、データなどの必要情報が定義済の場合は、SDO_COORD_REF_SYSTEMビュー(「SDO_COORD_REF_SYSTEMビュー」を参照)に行を挿入して、新しい測地CRSを定義します。

例6-5では、My Own NAD27という名前の架空の測地CRSの定義を挿入しています(これは、SRIDと名前以外は、Oracle提供のNAD27 CRSと同じです)。

定義に必要な情報が不足している場合は、必要に応じて、次の手順に従って情報を定義してからSDO_COORD_REF_SYSTEMビューに行を挿入します。

  1. 測定単位がSDO_UNITS_OF_MEASURE表(SDO_UNITS_OF_MEASURE表」を参照)に定義されていない場合は、表に行を挿入して新しい測定単位を定義します。
  2. 座標軸がSDO_COORD_AXES表(「SDO_COORD_AXES表」を参照)に定義されていない場合は、新しい座標軸ごとに1行を表に挿入します。
  3. 座標系の適切なエントリがSDO_COORD_SYS表(「SDO_COORD_SYS表」を参照)に定義されていない場合は、表に行を挿入します。例6-6では、架空の座標系の定義を挿入しています。
  4. 楕円体がSDO_ELLIPSOIDS表(「SDO_ELLIPSOIDS表」を参照)に定義されていない場合は、表に行を挿入して新しい楕円体を定義します。
  5. 本初子午線がSDO_PRIME_MERIDIANS表(「SDO_PRIME_MERIDIANS表」を参照)に定義されていない場合は、表に行を挿入して新しい本初子午線を定義します。
  6. データがSDO_DATUMS表(「SDO_DATUMS表」を参照)に定義されていない場合は、表に行を挿入して新しいデータを定義します。

例6-5 ユーザー定義の測地座標参照系の作成

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 (
        9994267,
        'My Own NAD27',
        'GEOGRAPHIC2D',
        6422,
        6267,
        6267,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        'EPSG',
        'FALSE',
        NULL,
        NULL,
        NULL,
        'TRUE',
        'TRUE');

例6-6 SDO_COORD_SYS表への行の挿入

INSERT INTO SDO_COORD_SYS (
        COORD_SYS_ID,
        COORD_SYS_NAME,
        COORD_SYS_TYPE,
        DIMENSION,
        INFORMATION_SOURCE,
        DATA_SOURCE)
  VALUES (
        9876543,
        'My custom CS. Axes: lat, long. Orientations: north, east. UoM: deg',
        'ellipsoidal',
        2,
        'Myself',
        'Myself');

6.9.2 投影CRSの作成

測定単位、座標軸、SDO_COORD_SYS表の行、ソース座標系、投影操作、投影パラメータなどの必要情報が定義済の場合は、SDO_COORD_REF_SYSTEMビュー(「SDO_COORD_REF_SYSTEMビュー」を参照)に行を挿入して新しい投影CRSを定義します。

例6-7では、My Own NAD27 / Cuba Norteという名前の架空の投影CRSの定義を挿入しています(これは、SRIDと名前以外は、Oracle提供のNAD27 / Cuba Norte CRSと同じです)。

定義に必要な情報が不足している場合は、必要に応じて、次の手順に従って情報を定義してからSDO_COORD_REF_SYSTEMビューに行を挿入します。

  1. 測定単位がSDO_UNITS_OF_MEASURE表(SDO_UNITS_OF_MEASURE表」を参照)に定義されていない場合は、表に行を挿入して新しい測定単位を定義します。
  2. 座標軸がSDO_COORD_AXES表(「SDO_COORD_AXES表」を参照)に定義されていない場合は、新しい座標軸ごとに1行を表に挿入します。
  3. 座標系の適切なエントリがSDO_COORD_SYS表(「SDO_COORD_SYS表」を参照)に定義されていない場合は、表に行を挿入します。(「測地CRSの作成」例6-6を参照。)
  4. 投影操作がSDO_COORD_OPS表(「SDO_COORD_OPS表」を参照)に定義されていない場合は、表に行を挿入して新しい投影操作を定義します。例6-8に、Oracleが提供している座標操作ID 18061の情報を挿入する文を示します。
  5. 投影操作のパラメータがSDO_COORD_OP_PARAM_VALS表(「SDO_COORD_OP_PARAM_VALS」表を参照)に定義されていない場合は、新しいパラメータごとに1行を表に挿入します。例6-9に、Oracleが提供している、ID値が8801、8802、8805、8806および8807のパラメータの情報を挿入する文を示します。

例6-7 ユーザー定義の投影座標参照系の作成

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 (
        9992085,
        'My Own NAD27 / Cuba Norte',
        'PROJECTED',
        4532,
        NULL,
        6267,
        4267,
        18061,
        NULL,
        NULL,
        'Institut Cubano di Hidrografia (ICH)',
        'EPSG',
        'FALSE',
        NULL,
        NULL,
        NULL,
        'TRUE',
        'TRUE');

例6-8 SDO_COORD_OPS表への行の挿入

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 (
        18061,
        'Cuba Norte',
        'CONVERSION',
        NULL,
        NULL,
        NULL,
        NULL,
        9801,
        NULL,
        NULL,
        NULL,
        'EPSG',
        1,
        'FALSE',
        NULL,
        1,
        1,
        1);

例6-9 SDO_COORD_OP_PARAM_VALS表への行の挿入

INSERT INTO SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
  VALUES (
        18061,
        9801,
        8801,
        22.21,
        NULL,
        9110);
 
 INSERT INTO SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
  VALUES (
        18061,
        9801,
        8802,
        -81,
        NULL,
        9110);
 
 INSERT INTO SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
  VALUES (
        18061,
        9801,
        8805,
        .99993602,
        NULL,
        9201);
 
INSERT INTO SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
  VALUES (
        18061,
        9801,
        8806,
        500000,
        NULL,
        9001);
 
INSERT INTO SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
  VALUES (
        18061,
        9801,
        8807,
        280296.016,
        NULL,
        9001);

例6-10 ユーザー定義の投影CRSの作成(拡張例)

-- Create an EPSG equivalent for the following CRS:
--
-- CS_NAME:    VDOT_LAMBERT
-- SRID:       51000000
-- AUTH_SRID:  51000000
-- AUTH_NAME:  VDOT Custom Lambert Conformal Conic
-- WKTEXT:
--
-- PROJCS[
--   "VDOT_Lambert",
--   GEOGCS[
--     "GCS_North_American_1983",
--     DATUM[
--       "D_North_American_1983",
--       SPHEROID["GRS_1980", 6378137.0, 298.257222101]],
--     PRIMEM["Greenwich", 0.0],
--     UNIT["Decimal Degree",0.0174532925199433]],
--   PROJECTION["Lambert_Conformal_Conic"],
--   PARAMETER["False_Easting", 0.0],
--   PARAMETER["False_Northing", 0.0],
--   PARAMETER["Central_Meridian", -79.5],
--   PARAMETER["Standard_Parallel_1", 37.0],
--   PARAMETER["Standard_Parallel_2", 39.5],
--   PARAMETER["Scale_Factor", 1.0],
--   PARAMETER["Latitude_Of_Origin", 36.0],
--   UNIT["Meter", 1.0]]
 
-- First, the base geographic CRS (GCS_North_American_1983) already exists in EPSG.
-- It is 4269:
-- Next, find the EPSG equivalent for PROJECTION["Lambert_Conformal_Conic"]:
select
  coord_op_method_id,
  legacy_name
from
  sdo_coord_op_methods
where
  not legacy_name is null
order by
  coord_op_method_id;
 
-- Result:
-- COORD_OP_METHOD_ID LEGACY_NAME
-- ------------------ --------------------------------------------------
--               9802 Lambert Conformal Conic
--               9803 Lambert Conformal Conic (Belgium 1972)
--               9805 Mercator
--               9806 Cassini
--               9807 Transverse Mercator
--               9829 Polar Stereographic
-- 
-- 6 rows selected.
--
-- It is EPSG method 9802. Create a projection operation 510000001, based on it:
 
insert into MDSYS.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 (
        510000001,
        'VDOT_Lambert',
        'CONVERSION',
        NULL,
        NULL,
        NULL,
        NULL,
        9802,
        NULL,
        NULL,
        NULL,
        NULL,
        1,
        'FALSE',
        NULL,
        1,
        1,
        1);
 
-- Now, set the parameters. See which are required:
 
select
  use.parameter_id || ': ' ||
  use.legacy_param_name
from
  sdo_coord_op_param_use use
where
  use.coord_op_method_id = 9802;
 
-- result:
-- 8821: Latitude_Of_Origin
-- 8822: Central_Meridian
-- 8823: Standard_Parallel_1
-- 8824: Standard_Parallel_2
-- 8826: False_Easting
-- 8827: False_Northing
--
-- 6 rows selected.
 
-- Also check the most common units we will need:
 
select
  UOM_ID || ': ' ||
  UNIT_OF_MEAS_NAME
from
  sdo_units_of_measure
where
  uom_id in (9001, 9101, 9102, 9201)
order by
  uom_id;
 
-- result:
-- 9001: metre
-- 9101: radian
-- 9102: degree
-- 9201: unity
 
-- Now, configure the projection parameters:
 
-- 8821: Latitude_Of_Origin
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8821,
        36.0,
        NULL,
        9102);
 
-- 8822: Central_Meridian
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8822,
        -79.5,
        NULL,
        9102);
 
-- 8823: Standard_Parallel_1
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8823,
        37.0,
        NULL,
        9102);
 
-- 8824: Standard_Parallel_2
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8824,
        39.5,
        NULL,
        9102);
 
-- 8826: False_Easting
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8826,
        0.0,
        NULL,
        9001);
 
-- 8827: False_Northing
 
    insert into MDSYS.SDO_COORD_OP_PARAM_VALS (
        COORD_OP_ID,
        COORD_OP_METHOD_ID,
        PARAMETER_ID,
        PARAMETER_VALUE,
        PARAM_VALUE_FILE_REF,
        UOM_ID)
      VALUES (
        510000001,
        9802,
        8827,
        0.0,
        NULL,
        9001);
 
-- Now, create the actual projected CRS.Look at the GEOG_CRS_DATUM_ID 
-- and COORD_SYS_ID first. The GEOG_CRS_DATUM_ID is the datum of 
-- the base geog_crs (4269):
 
select datum_id from sdo_coord_ref_sys where srid = 4269;
 
--   DATUM_ID
-- ----------
--       6269
 
-- And the COORD_SYS_ID is the Cartesian CS used for the projected CRS.
-- We can use 4400, if meters will be the unit:
 
select COORD_SYS_NAME from sdo_coord_sys where COORD_SYS_ID = 4400;
 
-- Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north.
-- UoM: m.
 
-- Now create the projected CRS:
 
insert into MDSYS.SDO_COORD_REF_SYSTEM (
        SRID,
        COORD_REF_SYS_NAME,
        COORD_REF_SYS_KIND,
        COORD_SYS_ID,
        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,
        GEOG_CRS_DATUM_ID)
VALUES (
        51000000,
        'VDOT_LAMBERT',
        'PROJECTED',
        4400,
        NULL,
        4269,
        510000001,
        NULL,
        NULL,
        NULL,
        NULL,
        'FALSE',
        NULL,
        NULL,
        NULL,
        6269);
 
-- To see the result:
 
select srid, wktext from cs_srs where srid = 51000000;
 
--  51000000
-- PROJCS[
--   "VDOT_LAMBERT",
--   GEOGCS [
--     "NAD83",
--     DATUM [
--       "North American Datum 1983 (EPSG ID 6269)",
--       SPHEROID [
--         "GRS 1980 (EPSG ID 7019)",
--         6378137,
--         298.257222101]],
--     PRIMEM [ "Greenwich", 0.000000 ],
--     UNIT ["Decimal Degree", 0.01745329251994328]],
--   PROJECTION ["VDOT_Lambert"],
--   PARAMETER ["Latitude_Of_Origin", 36],
--   PARAMETER ["Central_Meridian", -79.50000000000000000000000000000000000028],
--   PARAMETER ["Standard_Parallel_1", 37],
--   PARAMETER ["Standard_Parallel_2", 39.5],
--   PARAMETER ["False_Easting", 0],
--   PARAMETER ["False_Northing", 0],
--   UNIT ["Meter", 1]]

例6-10に、ユーザー定義の投影座標参照系の作成例に注釈を付けて拡張した例を示します。

6.9.3 垂直CRSの作成

垂直CRSには1つの次元(通常、高さ)のみがあります。そのままでは、垂直CRSの有用性は低いですが、2次元のCRS(測地CRSまたは投影CRS)と結合して複合CRSを作り出すことができます。例6-11に、SRID 5701を使用して垂直CRSを作成する文を示します(SRID 5701はSpatial and Graphに同梱されています)。この定義では、既存の(1次元の)座標系(ID 6499、「SDO_COORD_SYS表」を参照)と垂直データ(ID 5101、「SDO_DATUMS表」を参照)を参照します。

例6-11 垂直座標参照系の作成

INSERT INTO MDSYS.SDO_COORD_REF_SYSTEM (
    SRID,
    COORD_REF_SYS_NAME,
    COORD_REF_SYS_KIND,
    COORD_SYS_ID,
    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)
  VALUES (
    5701,
    'Newlyn',
    'VERTICAL',
    6499,
    5101,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    'EPSG',
    'FALSE',
    NULL,
    NULL,
    NULL);

垂直CRSでは、うねりのある等ポテンシャル面がいくつか定義される場合があります。そのような面の形状と、楕円体からのそのオフセットは、垂直CRSレコード自体に実際どおりには定義されません。そのかわり、垂直CRSと別のCRSとの間の操作に定義が指定されます。したがって、同じ組合せのジオイド高とWGS 84楕円体高間にいくつかの代替操作を定義することができます。たとえば、ジオイドのオフセット・マトリックスにはGEOID90、GEOID93、GEOID96、GEOID99、GEOID03、GEOID06などがあり、これらの各変形に対して別々の操作を定義できます。このような操作については、「変換操作の作成」を参照してください。

6.9.4 複合CRSの作成

複合CRSは、既存の水平(2次元の) CRSと垂直(1次元の) CRSを組み合せたものです。水平CRSには、測地CRSまたは投影CRSを使用できます。例6-12に、SRID 7405を使用して複合CRSを作成する文を示します(SRID 7405はSpatial and Graphに同梱されています)。この定義では、既存の投影CRSおよび垂直CRS (それぞれ、ID 27700および5701。「SDO_COORD_REF_SYS表」を参照)を参照します。

例6-12 複合座標参照系の作成

INSERT INTO MDSYS.SDO_COORD_REF_SYSTEM (
    SRID,
    COORD_REF_SYS_NAME,
    COORD_REF_SYS_KIND,
    COORD_SYS_ID,
    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)
  VALUES (
    7405,
    'OSGB36 / British National Grid + ODN',
    'COMPOUND',
    NULL,
    NULL,
    NULL,
    NULL,
    27700,
    5701,
    NULL,
    'EPSG',
    'FALSE',
    NULL,
    NULL,
    NULL);

6.9.5 地理3D CRSの作成

地理3D CRSは、地理2D CRSと楕円高を結合したものです。例6-13に、SRID 4327を使用して地理3D CRSを作成する文を示します(SRID 4327はSpatial and Graphに同梱されています)。この定義は、既存の投影座標系(ID 6401、「SDO_COORD_SYS表」を参照)およびデータ(ID 6326、「SDO_DATUMS表」を参照)を参照します。

例6-13 地理3D座標参照系の作成

INSERT INTO MDSYS.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 (
   4327,
   'WGS 84 (geographic 3D)',
   'GEOGRAPHIC3D',
   6401,
   6326,
   6326,
   NULL,
   NULL,
   NULL,
   NULL,
   'NIMA TR8350.2 January 2000 revision. http://164.214.2.59/GandG/tr8350_2.html',
   'EPSG',
   'FALSE',
   NULL,
   NULL,
   NULL,
   'TRUE',
   'TRUE');

6.9.6 変換操作の作成

「投影CRSの作成」で、投影CRSを作成するために投影操作を作成する方法について説明しました。正標高に基づく複合CRSを使用する場合にも、同様の要件が起こる可能性があります。ジオイド高と楕円体高の間で変換した方がよい場合があるためです。2つの高さの間のオフセットは一定ではなく、不規則です。

Spatial and Graphのデフォルトでは、ID変換を使用して楕円体高と正標高の間の変換が行われます。(異なる楕円体の間の変換は、デフォルトではID変換ではなくデータ変換で行われます。)ID変換は合理的な近似化の方法です。ただし、この方法より正確な変換方法としてEPSGタイプ9635の操作があり、この操作ではオフセット・マトリックスが使用されます。例6-14は、このような操作を宣言しています。

例6-14 変換操作の作成

INSERT INTO MDSYS.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 (
   999998,
   'Test operation, based on GEOID03 model, using Hawaii grid',
   'TRANSFORMATION',
   NULL,
   NULL,
   NULL,
   NULL,
   9635,
   NULL,
   NULL,
   'NGS',
   'NGS',
   1,
   'FALSE',
   NULL,
   1,
   1,
   1);
 
INSERT INTO MDSYS.SDO_COORD_OP_PARAM_VALS (
   COORD_OP_ID,
   COORD_OP_METHOD_ID,
   PARAMETER_ID,
   PARAMETER_VALUE,
   PARAM_VALUE_FILE_REF,
   UOM_ID)
 VALUES (
   999998,
   9635,
   8666,
   NULL,
   'g2003h01.asc',
   NULL);

例6-14の2つ目のINSERT文では、ファイル名g2003h01.ascが指定されていますが、オフセット・マトリックスを使用する実際のCLOBコンテンツはまだ指定されていません。NADCONおよびNTv2のマトリックスの場合と同様に、ジオイド・マトリックスをPARAM_VALUE_FILE列にロードする必要があります。紙面および著作権の関係で、これらのマトリックスのほとんどは、Oracleから提供されませんが、通常、Webからダウンロードできます。該当する政府機関のWebサイトがよい情報源で、ファイル名(この例のg2003h01など)を使用して検索できます。これらのファイルのうち一部は、バイナリ形式(.gsbなど)とASCII形式(.gsaまたは.ascなど)の両方が用意されていますが、Spatial and Graphで使用できるのはASCII形式のみです。既存のEPSG操作には、標準で使用されるファイル名が含まれます。

例6-15 オフセット・マトリックスのロード

DECLARE
  ORCL_HOME_DIR VARCHAR2(128);
  ORCL_WORK_DIR VARCHAR2(128);
  Src_loc       BFILE;
  Dest_loc      CLOB;
  CURSOR PARAM_FILES IS
    SELECT
      COORD_OP_ID,
      PARAMETER_ID,
      PARAM_VALUE_FILE_REF
    FROM
      MDSYS.SDO_COORD_OP_PARAM_VALS
    WHERE
      PARAMETER_ID IN (8656, 8657, 8658, 8666);
  PARAM_FILE PARAM_FILES%ROWTYPE;
  ACTUAL_FILE_NAME VARCHAR2(128);
  platform NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY work_dir AS ''define_your_source_directory_here''';
 
  FOR PARAM_FILE IN PARAM_FILES LOOP
    CASE UPPER(PARAM_FILE.PARAM_VALUE_FILE_REF)
      /* NTv2, fill in your files here */
      WHEN 'NTV2_0.GSB'   THEN ACTUAL_FILE_NAME := 'ntv20.gsa';
      /* GEOID03, fill in your files here */
      WHEN 'G2003H01.ASC' THEN ACTUAL_FILE_NAME := 'g2003h01.asc';
      ELSE                     ACTUAL_FILE_NAME := NULL;
    END CASE;
 
    IF(NOT (ACTUAL_FILE_NAME IS NULL)) THEN
      BEGIN
        dbms_output.put_line('Loading file ' || actual_file_name || '...');
        Src_loc := BFILENAME('WORK_DIR', ACTUAL_FILE_NAME);
        DBMS_LOB.OPEN(Src_loc, DBMS_LOB.LOB_READONLY);
      END;
 
      UPDATE
        MDSYS.SDO_COORD_OP_PARAM_VALS
      SET
        PARAM_VALUE_FILE = EMPTY_CLOB()
      WHERE
        COORD_OP_ID = PARAM_FILE.COORD_OP_ID AND
        PARAMETER_ID = PARAM_FILE.PARAMETER_ID
      RETURNING
        PARAM_VALUE_FILE INTO Dest_loc;
 
      DBMS_LOB.OPEN(Dest_loc, DBMS_LOB.LOB_READWRITE);
      DBMS_LOB.LOADFROMFILE(Dest_loc, Src_loc, DBMS_LOB.LOBMAXSIZE);
      DBMS_LOB.CLOSE(Dest_loc);
      DBMS_LOB.CLOSE(Src_loc);
      DBMS_LOB.FILECLOSE(Src_loc);
    END IF;
  END LOOP;
END;
/

例6-15は、このような一連のマトリックスをロードするスクリプトです。これは、指定した物理ファイル(ntv20.gsaなど)が、公式なファイル名参照(NTV2_0.GSBなど)に基づいて、データベースCLOBにロードされます。

6.9.7 British Grid Transformation OSTN02/OSGM02 (EPSG Method 9633)の使用

投影座標参照系でBritish Grid Transformation OSTN02/OSGM02 (EPSG method 9633)を使用するには、最初にSDO_COORD_OP_PARAM_VALS表(「SDO_COORD_OP_PARAM_VALS表」を参照)のPARAM_VALUE_FILE列(CLOB型)に変更されたバージョンのOSTN02_OSGM02_GB.txt格子ファイルを挿入する必要があります。OSTN02_OSGM02_GB.txtファイルには、EPSG変換メソッド9633の基になっているオフセット・マトリックスが含まれています。

次の手順を実行します。

  1. ファイルhttp://www.ordnancesurvey.co.uk/docs/gps/ostn02-osgm02-files.zipをダウンロードします。
  2. この.zipファイルからOSTN02_OSGM02_GB.txtというファイルを展開します。
  3. OSTN02_OSGM02_GB.txtのコピーを編集して、現在のファイルの最初の行の前に次の行を挿入します。
    SDO Header
    x: 0.0 - 700000.0
    y: 0.0 - 1250000.0
    x-intervals: 1000.0
    y-intervals: 1000.0
    End of SDO Header
    

    編集操作後のファイルの内容は次のようになります。

    SDO Header
    x: 0.0 - 700000.0
    y: 0.0 - 1250000.0
    x-intervals: 1000.0
    y-intervals: 1000.0
    End of SDO Header
    1,0,0,0.000,0.000,0.000,0
    2,1000,0,0.000,0.000,0.000,0
    3,2000,0,0.000,0.000,0.000,0
    4,3000,0,0.000,0.000,0.000,0
    5,4000,0,0.000,0.000,0.000,0
    . . .
    876949,698000,1250000,0.000,0.000,0.000,0
    876950,699000,1250000,0.000,0.000,0.000,0
    876951,700000,1250000,0.000,0.000,0.000,0
  4. 異なる名前(たとえば、my_OSTN02_OSGM02_GB.txt)を使用して、編集したファイルを保存します。
  5. SDO_COORD_OP_PARAM_VALS表で、PARAM_VALUE_FILE_REF値にOSTN02_OSGM02_GB.TXTを持つEPSG method 9633の各操作に対して、保存したファイルの内容(たとえば、my_OSTN02_OSGM02_GB.txtの内容)になるようにPARAM_VALUE_FILE列を更新します。例6-16に示すようなコーディングを使用できます。

例6-16 British Grid Transformation OSTN02/OSGM02 (EPSG Method 9633)の使用

DECLARE
  ORCL_HOME_DIR VARCHAR2(128);
  ORCL_WORK_DIR VARCHAR2(128);
  Src_loc       BFILE;
  Dest_loc      CLOB;
  CURSOR PARAM_FILES IS
    SELECT
      COORD_OP_ID,
      PARAMETER_ID,
      PARAM_VALUE_FILE_REF
    FROM
      MDSYS.SDO_COORD_OP_PARAM_VALS
    WHERE
      PARAMETER_ID IN (8656, 8657, 8658, 8664, 8666)
    order by
      COORD_OP_ID,
      PARAMETER_ID;
  PARAM_FILE PARAM_FILES%ROWTYPE;
  ACTUAL_FILE_NAME VARCHAR2(128);
  platform NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY work_dir AS ''' || system.geor_dir || '''';
 
  FOR PARAM_FILE IN PARAM_FILES LOOP
    CASE UPPER(PARAM_FILE.PARAM_VALUE_FILE_REF)
      /* NTv2 */
      WHEN 'NTV2_0.GSB'   THEN ACTUAL_FILE_NAME := 'ntv20.gsa';
      /* GEOID03 */
      WHEN 'G2003H01.ASC' THEN ACTUAL_FILE_NAME := 'g2003h01.asc';
      /* British Ordnance Survey (9633) */
      WHEN 'OSTN02_OSGM02_GB.TXT'
                          THEN ACTUAL_FILE_NAME := 'my_OSTN02_OSGM02_GB.txt';
      ELSE                ACTUAL_FILE_NAME := NULL;
    END CASE;
 
    IF(NOT (ACTUAL_FILE_NAME IS NULL)) THEN
      BEGIN
        dbms_output.put_line('Loading file ' || actual_file_name || '...');
        Src_loc := BFILENAME('WORK_DIR', ACTUAL_FILE_NAME);
        DBMS_LOB.OPEN(Src_loc, DBMS_LOB.LOB_READONLY);
      END;
 
      UPDATE
        MDSYS.SDO_COORD_OP_PARAM_VALS
      SET
        PARAM_VALUE_FILE = EMPTY_CLOB()
      WHERE
        COORD_OP_ID = PARAM_FILE.COORD_OP_ID AND
        PARAMETER_ID = PARAM_FILE.PARAMETER_ID
      RETURNING
        PARAM_VALUE_FILE INTO Dest_loc;
 
      DBMS_LOB.OPEN(Dest_loc, DBMS_LOB.LOB_READWRITE);
      DBMS_LOB.LOADFROMFILE(Dest_loc, Src_loc, DBMS_LOB.LOBMAXSIZE);
      DBMS_LOB.CLOSE(Dest_loc);
      DBMS_LOB.CLOSE(Src_loc);
      DBMS_LOB.FILECLOSE(Src_loc);
    END IF;
  END LOOP;
END;
/

格子ファイルにヘッダー情報を追加する必要があるのは、British Grid Transformation OSTN02/OSGM02の場合のみであることに注意してください。NADCON、NTv2またはVERTCONマトリックスには様々な形式のヘッダーがすでに含まれているため、追加する必要はありません。

関連情報については、次も参照してください。