微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle Spatial中SDO_Geometry说明及Demo例子

ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long RawESRIST_Geometry以及基于Oracle SpatialSDO_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_TYPESDO_ELEM_INFO_ARRAYSDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和sdo_geometry是一样的。

现在对sdo_geometry类型中的各个参数简单的介绍:

1SDO_GTYPE:表示要存储的几何类型,如点线面。它是通过NUMBER类型来表达的;

2SDO_SRID:几何的空间参考坐标系,类型也为NUMBER

3SDO_POINT:如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义SDO_POINT_TYPE类型;

4SDO_ELEM_INFO:定义要如何理解SDO_ORDINATES中的坐标串的;

5SDO_ORDINATES:存储实际坐标的,以XY以及不同点之间都是逗号隔开;

下面将详细介绍这些字段参数的含义

一、SDO_GTYPE

SDO_GTYPE值是有四位数字组成的,它们的格式为:dltt

其中,d表示几何的维数。如二维、三维对应的d=2d=3l定义了lrs。一般l=0

tt定义了地理对象的类型。现在使用从0007,如tt=01代表为单点;

下面就是t=2的二维几何类型,SDO_GTYPE参数值具体,如1

SDO_GTYPE

几何类型

相关描述

2000

未知的地理类型

Spatial会无视这个类型的地理对象

2001

单点Point类型

地理对象包含一个普通的点

2002

单线polylineCurve类型

地理对象包含直线或片段segments

2003

polygon类型

地理对象包含一个普通的多边形,但不包含空岛

2004

集合COLLECTION类型

地理包含不同类型元素集合

2005

多点MultiPoint类型

地理对象包含多个点的集合

2006

多线Mutlipolyline和多曲线类型

地理对象有一或更多的线或曲线集合

2007

多多边形Mutlipolygon类型

一个地理对象包含岛(多岛)的多边形和N个多边形

对于一个给定的层,所有的地理对象必须都是相同的维度,不能将二维与三维的数据放在一个层里。

二、SDO_SRID

SDO_SRID定义了空间坐标参考系统。如果SDO_SRIDnull,则没有指定坐标系统,如果SDO_SRID不为null,那么它的值必须在在mdsYS.CS_SRS表中的SRID列有对应的值,而且它的值必须插入USER_SDO_GEOM_MetaDATA视图中。mdsYS.CS_SRS表参考图2

mdsYS.CS_SRS

列名

类型

列名描述

CS_NAME

VARCHAR2(68)

坐标系统名称

SRID

NUMBER(38)

空间参考ID,为唯一值。1-999999spatial使用的空间参考,1000000以后为用户自定义

AUTH_SRID

可选的SRID,是个外键。另一个坐标系统的SRID

AUTH_NAME

VARCHAR2(256)

WKTEXT

VARCHAR2(2046)

CS_BOUNDS

mdsYS.SDO_GEOMETRY


三、SDO_POINT

SDO_POINT类型的构造方法为:sdo_point_type(x,y,z),其中x,z类型为DoubleInt都可

SDO_POINT字段定义为含有XYZ属性SDO_POINT_TYPE类型。如果几何类型为点类型的话,SDO_ELEM_INFOSDO_ORDINATES对应的值都为NullSDO_POINT不为空。其它情况下,SDO_POINT会被Spatial所忽略即设为Null。如果这个层只有点对象,那么推荐你将其保存在SDO_POINT属性中。SDO_POINT_TYPE类型的定义如下:

CREATE TYPE sdo_point_type AS OBJECT (
X NUMBER,//X
坐标值
Y NUMBER,//y
坐标值
Z NUMBER); //z
坐标值

四、SDO_ELEM_INFO

SDO_ELEM_INFO类型的构造方法为:sdo_elem_info_arraya,b.c),其中a,b.cNumber类型。

SDO_ELEM_INFO是理解和掌握SDO_Geometry的重点和难点,SDO_ELEM_INFO定义了如何理解SDO_ORDINATES中的坐标字符串属性

SDO_ELEM_INFO每三个数字组合为一个SDO_ELEM_INFO属性单元(具体可以结合下面的例子理解)。

