本文介绍如何在Oracle Spatial空间数据中添加自定义坐标系。
Oracle 11g r2数据库中没有定义2000国家大地坐标系(CGCS2000,SRID=4490)
,本文将详细说明添加该坐标系的全过程。
1. 判断Oracle Spatial中是否存在该空间参考系
在视图MDSYS.CS_SRS
视图中查找指定SRID值的空间参考系是否存在。
select * from MDSYS.CS_SRS where SRID = 4490;
如果不存在,则按照下面的流程进行添加。
2. 查找空间参考系的详细信息
从EPSG官网 https://epsg.org 查询空间参考系的详细信息。
点击顶部导航栏 EPSG Dataset -> Text Search
进入查询页面。
搜索栏中输入 4490
进行搜索。点击搜索结果名称,进入详情页面。如下图所示:
2.1 定义信息
点击右上角的WKT
查看以WKT描述内容。
2.2 说明
GEOGCRS[ // 说明括号[]中定义的是一个地理坐标系
"China Geodetic Coordinate System 2000", // 该地理坐标系的名称
DATUM[ // 大地基准面
"China 2000", // 大地基准面名称
ELLIPSOID[ // 椭球体
"CGCS2000", // 椭球体名称
6378137, // 椭球体长半轴长
298.257222101, // 椭球体的扁率的倒数
LENGTHUNIT[ // 长度单位
"metre",
1,
ID["EPSG",9001]
],
ID["EPSG",1024] // 椭球体的EPSG ID
],
ID["EPSG",1043] // 大地基准面的EPSG ID
],
CS[ // Coordinate System 坐标系
ellipsoidal,
2, // 2D,二维
ID["EPSG",6422] // 该坐标系的ID,可以通过该ID再次在网站中搜索,查看其详细参数
],
AXIS[ // 坐标轴
"latitude (Lat)", // 名称,纬度(缩写Lat)
north // 向北
],
AXIS[
"longitude (Lon)", // 名称,经度(缩写Lon)
east // 向东
],
ANGLEUNIT[ // (角度)单位
"degree", // 度
0.0174532925199433, // 换算系数,即 1度 = π/180弧度
ID["EPSG",9102] // 该单位的EPSG ID
],
ID["EPSG",4490] // 该地理坐标系统的EPSG ID
]
3. 向数据库中添加空间参考系统SRID=4490
3.1 定义坐标系参数
根据2.2
中的CS
标识可知,2000国家大地坐标系采用的坐标系为EPSG=6422
的大地坐标系。
首先在数据库中查找该坐标系是否存在。
select * from MDSYS.SDO_COORD_SYS where COORD_SYS_ID = 6422;
如果存在则跳过此步骤。
不存在的话,在EPSG官网搜索栏输入6422
查看该坐标系的详细参数。
定义信息如下:
插入数据表MDSYS.SDO_COORD_SYS
中:
insert into
SDO_COORD_SYS
(coord_sys_id, coord_sys_name, coord_sys_type, dimension, information_source, data_source)
values
(
6422, -- EPSG ID
'Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: north, east. UoM: deg', -- 名称
'ellipsoidal', -- 类型,椭球体
2, -- 维度
'EPSG', -- 信息来源
'EPSG' -- 数据来源
);
3.2 定义坐标轴
根据坐标轴名称查询坐标轴ID,坐标轴名称来源于数据表 MDSYS.SDO_COORD_AXIS_NAMES
。
3.2.1 纬度
根据名称查询坐标轴名称:
select * from MDSYS.SDO_COORD_AXIS_NAMES t where t.COORD_AXIS_NAME like '%latitude%';
查询结果:
- 9901: 大地纬度(选择这个)
- 9926: 球形纬度
查询坐标轴信息:
select * from MDSYS.SDO_COORD_AXES WHERE COORD_SYS_ID = 6422 AND COORD_AXIS_NAME_ID = 9901;
如果不存在,则插入:
insert into
MDSYS.SDO_COORD_AXES
(coord_sys_id, coord_axis_name_id, coord_axis_orientation, coord_axis_abbreviation, uom_id, order)
values
(
6422, -- 地理坐标系统均为6422大地坐标系
9901, -- 坐标轴名称ID,关联数据表MDSYS.SDO_COORD_AXIS_NAMES
'north', -- 纬度坐标轴方向,向北
'Lat', -- 纬度缩写
9122, -- 坐标轴单位:度(degree)。从数据表MDSYS.SDO_UNITS_OF_MEASURE中查询得到UOM_ID=9122
1 -- 坐标轴顺序,纬度为1,经度为2
);
3.2.2 经度
select * from MDSYS.SDO_COORD_AXIS_NAMES t where t.COORD_AXIS_NAME like '%longitude%';
查询结果:
- 9902: 大地经度(选择这个)
- 9927: 球形经度
查询坐标轴信息:
select * from MDSYS.SDO_COORD_AXES WHERE COORD_SYS_ID = 6422 AND COORD_AXIS_NAME_ID = 9902;
如果不存在,则插入:
insert into
MDSYS.SDO_COORD_AXES
(coord_sys_id, coord_axis_name_id, coord_axis_orientation, coord_axis_abbreviation, uom_id, order)
values
(
6422, -- 地理坐标系统均为6422大地坐标系
9902, -- 坐标轴名称ID,关联数据表MDSYS.SDO_COORD_AXIS_NAMES
'east', -- 经度坐标轴方向,向北
'Long', -- 经度缩写
9122, -- 坐标轴单位:度(degree)。从数据表MDSYS.SDO_UNITS_OF_MEASURE中查询得到UOM_ID=9122
2 -- 坐标轴顺序,纬度为1,经度为2
);
3.3 定义椭球体
根据2.2
中的DATUM.ELLIPSOID.EPSG
标识可知,2000国家大地坐标系采用的椭球体为EPSG=1024
。
首先在数据库中查找该椭球体定义是否存在。
select * from SDO_ELLIPSOIDS t where t.ELLIPSOID_ID = 1024;
如果存在则跳过此步骤。
不存在的话,在EPSG官网搜索栏输入1024
查看该椭球体的详细参数。
定义信息如下:
插入数据表MDSYS.SDO_ELLIPSOIDS
中:
insert into MDSYS.SDO_ELLIPSOIDS
(ellipsoid_id, ellipsoid_name, semi_major_axis, uom_id, inv_flattening, semi_minor_axis, information_source, data_source, is_legacy, legacy_code)
values
(
1024, -- 椭球体ID
'CGCS2000', -- 名称
6378137, -- 长半轴
9001, -- 单位:米(meter),从数据表MDSYS.SDO_UNITS_OF_MEASURE中查询得到UOM_ID=9001
298.257222101, -- 扁率的倒数
6356752.31414036, -- 短半轴
'Chinese Academy of Surveying and Mapping.', -- 描述
'OGP', -- 数据来源
'FALSE', -- 是否在之前的版本中定义了相同的椭球体,由于是自定义椭球,此处直接设置FALSE
null -- 存在相同语义的椭球体的值,此处直接设置null
);
- 长半轴:a = 6378137
- 扁率的倒数: $\frac{1}{\alpha}$ = 298.257222101
根据公式
$$\alpha = \frac{a - b}{a}$$
可得
$$b = a \times (1 - \alpha)$$
计算得到 b = 6356752.31414036 。
3.4 定义大地基准
根据2.2
中的DATUM.EPSG
标识可知,2000国家大地坐标系采用的大地基准为China 2000
(EPSG=1043
)。
首先在数据库中查找该大地基准定义是否存在。
select * from MDSYS.SDO_DATUMS t where t.datum_id = 1043;
如果存在则跳过此步骤。
如果不存在,则在EPSG官网搜索栏输入1043
查看该椭球体的详细参数。
定义信息如下:
插入数据表MDSYS.SDO_DATUMS
中:
insert into
MDSYS.SDO_DATUMS
(datum_id, datum_name, datum_type, ellipsoid_id, prime_meridian_id, information_source, data_source, shift_x, shift_y, shift_z, rotate_x, rotate_y, rotate_z, scale_adjust, is_legacy, legacy_code)
values
(
1043, -- 大地基准EPSG ID
'China 2000', -- 名称
'GEODETIC', -- 类型
1024, -- 椭球体ID,参见本文3.3节
8901, -- 中央子午线ID,格林尼治0du经线(EPSG=8901)
'Chinese Academy of Surveying and Mapping.',
'OGP',
null, -- shift_x,7参数:在x轴上,将椭球中心相对于WGS 84椭球中心相对移动的米数
null, -- shift_y,7参数:在Y轴上,将椭球中心相对于WGS 84椭球中心相对移动的米数
null, -- shift_z,7参数:在Z轴上,将椭球中心相对于WGS 84椭球中心相对移动的米数
null, -- rotate_x,7参数,绕X轴旋转的弧秒数
null, -- rotate_y,7参数,绕Y轴旋转的弧秒数
null, -- rotate_z,7参数,绕Z轴旋转的弧秒数
null, -- scale_adjust,7参数:调整参数
'FALSE', -- 是否在之前的版本中定义了相同的椭球体,由于自定义,直接设为FALSE
null -- 存在相同语义的椭球体的值,此处直接设置null
);
3.5 定义空间参考系
向视图MDSYS.SDO_COORD_REF_SYSTEM
中插入数据:
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
(
4490, --空间参考系SRID
'China Geodetic Coordinate System 2000', --空间参考的名称
'GEOGRAPHIC2D', -- 空间参考的类型,这里为地理二维(Geographic2D)
6422, --坐标系ID,使用数据库中存在的6422,见本文2.2节: CS.EPSG=6422
1043, --大地基准面ID,见本文2.2节:DATUM.ELLIPSOID.EPSG=1043
1043, --坐标系的大地基准面ID,
NULL,
NULL,
NULL,
NULL,
'EPSG. See 3D CRS for original information source.',
'OGP',
'FALSE',
NULL,
NULL,
NULL,
'TRUE', -- 是否有效,是
'TRUE' -- 是否支持几何对象,支持
);
至此,完成向Oracle Spatial
空间数据库中添加2000国家大地坐标系(SRID:4490)
。