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

前
次

6.5 3次元の座標参照系のサポート

3次元の座標参照系に対するOracle Spatial and GraphのサポートはEPSGモデル(「EPSGモデルとSpatial and Graph」を参照)に準拠しており、次の種類の座標参照系を使用できます。

したがって3次元の座標参照系は、楕円体高に基づく座標参照系(地理3D (「地理3D座標参照系」を参照))と、重力に関係する高さに基づく座標参照系(複合(「複合座標参照系」を参照))の2つに分類されます。

3次元での計算結果は2次元での計算結果より正確で、とりわけ変換連鎖の場合の精度は2次元より3次元の方が高くなります。たとえば、ソースおよびターゲットのCRSやジオメトリには関係なく、内部的なデータ変換は常に3つの次元で行われます。2次元ジオメトリが含まれる場合は、次の項目が1つ以上発生する可能性があります。

  1. 入力または出力ジオメトリおよびCRSが2次元の場合、内部的に行われる3次元の計算では、(指定されない)高さの入力値はデフォルトでゼロ(楕円体の上、CRSに依存)になります。このことは、高さが厳密にゼロであると意図されている場合を除き、変換が不正確になる潜在的な原因となっています。(高さの値はもともと使用できないか重要ではないため、データは2次元となる可能性があります。これは、高さが正確にゼロであるとわかっているために、データが2つの次元で表現されることとは異なります。)

  2. 高さの変換結果が内部的にはゼロ以外になる場合があります。ターゲットCRSが2次元の場合、高さの値を扱うことができないため、高さの値は切り捨てられ、さらに不正確な結果になります。

  3. さらに変換が続く場合は、高さの値が繰り返し切り捨てられることにより、結果はさらに不正確になります。不正確な高さの値を入力すると、高さの変換結果だけではなく経度および緯度の変換結果にも影響を与える可能性があることに注意してください。

ただし、ソースおよびターゲットCRSが3次元の場合は、高さの切り捨てが繰り返されることはありません。したがって、とりわけ変換連鎖の場合に、精度が高くなります。

Spatial and Graphでの3次元ジオメトリのサポートの概要は、「3次元の空間オブジェクト」を参照してください。

6.5.1 地理3D座標参照系

地理3D座標参照系は、経度および緯度の他に楕円体高に基づきます。楕円体高とは、(実際の地球を近似的に表現した)参照する楕円体に関連する高さのことです。CRSの3つの次元はすべて同じ楕円体に基づいています。

楕円体高を使用することにより、数学的な規則性および効率性に優れた内部操作をSpatial and Graphで行うことが可能です。一方、複合座標参照系では、オフセット・マトリックスに基づいて、さらに複雑な変換が要求されることがよくあります。そのような一部のマトリックスは、ダウンロードして構成する必要があります。さらに、これらのマトリックスでは、ディスク上およびメイン・メモリー内で大きなフットプリントを使用する可能性もあります。

サポートされる地理3D座標参照系は、SDO_CRS_GEOGRAPHIC3Dビュー(「SDO_CRS_GEOGRAPHIC3Dビュー」を参照)に表示されます。

6.5.2 複合座標参照系

複合3次元座標参照系は、地理2Dまたは投影2Dに加えて重力に関係する高さに基づきます。 重力に関係する高さは、地球の重力の影響を受ける高さのことです。この場合、通常、基準となる高さ(ゼロ)は等ポテンシャル面であり、海面より上または下として定義されます。

重力には次に示すような不規則性があるため、重力に関係する高さの表現は楕円体高より複雑です。

  • 正標高

    正標高は、ジオイド上の高さとも呼ばれます。ジオイドは等ポテンシャル面で、正確ではありませんが、平均海水面とほぼ一致します。等ポテンシャル面は、各点が同じ重力ポテンシャル・レベルにある面です。地球は場所によって密度が異なるので、このような面には、多少のうねりが存在します。地球の密度の不規則性により、複数の等ポテンシャル面が存在し、相互に平行ではないことがあります。

  • 平均海水面、特定の場所における海抜、または複数の検潮所を適合させるためにゆがめられた垂直ネットワークに対する相対的な高さ(NGVD 29など)

    平均海水面はジオイドに近いですが、ジオイドと同一ではありません。ある特定地域の平均海水面の多くは、特定の港の平均海水面を基に定義されます。

サポートされる複合座標参照系は、SDO_CRS_COMPOUNDビュー(「SDO_CRS_COMPOUNDビュー」を参照)に表示されます。