每个SDO_ELEM_INFO属性单元由:SDO_STARTING_OFFSETSDO_ETYPESDO_INTERPRETATION组成。下面介绍一下这三个数字的具体含义:

4.1SDO_STARTING_OFFSET:声明了组成当前几何片段的第一个坐标在SDO_ORDINATES数组中的坐标序号。坐标序号是从1开始起算的而非从0开始。这里的SDO_ORDINATES就是sdo_geometry中的坐标序列,坐标序列是已逗号隔开的数字,具体的计算如:sdo_ordinate_array(1,4,6,7,8,9)中如果以'6'开始几何片段的话,坐标序号SDO_STARTING_OFFSET=3。(具体参考下面的例子理解)

4.2SDO_ETYPE:声明元素的类型。可结合SDO_STARTING_OFFSETSDO_ETYPE表来理解.

SDO_ETYPE= 1,2,1003,2003,说明几何为简单的几何类型。可以全部按SDO_ELEM_INFO属性单元【即三个以逗号隔开的数】来理解sdo_ordinate_array中的坐标序列。

特别说明:SDO_ETYPE= 1003,假如几何类型为面,则表示为外多边形环(以逆时针顺序)

SDO_ETYPE= 2003,假如几何类型为面,则表示为内多边形环(以顺时针顺序)

SDO_ETYPE= 4,10052005,说明几何为组合元素,往往第一个三数字组不是SDO_ELEM_INFO属性单元,而是为了说明组合元素的信息。具体可以参见下面复杂多义线复杂多边形的例子。

4.3SDO_INTERPRETATION:有两种可能的意思,依赖地SDO_ETYPE是否是组合元素。如果SDO_ETYPE= 4,10052005,标识的是有多少组合部分,具体参考复杂多义线复杂多边形的例子。如果SDO_ETYPE= 1,2003,标识决定了元素坐标队列的翻译顺序。

SDO_STARTING_OFFSETSDO_ETYPE如下图3:

五、SDO_ORDINATES

SDO_ORDINATES类型的构造方法为:sdo_ordinate_array(x1,y1,x2,y2,……),其中x1,y1类型等为DoubleInt都可。

SDO_ORDINATES存储的是空间对象的几何节点坐标序列,用逗号将XYZ以及不同点之间隔开,该字段性质:长度=1048576的数字Number类型。如果几何为二维的情况,存储的序列为{Y1,X2,Y2,X3,Y3,X4,Y4......}格式;几何为三维坐标的话,如三维坐标的多边形它的存储的序列为{X1,Y1,Z1,Z2,Z3,Y4,Z4,X1,Z1}格式。坐标序列中的数据必须都合法且不为空。具体坐标的组合成几何的结合SDO_ELEM_INFO来理解。

六、参考例子

6.1、矩形:

矩形的具体几何形状和坐标,如下图:


SDO_GEOMETRY定义该矩形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 20032003中的2表示二维数据,2003中的3表示表示多边形。具体参考1

SDO_SRID = NULL

SDO_POINT = NULL

SDO_ELEM_INFO = (1,3).;在属性单元SDO_ELEM_INFO1,3)中的最后一个3表示该几何为矩形,具体参考图4

---因为它是矩形且为二维所以它的构造方法为:sdo_point_type(左下坐标,右上坐标)。

SDO_ORDINATES = (1,1,5,7).定义了具体的左下坐标和右上坐标的坐标序列。

例子:用sql命令插入一个矩形:

INSERT INTO beniy388 VALUES(
1,//
其他的属性字段的值
'UpDooGIS',//
其他的属性字段的值
mdsYS.SDO_GEOMETRY(//
几何字段SDO_GEOMETRY的值
2003,--
二维多边形
NULL,
NULL,
mdsYS.SDO_ELEM_INFO_ARRAY(1,3),--
一个矩形(1003为逆时针方向)
mdsYS.SDO_ORDINATE_ARRAY(1,7) --
只需要两点

)
);

6.2、有岛多边形:

有岛多边形的具体几何形状和坐标,如下图:


SDO_GEOMETRY定义该多边形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 2003---2003中的2表示二维数据,2003中的3表示表示多边形。具体参考1

SDO_SRID = NULL

SDO_POINT = NULL

