之前项目换过服务器,移植数据库时候并没有正确完整的移植自定义的投影坐标系,结果就报出莫名其妙的一些错误,比如unable to transform rectangle due to: ORA-13199: SRID does not exist。
因为在移植坐标系的时候仅仅只是将MDSYS.SDO_CRS_CS表中对应的SRID记录转存,一开始我也以为定义坐标系只要在这个表中插入数据即可,但发现事实并非如此。自定义投影坐标系是应该在视图MDSYS.SDO_COORD_REF_SYSTEM插入数据,通过触发器MDSYS.SDO_CRS_INSERT_TRIGGER在表MDSYS.SDO_COORD_REF_SYS插入相同的数据,并且在MDSYS.SDO_CRS_CS表中插入SRID记录。
在向视图MDSYS.SDO_COORD_REF_SYSTEM中插入数据之前,首先需要知道你的转换参数,并将转换参数插入表MDSYS.Sdo_Coord_Op_Param_Vals中,下面给出一个实例:
--PROJCS[ -- "Xian 1980 / 3-degree Gauss-Kruger CM 118.83E", -- GEOGCS [ -- "Xian 1980", -- DATUM [ -- "Xian 1980 (EPSG ID 6610)", -- SPHEROID ["Xian 1980 (EPSG ID 7049)", 6378140, 298.257]], -- PRIMEM [ "Greenwich", 0.000000 ], -- UNIT ["Decimal Degree", 0.01745329251994328]], -- PROJECTION ["Transverse Mercator"], -- PARAMETER ["Latitude_Of_Origin", 0], -- PARAMETER ["Central_Meridian", 118.8333], -- PARAMETER ["Scale_Factor", 1], -- PARAMETER ["False_Easting", 500000], -- PARAMETER ["False_Northing", 0], -- UNIT ["Meter", 1]] -- 首先,基础地理坐标系是Xian 1980, 它的EPSG ID为6610 -- 然后找到与计算PROJECTION["Transverse Mercator"]ESPG等式 select coord_op_method_id, legacy_name from sdo_coord_op_methods where not legacy_name is null order by coord_op_method_id; --结果显示 --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 ------------- --根据PROJECTION ["Transverse Mercator"],选择9807 --建立坐标转换规则,编号96170 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( 96170, '3-degree Gauss-Kruger CM 118.83E (EPSG OP 96170)', 'CONVERSION', NULL, NULL, NULL, NULL, 9807, NULL, NULL, 'EPSG', 'EPSG', 1, 'FLASE', NULL, 1, 1, 1); --看看需要添加哪些参数 select use.parameter_id ||':'|| use.legacy_param_name from sdo_coord_op_param_use use where use.coord_op_method_id=9807 --结果: -- 8801:Latitude_Of_Origin -- 8802:Central_Meridian -- 8805:Scale_Factor -- 8806:False_Easting -- 8807:False_Northing --检查一下完全吻合啊!!!!! --现在查查经常使用的单位: select UOM_ID ||':'|| UNIT_OF_MEAS_NAME from sdo_units_of_measure where uom_id in (9001,9101,9102,9201) order by uom_id; --结果 -- 9001:metre -- 9101:radian -- 9102:degree -- 9201:unity --现在,插入参数 -- 8801: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( 96170, 9807, 8801, 0, NULL, 9102 ); -- 8802: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( 96170, 9807, 8802, 118.833333333333, NULL, 9102 ); -- 8805:Scale_Factor 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( 96170, 9807, 8805, 1, NULL, 9201 ); -- 8806: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( 96170, 9807, 8806, 500000, NULL, 9001 ); -- 8807: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( 96170, 9807, 8807, 0, NULL, 9001 ); --现在建立投影坐标系。首先要确定GEOG_CRS_DATUM_ID和COORD_SYS_ID。 --GEOG_CRS_DATUM_ID是地理坐标系对应的datum_id --select datum_id from sdo_coord_ref_sys where srid=4610 --GEOG_CRS_DATUM_ID为6610 --CORD_SYS_ID是4530,CORD_SYS_NAME为Cartesian 2D CS. Axes: northing, easting (X,Y). Orientations: north, east. UoM: m. --现在开始建立投影坐标系 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( 9992010, 'Xian 1980 / 3-degree Gauss-Kruger CM 118.83E', 'PROJECTED', 4530, NULL, 6610, 4610, 96170, NULL, NULL, 'EPSG', 'EPSG', 'FALSE', NULL, NULL, NULL, 'TRUE', 'TRUE');