水平CRSと垂直CRSを組み合せて、カスタマイズした複合座標参照系を作成できます。(水平CRSにはXおよびYまたは経度および緯度などの2つの次元が含まれ、垂直CRSにはZ、高さ、標高といった3番目の次元が含まれます。)複合CRSの作成方法は、「複合CRSの作成」を参照してください。

6.5.3 3次元の変換

Spatial and Graphでは、SDO_GEOMETRYオブジェクトの3次元座標変換が直接サポートされますが、点群およびTINは間接的にサポートされます。(たとえば、点群はSDO_GEOMETRY列を含む表に変換する必要があります。)サポートされる変換は次のとおりです。

  • 3次元データの変換

  • 楕円体高と重力に関係する高さとの間の変換

3次元データ変換の場合、2つの楕円体間のデータ変換は、2次元座標参照系の場合と基本的に同じで、3つ目の次元が無視されずに使用される点が異なります。高さの値が無視されないため、特に変換連鎖の場合に変換結果の精度が高くなります。

楕円体高と重力に関係する高さの間の変換の場合、等ポテンシャル面および他の重力に関係する面にはうねりがあることから、どのような楕円体と比較しても、相互に比較しても計算は複雑になります。変換は、高次多項式関数または共1次内挿法に基づいて行われることになります。いずれの場合も、変換の定義には大きなパラメータ・マトリックスが必要です。

重力に関係する高さと楕円体高の間で変換される場合、変換の手順には、通常、オフセット・マトリックスに基づくジオイド高と楕円体高の間の変換が含まれます。ソースまたはターゲットのオフセット・マトリックスの定義に従って、共通するデータ変換を後か前に追加する必要があります。

例6-2 3次元のデータ変換

例6-2に、3次元のデータ変換を示します。

set numwidth 9
 
CREATE TABLE source_geoms (
  mkt_id NUMBER PRIMARY KEY,
  name VARCHAR2(32),
  GEOMETRY SDO_GEOMETRY);
 
INSERT INTO source_geoms VALUES(
  1,
  'reference geom',
  SDO_GEOMETRY(
  3001,
  4985,
  SDO_POINT_TYPE(
     4.0,
    55.0,
    1.0),
  NULL,
  NULL));
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'source_geoms',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',   -1000,1000, 10)),
  4985);
 
commit;
 
--------------------------------------------------------------------------------
 
CALL SDO_CS.TRANSFORM_LAYER(
  'source_geoms',
  'GEOMETRY',
  'GEO_CS_4979',
  4979);
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'GEO_CS_4979',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',   -1000,1000, 10)),
  4979);
 
set lines 210;
 
--------------------------------------------------------------------------------
 
CALL SDO_CS.TRANSFORM_LAYER(
  'GEO_CS_4979',
  'GEOMETRY',
  'source_geoms2',
  4985);
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'source_geoms2',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',   -1000,1000, 10)),
  4985);
 
--------------------------------------------------------------------------------
 
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'GEO_CS_4979';
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'SOURCE_GEOMS';
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'SOURCE_GEOMS2';
 
drop table GEO_CS_4979;
drop table source_geoms;
drop table source_geoms2;

例6-2の変換の結果、(4, 55, 1)は(4.0001539, 55.0000249, 4.218)に変換されます。

例6-3 ジオイド高と楕円体高の間の変換

例6-3では、ジオイド高と楕円体高の間の変換を、オフセット格子Hawaiiを使用して構成します。SDO_CS.CREATE_PREF_CONCATENATED_OPプロシージャを使用して先にルールを作成しないと、格子は使用できないことに注意してください。

-- Create Sample operation:
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 (
  1000000005,
  'Test Bi-linear Interpolation',
  'CONVERSION',
  null,
  null,
  null,
  null,
  9635,
  null,
  null,
  'Oracle',
  'Oracle',
  1,
  'FALSE',
  null,
  1,
  1,
  1);
 
--Create sample parameters, pointing to the offset file
--(in this case reusing values from an existing operation):
insert into mdsys.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) (
  select
    1000000005,
    9635,
    8666,
    PARAMETER_VALUE,
    PARAM_VALUE_FILE_REF,
    PARAM_VALUE_FILE,
    PARAM_VALUE_XML,
    UOM_ID
  from
    mdsys.sdo_coord_op_param_vals
  where
    coord_op_id = 999998 and
    parameter_id = 8666);
 
--Create a rule to use this operation between SRIDs 7406 and 4359: 
call sdo_cs.create_pref_concatenated_op(
    300,
    'CONCATENATED OPERATION',
    TFM_PLAN(SDO_TFM_CHAIN(7406, 1000000005, 4359)),
    NULL);
 
 
-- Now, actually perform the transformation:
set numformat 999999.99999999
 
