Oracleから提供されている座標系でニーズを十分に満たすことができない場合は、ユーザー定義の座標参照系を作成できます。
注意:
「座標系(空間参照システム)」で述べたように、coordinate systemという用語とcoordinate reference system(CRS)という用語は、通常、区別なく使用されます。ただし、「座標参照系」は、地球をベースにしている必要があります。
ユーザー定義のCRSを作成する手順は、厳密には、それが測地座標参照系であるか、投影座標参照系であるかによって異なります。どちらの場合も、座標系に関する情報(座標軸、軸の名前、測定単位など)を指定する必要があります。測地CRSの場合は、データに関する情報(楕円体、本初子午線など)を指定します(「測地CRSの作成」を参照)。投影CRSの場合は、ソース(測地)CRSと投影法に関する情報(操作およびパラメータ)を指定します(「投影CRSの作成」を参照)。
ユーザー定義の座標系の場合、SRID値は1000000以上にする必要があります。
測定単位、座標軸、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ビューに行を挿入します。
例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');
測定単位、座標軸、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ビューに行を挿入します。
例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に、ユーザー定義の投影座標参照系の作成例に注釈を付けて拡張した例を示します。
垂直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などがあり、これらの各変形に対して別々の操作を定義できます。このような操作については、「変換操作の作成」を参照してください。
複合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);
地理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');
「投影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にロードされます。
投影座標参照系で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の基になっているオフセット・マトリックスが含まれています。
次の手順を実行します。
例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; /