对含有 ST_Geometry 列的表进行的几何验证
几何验证由 ST_Geometry 类型通过 st_shapelib (Oracle) 和 st_geometry 库提供。创建表之后,会在插入或更新记录时对数据进行验证。
将数据插入到空间表的方法主要有两种:
- 使用存取器函数以及用这些函数构建的应用程序
- 使用 ArcGIS API 以及用这些 API 构建的应用程序
存取器函数由每个空间类型实现定义,而且可以使用不同的方法验证几何数据。ESRI ST_Geometry 存取器函数和 ArcGIS API 均使用 ESRI 形状库验证几何数据。第三方空间类型拥有它们自己的存取器函数,并且使用它们自己的形状验证规则。因此,对于针对某些空间类型(例如 SDO_Geometry、PostGIS 几何和 Microsoft SQL Server 几何或地理)的形状验证规则,请相应地阅读 Oracle、PostGIS 或 SQL Server 文档。
以下规则适用于 ESRI 形状库,因而也适用于 ESRI API 和 ST_Geometry 存取器函数。
针对点形状的验证规则
-
点的面积和长度设置为 0.0。
-
单个点的包络矩形等于该点的 x,y 值。
- 多部分 (multipart) 点形状的包络矩形设置为最小边界框。
针对简单线或线串 (linestring) 的验证规则
- 删除连续重复点。
- 各个部分必须至少具有两个不同的点。
- 各个部分不可以与自身相交。起始点和终止点可以相同,但是不会将生成的环视为区域形状。
- 各部分可彼此相接于端点。
- 长度是所有部分长度的总和。
针对线或无位相字符串的验证规则
- 线可以与自身相交。
- 各个部分必须至少具有两个不同的点。
- 删除连续重复点。
- 长度是所有部分长度的总和。
针对区域形状的验证规则和操作
- 删除重复的连续坐标点。
- 删除悬挂。
- 确认线段闭合(起点和终点的 z 坐标也必须相同)且不交叉。
- 对于带有孔洞的区域形状,孔洞必须整体位于外边界以内。ArcSDE 会消除位于外边界以外的所有孔洞。
- 与外边界相接于单个公共点的孔洞会转换为反转的区域形状。
- 相接于多个公共点的多个孔洞会合并为一个孔洞。
- 多部分 (Multipart) 区域形状不能叠置。不过,两个部分可以相接于一点。
- 多部分 (Multipart) 区域形状不能共享公共边界。公共边界会融合。
- 如果两个环拥有公共边界,它们会合并为一个环。
- 将总几何周长(包括圆环面中所有孔洞的边界)计算并存储为几何的长度。
- 计算面积。
- 计算包络矩形。
- 尽管 ArcSDE 软件可返回按顺时针或逆时针方向排列的点,但是对于区域形状的点,会按照逆时针方向存储。如果生成含有顺时针坐标的区域形状,ArcSDE 会更改旋转方向,以确保坐标列表遵循逆时针方向。
在该示例中,起始点为 a,正确的坐标描述为 a,b,c,d,a。
- 区域形状可以包含反转区域,即区域形状内与外部边界接触的空白区域。
- 反转的区域形状包含与外边界接触的内部环。这些区域形状并不会视为圆环面。
- 区域形状包含圆环孔洞时,会首先列出外边界。孔洞的各点以与外边界相反的方向进行存储。
在下图中,将外边界描述为 a,b,c,d,a,将孔洞描述为 e,f,g,h,e。在坐标列表中,区域形状就存储为 a,b,c,d,a,e,f,g,h,e。
- 如果两个孔洞相接于某一点,它们会被视为一个孔洞,而不是两个。
在该示例中,这两个内部区域被视为一个孔洞,因为它们共享一个公共点 g。
- 区域形状和带有孔洞区域形状的组合可能变得相当复杂,如下图所示。外边界是一个带有岛的湖。在岛上有一个小湖。
可以将这些要素表示为一个、两个或三个形状。您可分别存储每个要素。较大的湖是一个圆环面。大湖的边界是外边界,而岛是单个圆环孔洞的边界。该岛也是一个圆环面。相对于小湖,岛的边界是外边界,而小湖是孔洞。小湖是单个区域形状。
如果这些湖是重要的要素,则一个带有孔洞的形状表示大湖,而另一个形状表示小湖。还可使用多部分 (multipart) 区域形状表示该要素。第一个形状部分是带有表示岛的圆环孔洞的大湖。第二个部分是小湖。
- Nil 形状起到占位符的作用;一种使某一属性行不含有相应几何的方法。例如,在请求两个不相交区域的相交部分时就会得到 nil 形状。
因为区域 A 和 B 不接触,所以相交查询的结果会产生空几何。
- 形状具有维度。仅具有 x,y 坐标的形状被视为是二维的。具有 z 坐标或测量值的形状是三维的。形状还可能拥有 nil 测量值。
空间参考 ID
对于所提供的、创建表时使用的空间参考 ID (SRID) 的边界以外的坐标,如果尝试插入具有这些坐标的值,则 INSERT 语句会失败并提示类似于如下列出的消息:
DBMS | 错误消息 |
---|---|
Oracle | ERROR at line 1: ORA-20004: Error generating shape from text (-112) ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 42 ORA-06512: at "SDE.ST_POLYGON", line 69 ORA-06512: at line 1 |
PostgreSQL | ERROR: ESRI: error generating shape [-112]: |
Informix | SQL Error (-937): Coordinates out of bounds in ST_PolyFromText. |
DB2 | GSE3416N Coordinate out of bounds |