-- Create the source table
CREATE TABLE source_geoms (
  mkt_id NUMBER PRIMARY KEY,
  name VARCHAR2(32),
  GEOMETRY SDO_GEOMETRY);
 
INSERT INTO source_geoms VALUES(
  1,
  'reference geom',
  SDO_GEOMETRY(
  3001,
  7406,
  SDO_POINT_TYPE(
    -161,
      18,
     0),
  NULL,
  NULL));
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'source_geoms',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',    -100, 100, 10)),
  7406);
 
commit;
 
SELECT GEOMETRY "Source" FROM source_geoms;
 
--------------------------------------------------------------------------------
 
--Perform the transformation:
CALL SDO_CS.TRANSFORM_LAYER(
  'source_geoms',
  'GEOMETRY',
  'GEO_CS_4359',
  4359);
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'GEO_CS_4359',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',    -100, 100, 10)),
  4359);
 
set lines 210;
 
SELECT GEOMETRY "Target" FROM GEO_CS_4359;
 
--------------------------------------------------------------------------------
 
--Transform back:
CALL SDO_CS.TRANSFORM_LAYER(
  'GEO_CS_4359',
  'GEOMETRY',
  'source_geoms2',
  7406);
 
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
  'source_geoms2',
  'GEOMETRY',
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude', -180, 180, 10),
    SDO_DIM_ELEMENT('Latitude',   -90,  90, 10),
    SDO_DIM_ELEMENT('Height',    -100, 100, 10)),
  7406);
 
SELECT GEOMETRY "Source2" FROM source_geoms2;
 
--------------------------------------------------------------------------------
 
--Clean up (regarding the transformation):
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'GEO_CS_4359';
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'SOURCE_GEOMS';
DELETE FROM USER_SDO_GEOM_METADATA WHERE table_name = 'SOURCE_GEOMS2';
 
drop table GEO_CS_4359;
drop table source_geoms;
drop table source_geoms2;
 
 
--Clean up (regarding the rule):
CALL sdo_cs.delete_op(300);
 
delete from mdsys.sdo_coord_op_param_vals where coord_op_id = 1000000005;
 
delete from mdsys.sdo_coord_ops where coord_op_id = 1000000005;
 
COMMIT;

例6-3の構成を使用すると、変換結果は次のようになります。

  • ルールを使用しない場合、データ変換のみに基づいて、(-161.00000000, 18.00000000, .00000000)が(-161.00127699, 18.00043360, 62.03196364)に変換されます。

  • ルールを使用する場合は、(-161.00000000, 18.00000000, .0000000)が(-161.00000000, 18.00000000, 6.33070000)に変換されます。

6.5.4 異なる次元間の変換

2次元ジオメトリから3次元ジオメトリへなど、異なる次元間の変換は、SDO_CS.TRANSFORMファンクションまたはSDO_CS.TRANSFORM_LAYERプロシージャを使用して直接行うことはできません。ただし、SDO_CS.MAKE_3Dファンクションを使用して2次元ジオメトリを3次元ジオメトリに変換したり、SDO_CS.MAKE_2Dファンクションを使用して3次元ジオメトリを2次元ジオメトリに変換することができます。また、変換されたジオメトリを使用して、目的の次元数のジオメトリに変換することができます。

たとえば、2次元ジオメトリを3次元ジオメトリに変換するには、SDO_CS.MAKE_3Dファンクションを使用します。このファンクション自体は座標変換を行わず、単に高さの値を追加し、ターゲットSRIDの設定のみを行います。ターゲットSRIDは適切なものを選択する必要があり、ソースSRIDと等価の3次元の値にする必要があります。たとえば、3次元のWGS 84 (4327)は、2次元のWGS 84 (4326)に相当します。必要に応じて、戻されたジオメトリに含まれる頂点の高さの値を変更します。

SDO_CS.MAKE_3Dファンクションの使用方法には多数の選択肢がありますが、次の方法が最も簡単です。

  1. 2次元のソースSRIDを、2次元のWGS 84 (4326)に変換します。

  2. SDO_CS.MAKE_3Dをコールしてジオメトリを3次元のWGS 84 (4327)に変換します。

  3. 3次元のWGS 84 (4327)を、3次元のターゲットSRIDに変換します。

例6-4では、SRIDが27700の2次元の点を2次元のSRID 4326に変換し、変換結果をSRIDが4327の3次元の点に変換し、変換された点を3次元のSRID 4327に変換します。

例6-4 異なる次元間の変換

