基于Oracle Spatial的存储方式学习总结
在arcgis中通过sde存储空间数据到oracle中有多种存储方式,分别有:二进制long raw、esri的st_geometry以及基于oracle spatial的sdo_geometry等等。
关于这几种方式的各自的优缺点不是主要的探讨的方向,这些我们可以通过arcgis中的arcgis server help得到相关的帮助。这里主要是学习关于基于oracle spatial的存储方式,通过这种存储方式几何列shape的字段类型为mdsys.sde_geometry类型。
oracle spatial定义的sdo_geometry类型为:
create type sdo_geometry as object (
sdo_gtype number,//前面字符串为字段名;后面字符串为字段类型
sdo_srid number,
sdo_point sdo_point_type,
sdo_elem_info sdo_elem_info_array,
sdo_ordinates sdo_ordinate_array);
其中sdo_geometry as object,标识该类型为对象类型。开始我们可以想想它为arcobjects中的geometry对象(本来要素的shape字段中的对象就是geometry),而不要理解他是怎么样组织的。至于该类型中的sdo_point_type、sdo_elem_info_array、sdo_ordinate_array也是oracle spatial自定义的类型和sdo_geometry是一样的。
为了理解方便本人专门画了一个vision图进行总结便于记忆,对sdo_geometry主要的五个参数的意义进行了解,会发现其实很简单。通过动手进行相关的地理要素的crud会对他的印象更加深刻,因此可以从sql语句组成出发,再结合本图表。
网上有很多例子,就不再赘述,列举两个sql语句:
1.插入矩形
insert into beniy388 values(
1,//其他的属性字段的值
'updoogis', //其他的属性字段的值
mdsys.sdo_geometry(//几何字段sdo_geometry的值
2003,--二维多边形
null,
null,
mdsys.sdo_elem_info_array(1,1003,3), --一个矩形(1003为逆时针方向)
mdsys.sdo_ordinate_array(1,1, 5,7) --只需要两点
)
);
2.用sql命令插入一个有岛的多边形:
insert into beniy388 values
10, //其他的属性字段的值
'updoogis', //其他的属性字段的值
mdsys.sdo_geometry(//几何字段sdo_geometry的值
2003,
null,
null,
mdsys.sdo_elem_info_array(1,1003,1, 19,2003,1), --有岛多边形
mdsys.sdo_ordinate_array(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,7,5, 7,10, 10,10, 10,5, 7,5)
)
);
3.例子:用sql命令插入一个复杂多义线:
insert into beniy388 values(
11, //其他的属性字段的值
'updoogis', //其他的属性字段的值
mdsys.sdo_geometry(//几何字段sdo_geometry的值
2002,
null,
null,
mdsys.sdo_elem_info_array(1,4,2, 1,2,1, 3,2,2), --复杂多义线
mdsys.sdo_ordinate_array(10,10, 10,14, 6,10, 14,10)
)
);
4.查询geometry并将其转化为wkt格式:select id,sdo_util.from_wktgeometry(geometrycolume)form tablename ;
当然还有很多其他的函数可以使用。
参考链接:oracle sdo_geometry 详细介绍
oracle spacial(空间)sdo_util包的函数