SDO_GEOMETRY结构说明

1  SDO_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 ,标识该类型为对象类型。至于该类型中的SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY、 SDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和 sdo_geometry 是一样的。

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

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

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

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

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

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

1.1 类型解释

1.1.1
SDO_GTYPE  --标识几何体类型

SDO_GTYPE值是有四位数字组成的,有4位数字构成 dltt

  • d:表示几何的维数。如二维、三维对应的d=2和d=3;
  • l:标识三维线状参考系统(Linear
    referencing system,LRS)几何体的LRS度量维,即哪一维含度量值(measure value),可能的取值为3、4,对于非LRS几何体或者以ORACLE     SPATIAL默认的最后一维为LRS度量维,则l取值为0;
  • tt:定义了地理对象的类型。现在使用从00到07,如tt=01代表为单点;

如下表1:



几何体类型


描述


dl00


UNKNOW_GEOMETRY


Oracle Spatial忽略该几何体数据


dl01


POINT


该几何体为一个点


dl02


LINE or CURVE


该几何体为一线串(线串中的段可以为直线段也可以为弧线断


dl03


POLYGON


该几何体为一多边形,该多边形可有洞也可没有


dl04


COLLECTION


是元素的集合,其中的元素只要是非COLLECTION类型的即可


dl05


MULTIPOINT


含一个或多个点的几何体


dl06


MULTILINE or MULTICURVE


含一个或多个线串的几何体


dl07


MULTIPOLYGON


多个DISJOINT的多边形

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


SDO_GTYPE


几何类型


相关描述


2000


未知的地理类型


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


2001


单点Point类型


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


2002


单线Polyline和Curve类型


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


2003


Polygon类型


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


2004


集合COLLECTION类型


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


2005


多点MultiPoint类型


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


2006


多线MultiPolyline和多曲线类型


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


2007


多多边形MultiPolygon类型


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

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

1.1.2
SDO_SRID    --标识坐标系统

SDO_SRID定义了空间坐标参考系统。如果SDO_SRID为null,则没有指定坐标系统,如果SDO_SRID不为null,则该值必须来自于MDSYS.CS_SRS的SRID列,并且这样的值必须插入到USER_SDO_GEOM_METADATA视图的SRID列中,一图层中,各几何体的SRID值必须相同。MDSYS.CS_SRS 表参考

如下表3:


列名


类型


列名描述


CS_NAME


VARCHAR2(68)


坐标系统名称


SRID


NUMBER(38)


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


AUTH_SRID


NUMBER(38)


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


AUTH_NAME


VARCHAR2(256)


WKTEXT


VARCHAR2(2046)


CS_BOUNDS


MDSYS.SDO_GEOMETRY

1.1.3
SDO_POINT    --仅用于点几何体

SDO_POINT类型的构造方法为:sdo_point_type(x,y,z),其中x,y,z类型为Double和Int都可以;

SDO_POINT字段定义为含有X、Y、Z属性的SDO_POINT_TYPE类型。如果几何类型为点类型的话,SDO_ELEM_INFO 和SDO_ORDINATES对应的值都为Null,SDO_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坐标值

1.1.4
SDO_ELEM_INFO   --坐标解释方式

SDO_ELEM_INFO类型的构造方法为:sdo_elem_info_array(a,b,c),其中a,b,c为Number类型,其用途是该属性给出了SDO_ORDINATES中坐标的解释方式。SDO_ELEM_INFO数组中,每三个数值为一组,用于解释一个元素(ELEMENT),组中的数值的意义为:

SDO_STARTING_OFFSET:第一个数值,存放该元素的首坐标在SDO_ORDIANTES中的位置(从1开始);

SDO_ETYPE:第二个数值,标识元素的类型;

SDO_INTERPRETATION:和以上两个数据一起解释元素;

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

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

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

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

(2) SDO_ETYPE :声明元素的类型。可结合 SDO_STARTING_OFFSET和SDO_ETYPE 表来理解.

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

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

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

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

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

SDO_STARTING_OFFSET和SDO_ETYPE 表 如下4:


SDO_ETYPE


SDO_INTERPRETATION


两个组合值的具体含义


参见例子


0


任何数(n)


Oracle Spatial不支持的几何类型


1


1


普通单点


1


n(>1)


多点


2


1


由直线组成的多义线(Polyline就是多义线之一)


2


2


由曲线片段组成的多义线。每一曲线由三个点来描述:起点,任意在曲线段组成的一点,终点,且前一个曲线终点是下一个曲线的起点


1003/2003


1


由系列直线组成的多边形,务必写出每个节点的坐标,而且最后一个点的坐标要和第一个点相同,构成封闭

1003表示外环,2003表示内环,以下同


有岛的多边形


1003/2003


2


由系列曲线构成的自封闭的多边形,该多边形的前一条弧段的终点和后一条弧段的起点重合


1003/2003


3


矩形,用左下和右上的两个点进行描述,本类型不用于地理数据


矩形


1003/2003


4


圆(由圆上任意三个非共线的点坐标进行描述)


4


n(n>1)


由系列直线和系列曲线组成的复杂多义线。其中n值表示多义线总共由几部分直线和曲线构成。此时SDO_ELEM_INFO包含的该三元组不是SDO_ELEM_INFO属性单元,接下来SDO_ELEM_INFO有n个SDO_ELEM_INFO属性单元用于表述成多义线各个部分


复杂多义线


1005/2005


n(n>1)


由系列直线和曲线组成的复杂多边形,n表示这些子线串的个数,其他与上面雷同


复杂多边形

1.1.5
SDO_ORDINATES   --坐标值

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

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

1.1.6 参考例子

(1)      矩形

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

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

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

例子:矩形实例:

sdo_geometry (

2003,  -- 二维多边形

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一个矩形(1003为逆时针方向)

SDO_ORDINATE_ARRAY(1,1,
5,7) -- 只需要两个点的坐标

)

);

