几何验证
在 PostgreSQL、IBM DB2 和 Informix 中,几何验证由 ST_Geometry 类型通过 st_shapelib (Oracle) 和 st_geometry 库提供。创建表之后,插入或更新记录时会对数据进行验证。
将数据插入到空间表的方法主要有两种:
- 使用构造函数以及由这些函数构建的应用程序
- 使用 ArcGIS API 以及由这些 API 构建的应用程序
构造函数针对不同的空间类型实现不同的定义,并且使用不同的方法验证几何数据。创建要素时,Esri 和 IBM ST_Geometry 构造函数以及 ArcGIS API 使用 Esri 形状库验证几何数据。其他空间类型(例如 SDO_Geometry、PostGIS 几何和 Microsoft SQL Server 几何或地理)具有自己的构造函数,所以使用自己的形状验证规则。因此,在将要素插入或更新到 ArcGIS 以外的这些类型时,应针对适用的验证规则分别读取 Oracle、PostGIS 或 SQL Server 文档。
ArcGIS 还会在读取数据时验证几何。无法在 ArcGIS 中对无效几何进行渲染。
ArcGIS 读取几何时,以下几何验证规则适用于 Esri API、ST_Geometry 构造函数:
针对点形状的验证规则
-
点的面积和长度为 0.0。
-
单个点的包络矩形等于该点的 x,y 值。
- 多部件 (multipart) 点形状的包络矩形是最小边界框。
针对简单线或线串的验证规则
- 删除连续重复点。
- 各部件必须至少具有两个不同的点。
- 各部件不可以与自身相交。起始点和终止点可以相同,但是不会将生成的环视为区域形状。
- 各部件可彼此相接于端点。
- 长度是所有部件的长度的总和。
针对线或管 (spaghetti) 状线串的验证规则
- 线可以与自身相交。
- 各部件必须至少具有两个不同的点。
- 删除连续重复点。
- 长度是所有部件的长度的总和。
针对区域形状的验证规则和操作
- 删除重复的连续坐标点。
- 删除悬挂点/线。
- 确认线段闭合(起点和终点的 z 坐标也必须相同)且不交叉。
- 对于带有孔洞的区域形状,孔洞必须整体位于外边界以内。ArcGIS 会消除位于外边界以外的所有孔洞。
- 与外边界相接于单个公共点的孔洞会转换为反转的区域形状。
- 相接于多个公共点的多个孔洞会合并为一个孔洞。
- 多部件 (Multipart) 区域形状之间不能发生叠置。不过,两个部件可以相接于一点。
- 多部件 (Multipart) 区域形状之间不能共享公共边界。公共边界会融合。
- 如果两个环拥有一个公共边界,它们会合并为一个环。
- 将计算总的几何体周长(包括圆环面中所有孔洞的边界)并存储为几何体的长度。
- 将计算面积。
- 将计算包络矩形。
- 尽管 ArcGIS 客户端可返回按顺时针或逆时针方向排列的点,但是对于区域形状的点,会按照逆时针方向存储。如果生成含有顺时针坐标的区域形状,ArcGIS 会更改旋转方向,以确保坐标列表遵循逆时针方向。
在该示例中,起始点为 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
就使用 ST_Geometry 类型的要素类而言,对于所提供的、创建表时使用的空间参考 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 |
SQLite | Error: ST_Geometry failed with SDE error -139: 'The specified coordinate exceeds the valid coordinate range':[4] |