SELECT
  SDO_CS.TRANSFORM(
    SDO_CS.MAKE_3D(
      SDO_CS.TRANSFORM(
        SDO_GEOMETRY(
          2001,
          27700,
          SDO_POINT_TYPE(577274.984, 69740.4923, NULL),
          NULL,
          NULL),
        4326),
      height => 0,
      target_srid => 4327),
    4327) "27700 > 4326 > 4327 > 4327"
FROM DUAL;
 
27700 > 4326 > 4327 > 4327(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INF
--------------------------------------------------------------------------------
SDO_GEOMETRY(3001, 4327, SDO_POINT_TYPE(.498364058, 50.5006366, 0), NULL, NULL)

6.5.5 WGS 84に相当する3D

WGS 84座標系に相当する3Dは何か(WGS 84座標系とは2D Oracle SRID 8308またはEPSG SRID 4326)の質問に対する回答には、次の2つが考えられます。

  • 4979 (多くの場合またはほとんどの場合)、または

  • (地表面より上、海面より上または下など)高さをどうとらえるかによって異なります。

多くの異なる高さ基準があります。高さは次の基準に関連付けることができます。

  • 楕円体(SRID値4327、43229および4979がOracle Spatial and Graphで事前定義されるGEOGRAPHIC3dという座標系の種類を使用する必要があります)。

  • 非楕円体高基準(通常、カスタムSRIDを定義する必要があるCOMPOUNDという座標系の種類を使用する必要があります)。非楕円体高は、ジオイド、一部の局所的な海面や平均海水面(または局所的な海面網)、または高さの他の定義(地表面より上など)と関連させて指定できます。

2次元のWGS 84座標系に基づいて複合座標系(「複合座標参照系」を参照)を定義するには、最初に事前定義またはカスタムの垂直座標参照系(「垂直CRSの作成」を参照)を選択する必要があります。使用可能な垂直座標参照系を検索するには、次の文を入力します。

SELECT srid, COORD_REF_SYS_NAME from sdo_coord_ref_sys 
  WHERE COORD_REF_SYS_KIND = 'VERTICAL' order by srid;
 
      SRID COORD_REF_SYS_NAME
---------- ---------------------------------------------------------------------
      3855 EGM2008 geoid height
      3886 Fao 1979 height
      4440 NZVD2009 height
      4458 Dunedin-Bluff 1960 height
      5600 NGPF height
      5601 IGN 1966 height
      5602 Moorea SAU 1981 height
      . . .
      5795 Guadeloupe 1951 height
      5796 Lagos 1955 height
      5797 AIOC95 height
      5798 EGM84 geoid height
      5799 DVR90 height
 
123 rows selected.

垂直座標参照系を選択してから、次の形式で文を入力して複合SRIDを作成します。

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 (
  custom-SRID,
  'custom-name',
  'COMPOUND',
  NULL,
  NULL,
  6326,
  NULL,
  NULL,
  4326,
  vertical-SRID,
  'custom-information-source',
  'custom-data-source',
  'FALSE',
  NULL,
  NULL,
  NULL,
  'TRUE',
  'TRUE');

次の形式で文を入力することによって、生成されたWKTに基づいて定義を確認することができます。

SELECT wktext3d FROM cs_srs WHERE srid = custom-SRID;
 
WKTEXT3D
------------------------------------------------------------------------------
COMPD_CS[
  "NTF (Paris) + NGF IGN69",
  GEOGCS["NTF (Paris)",
    DATUM["Nouvelle Triangulation Francaise (Paris)",
      SPHEROID[
        "Clarke 1880 (IGN)",
        6378249.2,
        293.4660212936293951,
        AUTHORITY["EPSG", "7011"]],
      TOWGS84[-168.0, -60.0, 320.0, 0.0, 0.0, 0.0, 0.0],
      AUTHORITY["EPSG", "6807"]],
    PRIMEM["Paris", 2.337229, AUTHORITY["EPSG","8903"]],
    UNIT["grad", 0.015707963267949, AUTHORITY["EPSG", "9105"]],
    AXIS["Lat", NORTH],
    AXIS["Long", EAST],
    AUTHORITY["EPSG", "4807"]],
  VERT_CS["NGF IGN69",
    VERT_DATUM["Nivellement general de la France - IGN69", 2005,
      AUTHORITY["EPSG", "5119"]],
    UNIT["metre", 1.0, AUTHORITY["EPSG", "9001"]],
    AXIS["H", UP],
    AUTHORITY["EPSG", "5720"]],
  AUTHORITY["EPSG","7400"]]

異なる高さ基準間で変換する場合は、VERTCONマトリックスを使用できます。たとえば、WGS 84楕円体とジオイドの間では、高さの変換を可能にするオフセット・マトリックスがあります。詳細は、次を参照してください。