在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包的函数