SDO_ELEM_INFO = (1,19,2003,1)---有两个三元组SDO_ELEM_INFO属性元素。具体参考4

---其中1003表明对应的坐标序列组成的几何A为外多边形环(顺时针);而2003表明对应的坐标序列组成的几何B为内多边形环(逆时针)

---19表示几何B坐标序列开始的位置,也就是说从19开始的几何坐标组成几何B,而118组成几何A

SDO_ORDINATES = (10,10,14,10)---坐标系列

例子:用sql命令插入一个有岛的多边形:

INSERT INTO beniy388 VALUES
10,//
其他的属性字段的值
'UpDooGIS',//
其他的属性字段的值
mdsYS.SDO_GEOMETRY(//
几何字段SDO_GEOMETRY的值
2003,1),--
有岛多边形
mdsYS.SDO_ORDINATE_ARRAY(2,3,13,9,11,5)
)
);

6.3、复杂多义线

下图描述的是一个由一条直线和一条曲线构成的复杂多义线。图中出现了4个点,(10,10)(10,14)点表示的是直线;(10,14),(10,6),(14,10)描述的是圆弧曲线:


SDO_GEOMETRY定义该复杂多义线,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:

SDO_GTYPE = 20022002中的2表示二维数据,第二个2表示表示一条或多条直线段。具体参考1

SDO_SRID = NULL

SDO_POINT = NULL

SDO_ELEM_INFO = (1,2). ---有三个三元组,其中后两个是SDO_ELEM_INFO属性元素三元组,前一个为表述组合。具体参考4

---一个元组1,2】,根据4可以得到是个描述三元组2表示有两个几何元素组成,即后两个三元组描述各自的几何A和几何B

---第二个三元组1,1】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何A。根据4可以得到它是一条直线段,且该直线段的最后一个节点还是下一个几何B的开始点,即几何A和几何B有几何节点重合。

---第二个三元组3,2】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何B。根据4可以得到它是一条曲线段,该几何B的起点和几何A终点节点重合。

SDO_ORDINATES = (10,10)---坐标系列

例子:用sql命令插入一个复杂多义线:

INSERT INTO beniy388 VALUES(
11,//
其他的属性字段的值
mdsYS.SDO_GEOMETRY(//
几何字段SDO_GEOMETRY的值
2002,2),--
复杂多义线
mdsYS.SDO_ORDINATE_ARRAY(10,10)
)
);


=========================================================

下面写一个例子

create table POI
(
ID INTEGER,
GNAME VARCHAR2(256),
GSHAPE mdsYS.SDO_GEOMETRY
);

INSERT INTO poiVALUES (1,'矩形cola_a',mdsYS.SDO_GEOMETRY( -- 几何字段SDO_GEOMETRY的值 2003,-- 二维多边形 8307,-- select * from mdsYS.CS_SRS srs where srs.srid=8307; NULL,-- 当时点的时候录入 mdsYS.SDO_ELEM_INFO_ARRAY(1,-- 一个矩形(1003为逆时针方向) mdsYS.SDO_ORDINATE_ARRAY(1,7) -- 只需要两点 ));INSERT INTO poiVALUES (2,'多边形cola_b',mdsYS.SDO_GEOMETRY(2003,NULL,SDO_ELEM_INFO_ARRAY(1,-- one polygon (exterior polygon ring) SDO_ORDINATE_ARRAY(5,1) ------ ));INSERT INTO poiVALUES (3,'多边形cola_c',--one polygon (exterior polygon ring) SDO_ORDINATE_ARRAY(3,3) ---- ));-- SDO_GTYPE = 2002;2002中的2表示二维数据,第二个2表示表示一条或多条直线段。具体参考 图1。-- SDO_SRID = NULL;-- SDO_POINT = NULL;-- SDO_ELEM_INFO = (1,2). ---有三个三元组INSERT INTO poiVALUES (4,'点cola_d',mdsYS.SDO_GEOMETRY( --几何字段SDO_GEOMETRY的值 2001,8307,mdsYS.sdo_point_type(63918.6936868593,39300.6724619204,null),-- 定义一个点 null,-- 复杂多义线 null));

原文地址:https://www.jb51.cc/oracle/207917.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