一、什么是几何图形的简单性与有效性?

简单性参考前文

几何图形的简单性可以理解为几何图形比较简单整齐,不会自己与自己重叠,不繁杂。

PostGIS遵循OGC的OpenGIS规范,它要求被各类方法操作的几何图形要既是简单的又是有效的,但是我通过实际操作发现其实只要几何图形是有效的就能被操作,非简单的几何图形也能被操作处理。

在PostGIS中可以通过ST_IsSimple()ST_IsValid()这两个方法分别判断几何图形的简单性和有效性。

二、点的简单性与有效性

2.1、单点(POINT)的简单性与有效性

单个点(Point)肯定是简单的且有效的,因为一个点孤零零的肯定是简单、有效的。

2.2、多点(MULTIPOINT)的简单性与有效性

多个点(MultiPoint)肯定是有效的,但不一定是简单的。

如果多点中有两个或两个以上的点重合(也就是坐标一致),那么它就不是简单的,但是确是有效的。

三、线串的简单性与有效性

3.1、单线串(LINESTRING)的简单性与有效性

单线串(LINESTRING)如果有重叠、相交就不是简单的(除了端点相交,端点相交就说明这条线串是闭合的,但它是简单的):

另外,单线串都是有效的。

3.2、多线串(MULTILINESTRING)的简单性与有效性

多线串(MULTILINESTRING)只要它的元素(LINESTRING)都是简单的,且两个元素只在某个点相切,那么它就是简单。

和单线串一样,多线串总是有效的。

四、多边形的简单性与有效性

4.1、单多边形(POLYGON)的简单性与有效性

如果违反以下规则,那么对应的单多边形就不是有效的。

  • 多边形的环必须闭合

  • 内环应该处于外环的内部

  • 环不能自相交(它们不能相互接触,也不能交叉)

  • 环不能与其他环接触,除非在某个点相切(只能有一个在一个点相切)

另外,多边形的环只要不自相交,则该多边形就是简单的。

4.2、多多边形(MULTIPOLYGON)的简单性与有效性

多多边形里只要各个子元素(单多边形)是简单的、有效的,而且子元素之间只在有限的点上接触,那么它就是简单的、有效的。

五、预防与修复无效几何图形

因为只要几何图形是有效的,那么PostGIS中的方法就能对该几何图形进行操作处理,所以我们只要保证几何图形是有效的(不用太关心简单性)那么就可以进行我们的业务工作。

前面提到ST_IsValid()方法能够检测几何图形的有效性。但是默认情况下,PostGIS不会在几何图形输入PostGIS时应用这种有效性检查,因为对于复杂的几何图形,尤其是多边形,有效性测试需要大量的CPU时间。如果不信任数据源,则可以通过添加CHECK约束(即用户定义的完整性约束)来手动对表强制执行这样的有效性检查:

ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (ST_IsValid(the_geom));

OGC规范的某些方法也不允许几何图形有z值和m值,因此有z值或m值的几何图形数据可能会导致某些方法执行失败。另外,AddGeometryColumn()方法允许我们指定表中空间信息的维度。