(2)      有岛的多边形

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

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

例子:用SQL 命令更新一个有岛的多边形:

DECLARE

geom sdo_geometry;

BEGIN

geom:=sdo_geometry (
                                
2003,
                                
null,
                               
 null,
                                
SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),

---有两个三元组SDO_ELEM_INFO属性元素

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

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

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)  ---坐标系列

)
            );

execute immediate 
‘update zd_test set shape=:gm where
objectid=227944‘ using geom;

END;                   ---zd_test为表名,shape为几何对象

(3)      复杂多义线

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

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

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

例子:用SQL 命令更新一个复杂多义线:

DECLARE

geom
sdo_geometry;

BEGIN

geom:=sdo_geometry(

2002,

NULL,

NULL,

sdo_elem_info_array(1,4,2,
1,2,1, 3,2,2),

---有三个三元组,其中后两个是SDO_ELEM_INFO属性元素三元组,前一个为表述组合。

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

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

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

sdo_ordinate_array(10,10,
10,14, 6,10, 14,10)

);

execute immediate  ‘update zd_test set shape=:gm where
objectid=218950‘ using geom;

END;

1.2 SDO_GEOMETRY的sql语句实例

1.2.1
简单点(单点)

  • 单点

sdo_geometry(

2001,   ---2001代表单点

null,

sdo_point_type(63918.6936868593, 39300.6724619204, null),

----分别对应点X、Y、Z的值

null,

null

);

1.2.2
简单线(单部件连续的折线)

  • 折线串(由多条直线段组成)

sdo_geometry

(2002,

null,

null,

sdo_elem_info_array(1,2,1),

sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314,
39302.5029543953, 63918.7576130323, 39304.3335865351, 63918.777577428,
39306.1643233876)

);

  • 单曲线

sdo_geometry

(2002,

null,

null,

sdo_elem_info_array(1,2,2),   ----2,2 代表由曲线片段组成的多义线,每一线段由三个点来描述:起点、任意在曲线段上的一点,终点,且前一个曲线终点是下一个曲线的起点

sdo_ordinate_array(40602883.52196759,
3497165.8231581002, 40602944.9893748, 3497397.0575331002, 40602901.083979294,
3497657.5621717945)

);

  • 多部件线(1个或多个简单线)

sdo_geometry

(2006,

null,

null,

sdo_elem_info_array(1,2,1,9,2,1),--"9"代表第二条直线第一个点的坐标在坐标序列中的位置

sdo_ordinate_array(

--第一条折线

63918.6936868593,
39300.6724619204, 63918.7296493314, 39302.5029543953, 63918.777577428,
39306.1643233876, 63918.7895421375, 39307.9951299983,

63824.5720349896,
39287.4658036968, 63824.4568945635, 39285.8607059794, 63824.3337761012,
39284.2562004966, 63824.3191716341, 39284.0725430048 )

------第二条折线

);

注:这种方式地理对象里一般不使用;

1.2.3
多边形

  • 简单多边形

sdo_geometry

