• 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'); 
  • 相关阅读:
    hdu2089 数位dp
    AIM Tech Round 3 (Div. 2)
    Codeforces Round #372 (Div. 2)
    src 小心得
    水平文字垂直居中
    点击验证码刷新(tp3.1)--超简单
    TP3.1 中URL和APP区别
    getField方法
    PHP截取中文无乱码函数——cutstr
    substr — 详解
  • 原文地址:https://www.cnblogs.com/cleverxy/p/2474563.html
Copyright © 2020-2023  润新知