Oracle中使用SDO_UTIL.FROM_WKTGEOMETRY时如何传入SRID?
Oracle Spatial插入几何数据时指定SRID的两种方法
你当前通过SDO_UTIL.FROM_WKTGEOMETRY生成的几何对象默认不带SRID,要在插入时补上SRID,推荐两种实用方法:
方法1:直接构造SDO_GEOMETRY对象
跳过FROM_WKTGEOMETRY,直接实例化SDO_GEOMETRY类型,在构造参数里明确指定SRID。比如你的坐标如果是WGS84(EPSG:4326),写法如下:
insert into TEST_GEOMS values ( 'st_1', SDO_GEOMETRY( 'LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)', 4326 -- 替换为你实际需要的SRID值 ) );
方法2:修改FROM_WKTGEOMETRY返回对象的SRID
如果坚持要用FROM_WKTGEOMETRY,可以通过修改返回对象的SDO_SRID属性来设置,两种实现方式:
方式A:匿名块赋值后插入
DECLARE geom SDO_GEOMETRY; BEGIN geom := SDO_UTIL.FROM_WKTGEOMETRY('LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)'); geom.SDO_SRID := 4326; -- 给几何对象设置SRID INSERT INTO TEST_GEOMS VALUES ('st_1', geom); END; /
方式B:直接在INSERT语句中构造新对象
insert into TEST_GEOMS values ( 'st_1', SDO_GEOMETRY( SDO_UTIL.FROM_WKTGEOMETRY('LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)').SDO_GTYPE, 4326, SDO_UTIL.FROM_WKTGEOMETRY('LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)').SDO_POINT, SDO_UTIL.FROM_WKTGEOMETRY('LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)').SDO_ELEM_INFO, SDO_UTIL.FROM_WKTGEOMETRY('LINESTRING (11.681684 48.239255, 11.681951 48.239216, 11.682218 48.239176)').SDO_ORDINATES ) );
这种写法比较冗长,只适合临时场景,批量操作推荐用匿名块或方法1。
注意事项
- 确保你指定的SRID在数据库的
SDO_COORD_REF_SYS表中存在,否则会抛出坐标系统不存在的错误。可以用这条SQL查询常用SRID:
SELECT SRID, COORD_REF_SYS_NAME FROM SDO_COORD_REF_SYS WHERE COORD_REF_SYS_NAME LIKE '%WGS 84%';
- 后续如果要对表中的几何数据做空间运算,SRID必须一致,否则会报错。
内容的提问来源于stack exchange,提问作者CodeoDE
相关产品推荐
相关产品推荐