(2003,

null,

null,

sdo_elem_info_array(1,1003,1),

sdo_ordinate_array(58184.2949999999, 39390.5210000016, 58208.6500000013,
39291.8900000025, 58499.0099999998, 39310.700000003, 58482.4699999997,
39409.8360000011, 58184.2949999999, 39390.5210000016)

);  --注意首尾坐标相同

)

  • 多边形:环

sdo_geometry

(2003,

null,

null,

sdo_elem_info_array(1,1003,1,15,2003,1),

-----第一个“1”代表外多边形的第一个坐标在坐标数组中的位置,最后一个“1”代表该多边形是由直线组成的多边形

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

----15 表示几何B坐标序列开始的位置,也就是从15开始的几何坐标组成几何B,而1到18组成几何A

sdo_ordinate_array(40604250.220275894,3498887.5979003981,

40602839.3861084,3498132.3029174954,40602696.877685592,3497070.6145019978,40603886.8234863,3496137.183898896,40604549.488098189,3496557.5839232951,40604984.139099091,3497947.0416869968,40604250.220275894,3498887.5979003981,40604214.5930786,3496977.9838866964,40603430.7963257,3496956.6077270955,40603430.7963257,3497241.6246947944,40603417.9331055,3497762.5902709961,40604307.223693892,3498210.6824950948,40604556.613525391,3497483.8892821968,40604214.5930786,3496977.9838866964)          );

  • 多边形多面即包含多个多边形

sdo_geometry

(2007,   --多面或多边形

null,

null,

sdo_elem_info_array(1,1003,1,9,1003,1),

---sdo_elem_info_array(1,1003,1,15,1003,1,29,1003,1),-----由三个面组成的元素组合

sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314,
39302.5029543953, 63918.7576130323, 39304.3335865351,63918.6936868593,
39300.6724619204, 63918.777577428 ,39306.1643233876, 63918.7895421375,
39307.9951299983, 63918.7935069322, 39309.8259714115, 63918.7894717364,
39311.6568126709,63918.777577428, 39306.1643233876)

);

时间: 2024-10-12 08:41:37

SDO_GEOMETRY结构说明的相关文章

C#读取Oracle Spatial的sdo_geometry

oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con = new OracleConnection(conStr); OracleCommand cmd = new OracleCommand(@"SELECT sdo_geometry.get_wkt(geometry) FROM geoms WHERE id= 1902 ", con);

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

linux命令格式,获取帮助及其目录结构简要理解

我们都知道,一台计算机要是没通电,和一堆废铁没什么区别.那么,通电开机进入系统后,会进入交互界面,等待用户操作,人与计算机交互界面有两种: GUI:图形用户接口.如我们平时使用的Windows  ,linux的X window,有KDE和GOME. CLI:命令行接口,使用的SHELL类型有bash ,csh,tcshell,zshell等. 例如:[[email protected] ~]# commandbin root:当前登录的用户名. dxlcentOS:当前主机的主机名.@是一个分隔

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

passwd、shadow、group结构及各字段含义

/etc/password结构 sample:root:x:0:0:root:/root:/bin/bash 账号名称 密码 UID GID 用户信息说明 家目录 Shell root x 0 0 root /root /bin/bash /etc/shadow结构: sample:root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: 账号名称 密码 最近更动密码的日期 密码不可被更动的天(0代表随时可以变动) 密码需要重新变更的天

JS中的运算符&JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

线性结构的常见应用之一 队列

定义:一种可以实现"先进先出"的存储结构 分类 链式队列 --  用链表实现 静态队列 --  用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列 2.循环队列需要几个参数来确定   需要两个参数来进行确定:front   rear 3.循环队列各个参数的含义 2个参数在不同的场合有不同的含义 建议初学者先记住,后面再想 1).队列初始化 front 和 rear 的值都是零 2).队列非空 front 代表的是队列的第一个元素 rear 代表

java-分支结构(四种基本分支结构的认识)

分支结构:有条件的执行某语句,并非每句必走 1)if结构:1条路 2)if...else结构:2条路 3)if...else if结构:多条路 4)switch...case结构:多条路 优点:效率高.结构清晰 缺点:整数.相等 break:跳出switch 一.if结构的认识 /* * 1.if结构:1条路 * 1)语法: * if(boolean){ * 语句块 * } * 2)执行过程: * 判断boolean的值: * 若为true,则执行语句块 * 若为false,则不执行语句块 */

选择结构if语句和switch语句的区别

1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fals