Oracle Spatial构建自定义投影坐标系

 

 

 

  之前项目换过服务器,移植数据库时候并没有正确完整的移植自定义的投影坐标系,结果就报出莫名其妙的一些错误,比如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'); 

 

你可能感兴趣的:(oracle)