Oracle Spatial and Graph 是一组集成的函数、过程、数据类型和数据模型,支持空间和图形分析。空间功能使得空间数据能够在 Oracle 数据库中快速高效地存储、访问和分析。空间数据通过描述现实或概念对象的基本位置特征,反映这些对象与其所处的真实或概念空间之间的关联关系。本文主要介绍空间对象类型--SDO_GEOMETRY 的基本使用。
1、几何类型
几何图形是由顶点组成的有序序列,这些顶点通过直线段或圆弧连接。几何图形的语义由其类型决定。Spatial and Graph 支持几种原始类型,以及由这些类型的集合组成的几何图形,包括二维几何:
• Points and point clusters(点和点簇)
• Line strings(线串)
• n-point polygons(n 点多边)
• Arc line strings(圆弧线串)
• Arc polygons(圆弧多边形)
• Compound polygons(复合多边形)
• Compound line strings(复合线串)
• Circles(圆)
• Optimized rectangles(优化矩形)
二维点是由两个坐标(X 和 Y)组成的元素,通常对应于经度和纬度。线串由一对或多对定义线段的点组成。多边形由连接的线串组成,形成一个闭合环路,其闭合区域表征空间范围。例如,一个点可能代表建筑物的位置,一个线串可能代表一条道路或航线,而一个多边形可能代表一个州、城市、分区或街区。
不支持自交多边形,尽管支持自交线串。如果线串交叉自身,它不会变成多边形,也没有面积。
下图展示了二维几何类型:
Spatial and Graph 还支持三维和四维几何类型的存储和索引,其中使用三个或四个坐标来定义对象的每个顶点。
2、SDO_GEOMETRY 对象类型
在 Oracle Spatial and Graph 中,空间对象的几何描述存储于用户自定义表内,具体表现为单行数据中类型为 SDO_GEOMETRY 的列。此类表须具备另一列(或多个列)用于定义唯一主键约束,此类表结构通常被称为空间表或空间几何表。Oracle Spatial and Graph 对 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);
复制代码 Oracle Spatial and Graph 还定义了 SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY 和 SDO_ORDINATE_ARRAY 类型,这些类型在 SDO_GEOMETRY 类型定义中使用,具体如下:- CREATE TYPE sdo_point_type AS OBJECT (
- X NUMBER,
- Y NUMBER,
- Z NUMBER);
- CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;
- CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;
复制代码 由于 SDO_ORDINATE_ARRAY 数组的最大容量为 1,048,576 个数值,SDO_GEOMETRY 对象支持的顶点最大数量取决于每个顶点的维度数:二维空间下可达 524,288个 顶点,三维空间下为 349,525 个顶点,四维空间下则为 262,144 个顶点。
2.1、SDO_GTYPE
SDO_GTYPE 属性用于标识几何对象的类型。有效的几何类型与 OGIS(开放地理空间信息联盟) 简单要素 SQL 规范中定义的几何对象模型所指定的类型相对应(曲面类型除外)。尽管其数值编码与 OGIS 规范中的定义不同,但在适用范围内,其名称与语义存在直接的对应关系。
SDO_GTYPE 的值为 4 位数字,格式为 DLTT,其中:
- D 表示几何对象的维度数(2、3 或 4)。
- L 表示三维线性参考系统(LRS)几何对象的线性参考测度维度,即指定哪个维度(3 或 4)包含测度值。对于非 LRS 几何对象,此值设为 0。
- TT 表示几何类型(00 到 09 为有效值,10 到 99 预留供未来使用)。
有效的 SDO_GTYPE 值:
值 | 几何类型 | 说明 | DL00 | UNKNOWN_GEOMETRY(未知类型) | Spatial and Graph 忽略此几何图形。 | DL01 | POINT(点) | 几何图形包含一个点。 | DL02 | LINE or CURVE(线或曲线) | 几何图形包含一个线串,线串可以包含直线段、圆弧段或两者兼有。 | DL03 | POLYGON or SURFACE(多边形或面) | 几何对象包含一个带或不带孔洞的多边形,或者由一个或多个多边形组成的一个面。对于三维空间中的多边形,所有点必须位于同一平面上。 | DL04 | COLLECTION(集合) | 几何图形的集合。 | DL05 | MULTIPOINT(多点) | 几何图形包含一个或多个点。 | DL06 | MULTILINE or MULTICURVE(多线或多曲线) | 几何图形包含一个或多个线串。线串可以包含直线段、圆弧段或两者兼有。 | DL08 | SOLID(实体) | 几何图形由多个表组成,并在三维空间中完全封闭。可以是一个长方体或一个截头锥体(棱台)。 | DL09 | MULTISOLID(多实体) | 几何图形包含多个不相交的实体。 | 2.2、SDO_SRID
SDO_SRID 属性可用于标识与几何对象相关联的坐标系(空间参考系统)。如果 SDO_SRID 为 NULL,则表示该几何对象未关联任何坐标系。如果 SDO_SRID 非空,则其值必须来自 SDO_COORD_REF_SYS 表中的 SRID 列,并且该值也必须插入到 USER_SDO_GEOM_METADATA 视图的 SRID 列中。如果要在某一几何列上建立空间索引,则该列中的所有几何对象必须具有相同的 SDO_SRID 值。
如 8307 为 84 坐标系:
2.3、SDO_POINT
SDO_POINT 属性通过 SDO_POINT_TYPE 对象类型定义,包含 X、Y、Z 三个数值型属性。如果 SDO_ELEM_INFO 与 SDO_ORDINATES 数组均为空,且 SDO_POINT 非空时,系统将其 X、Y、Z 值解析为点对象的坐标;否则 SDO_POINT 属性将被 Spatial and Graph 忽略。为了实现最佳存储,应该将点几何存储在 SDO_POINT 属性中;如果某一层仅包含点几何,强烈建议将点几何存储在 SDO_POINT 属性中。
2.4、SDO_ELEM_INFO
SDO_ELEM_INFO 属性通过一个变长数值数组定义,其核心作用是指导如何解析存储在 SDO_ORDINATES 属性中的坐标序列。每组三个数字的解释如下:
A、SDO_STARTING_OFFSET 表示当前几何元素的第一个坐标在 SDO_ORDINATES 数组中的偏移位置,偏移值从 1 开始。
B、SDO_ETYPE 表示元素的类型。SDO_ETYPE 为 1、2、1003 和 2003 时被视为简单元素;每个简单元素仅需通过 SDO_ELEM_INFO 数组中的一个三元组(triplet entry)即可完整定义;对于 1003 和 2003,第一个数字表示外部(1)或内部(2):
1003:外部多边形环(必须按逆时针顺序指定)
2003:内部多边形环(必须按顺时针顺序指定)
SDO_ETYPE 为 4、1005、2005、1006 和 2006 时被视为符合元素;每个复合元素需包含至少一个头部三元组(Header Triplet)及一系列隶属于该复合元素的子三元组;所有子三元组在 SDO_ELEM_INFO 数组中连续存储,形成完整的复合几何描述。对于四位数的值,第一个数字表示外部(1)或内部(2):
1005:多边形外环(Exterior Ring),必须按逆时针方向定义;
2005:多边形内环(Interior Ring,如孔洞),必须按顺时针方向定义;
1006:外面(由多个多边形环构成,如多面体的外表面);
2006:内面(实体元素中的内部表面,如三维结构的内腔);
1007:实体元素(如三维立体对象)
复合元素的各个元素是连续的。复合元素中一个子元素的最后一个点是下一个子元素的第一个点,该点不会被重复存储。
C、SDO_INTERPRETATION 根据 SDO_ETYPE 是否为复合元素,其有不同的含义。
如果 SDO_ETYPE 是复合元素(4、1005 或 2005),则该字段指定有多少个后续的三元组值是该元素的一部分。
如果 SDO_ETYPE 不是复合元素(1、2、1003 或 2003),该字段用于确定如何解析当前元素的坐标序列。例如,一条线段或多边形可以由一系列连接的直线段或圆弧组成。
如果一个几何体由多个元素组成,则每个元素的最后一个坐标值总是比下一个元素的起始偏移量少 1。几何体中的最后一个元素由从其起始偏移量到 SDO_ORDINATES 可变长度数组末尾的坐标描述。
对于复合元素(SDO_ETYPE 值为 4、1005 或 2005),使用n 个三元组(每个子元素一个)来描述该元素。需要记住的是,复合元素的子元素是连续的。一个子元素的最后一个点是下一个子元素的第一个点。对于子元素 1 到 n-1,前一个子元素的终点与下一个子元素的起点相同。子元素 2 到 n-2 的起始点与子元素 1 到 n-1 的终点相同。子元素 n 的最后一个坐标值要么是下一个几何元素的起始偏移量减去 1,要么是 SDO_ORDINATES 可变长度数组中的最后一个坐标值。
有效的 SDO_ETYPE 与 SDO_INTERPRETATION 取值组合如下:
SDO_ETYPE | SDO_INTERPRETATION | 说明 | 0 | 任意数字 | 用于表示 Oracle Spatial and Graph 不支持的几何类型。 | 1 | 1 | 点类型 | 1 | 0 | 定向点的方向属性 | 1 | n > 1 | n 个点的点簇 | 2 | 1 | 由直线段连接而成的线串 | 2 | 2 | 由圆弧连接而成的线串。每个圆弧使用三个坐标来描述:圆弧的起点、圆弧上的任意一点以及圆弧的终点。一个圆弧终点和下一个圆弧起点的坐标一样,但不会重复存储。例如,五个坐标用于描述由两个连接的圆弧组成的线串。点 1、2 和 3 定义第一个圆弧,点 3、4 和 5 定义第二个圆弧,其中点 3 只存储一次。 | 2 | 3 | NURBS(非均匀有理 B 样条)曲线 | 1003 or 2003 | 1 | 由直线段连接的简单多边形。需要为每个顶点指定一个坐标,最后一个顶点必须与第一个顶点完全重合(在容差值范围内),以闭合多边形。例如,对于一个四边形,指定 5 个点,其中第 5 个点与第 1 个点相同。 | 1003 or 2003 | 2 | 由圆弧连接的多边形。
每个圆弧使用三个坐标来描述:圆弧的起点、圆弧上的任意一点以及圆弧的终点。一个圆弧终点和下一个圆弧起点的坐标一样,但不会重复存储。例如,五个坐标用于描述由两个连接的圆弧组成的多边形。点 1、2 和 3 定义第一个圆弧,点 3、4 和 5 定义第二个圆弧。点 1 和点 5 的坐标必须相同(在容差值范围内)。
| 1003 or 2003 | 3 | 矩形(优化矩形),由左下角和右上角两点确定
| 1003 or 2003 | 4 | 圆,由圆周上的不同三点确定
| 4 | n > 1 | 由直线段和圆弧连成的复合线串。n 表示组成线串的连续子元素的个数,SDO_ELEM_INFO 数组的下 n 个三元组将描述每个子元素。子元素的 SDO_ETYPE 值只能为 2,子元素的终点将是下一个子元素的起始点,不重复存储。
| 1005 or 2005 | n > 1 | 由直线段和圆弧连成的复合多边形。n 表示组成多边形的连续子元素的个数,SDO_ELEM_INFO 数组的下 n 个三元组将描述每个子元素。子元素的 SDO_ETYPE 值只能为 2,子元素的终点将是下一个子元素的起始点,不重复存储。多边形的起始点和终点必须相同(在容差值范围内)。
| 1006 or 2006 | n > 1 | 由一个或多个多边形组成的面,每个边最多被两个多边形共享。一个面包含面积,但不包含体积。n 表示构成面的多边形数量。SDO_ELEM_INFO 数组中的下 n 个三元组描述每个多边形。面必须是三维的。 | 1007 | n = 1 or 3 | 由多个面组成的实体,完全封闭在三维空间中,具有体积。一个实体元素可以有一个由 1006 元素定义的外部面,以及零个或多个由 2006 元素定义的内部面。 n 必须是 1 或 3。SDO_ELEM_INFO 数组中的后续三元组描述构成实体的外部面和可选的内部面。如果 n 为 3,则该实体是立方体,定义它只需要两个三维点:X/Y/Z 维度的最小值,X/Y/Z 维度的最大值。例如:SDO_GEOMETRY(3008, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1007,3), SDO_ORDINATE_ARRAY(1,1,1, 3,3,3)) | 2.5、SDO_ORDINATES
SDO_ORDINATES 属性定义为 NUMBER 类型的变长数组(最大长度 1048576),用于存储构成空间对象边界的坐标值。该数组必须始终与 SDO_ELEM_INFO 变长数组一起使用。数组中的值按维度顺序存储。例如,一个具有四个二维点的多边形存储为 {X1, Y1, X2, Y2, X3, Y3, X4, Y4, X1, Y1}。如果这些点是三维的,则它们存储为 {X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X1, Y1, Z1}。
SDO_ORDINATES 数组中的值必须都是有效且非空的,不使用特殊值来分隔元素。描述特定元素的序列的起始点和结束点由 SDO_ELEM_INFO 数组中该元素和下一个元素的 STARTING_OFFSET 值确定,详见 SDO_ELEM_INFO。偏移值从 1 开始。SDO_ORDINATES(1) 是第一个元素的第一个坐标值。
2.6、使用注意事项
Spatial and Graph 不强制校验所有几何一致性约束,但执行以下基础校验:
SDO_GTYPE 为 d001 和 d005 时(点类型),任何 SDO_ETYPE 不是 1 的子元素都会被忽略。
SDO_GTYPE 为 d002 和 d006 时(线类型),任何 SDO_ETYPE 不是 2 或 4 的子元素都会被忽略。
SDO_GTYPE 为 d003 和 d007 时(面类型),任何 SDO_ETYPE 不是 3 或 5(包括它们的变体 1003、2003、1005 和 2005)的子元素都会被忽略。
2.7、例子
A、矩形
- select SDO_GEOMETRY(
- 2003, --二维多边形
- NULL,
- NULL,
- SDO_ELEM_INFO_ARRAY(1,1003,3),--矩形
- SDO_ORDINATE_ARRAY(1,1, 5,7) --只需两个点
- ) from dual
复制代码 B、带洞的多边形
- select SDO_GEOMETRY(
- 2003, --二维多边形
- NULL,
- NULL,
- SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- 带洞多边形
- 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)
- ) from dual
复制代码 C、复合线串
- select SDO_GEOMETRY(
- 2002, --二维线串
- NULL,
- NULL,
- SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), --复合线串
- SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10)
- ) from dual
复制代码 D、复合多边形
- select SDO_GEOMETRY(
- 2003, --二维多边形
- NULL,
- NULL,
- SDO_ELEM_INFO_ARRAY(1,1005,2, 1,2,1, 5,2,2), --复合多边形
- SDO_ORDINATE_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10)
- ) from dual
复制代码 E、点
- select SDO_GEOMETRY(
- 2001, --二维点
- NULL,
- SDO_POINT_TYPE(12, 14, NULL),--点坐标
- NULL,
- NULL
- ) from dual
复制代码 3、SDO_GEOMETRY 对象方法
SDO_GEOMETRY 对象具有如下方法,用于检索几何对象的相关信息:
方法名 | 返回 | 说明 | Get_Dims | NUMBER | 根据 SDO_GTYPE 的值返回几何对象的维度数,Get_Dims 和 ST_CoordDim 方法返回相同的结果。 | Get_GeoJson | CLOB | 返回几何对象的 GeoJSON 表示。 | Get_GType | NUMBER | 根据 SDO_GTYPE 的值返回几何对象的类型。 | Get_LRS_Dim | NUMBER | 根据 SDO_GTYPE 的值返回 LRS 几何对象的度量维度。 | Get_WKB | BLOB | 返回几何对象的 Well-Known Binary(WKB)格式。(不包括任何 SRID 信息) | Get_WKT | CLOB | 返回几何对象的 Well-Known Text(WKB)格式。(不包括任何 SRID 信息) | ST_CoordDim | NUMBER | 返回几何对象的维度(按照 ISO/IEC SQL 多媒体标准定义)。Get_Dims 和 ST_CoordDim 方法返回相同的结果。 | ST_IsValid | NUMBER | 几何对象无效时,返回 0;有效时,返回 1。 | 样例:- select sdo_geometry(2001,8307,SDO_POINT_TYPE(119.97611,31.79012, NULL),NULL,NULL).Get_Dims() from dual;
- select SDO_GEOMETRY(
- 2003,
- 8307,
- NULL,
- SDO_ELEM_INFO_ARRAY(1, 1003, 1),
- SDO_ORDINATE_ARRAY(119.756505,31.900971,119.836155,31.900971,119.836155,31.94235,119.756505,31.94235,119.756505,31.900971)
- ).Get_WKT() from dual;
复制代码 4、SDO_GEOMETRY 构造方法
SDO_GEOMETRY 对象类型提供多种构造方法,可以从 WKT 字符串(CLOB 或 VARCHAR2 格式)或 WKB 对象(BLOB 格式)创建几何对象:- SDO_GEOMETRY(wkt CLOB, srid NUMBER DEFAULT NULL);
- SDO_GEOMETRY(wkt VARCHAR2, srid NUMBER DEFAULT NULL);
- SDO_GEOMETRY(wkb BLOB, srid NUMBER DEFAULT NULL);
复制代码 当通过构造函数创建的几何对象被插入表时,必须确保构造函数指定的 SRID 值与目标表中几何列的 SDO_SRID 元数据严格一致。
样例:- select sdo_geometry('POINT (119.97611 31.79012)', 8307) from dual;
- select sdo_geometry('POLYGON ((119.756505 31.900971, 119.836155 31.900971, 119.836155 31.94235, 119.756505 31.94235, 119.756505 31.900971))', 8307) from dual;
复制代码
参考:https://docs.oracle.com/en/database/oracle/oracle-database/19/spatl/spatial-concepts-usage.html#GUID-67E4037F-C40F-442A-8662-837DD5539784
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |