后端实现
“输入图形是否被指定图形完全覆盖”这个判断主要利用postgis的st_coveredby函数实现,该函数与另一个可以判断图形重叠关系的函数st_within的区别,官方给出的解释如下:
因为多边形边界并不算多边形内部,因此st_within为判断“真包含”,即两图形完全覆盖或者说输入图形与指定图形有任何边界上的相交,都会判断为false,不完全覆盖。
而st_coveredby则为判断“假包含”,即如果有边界上的相交,只要输入图形没超出指定图形边界,就认为是被完全覆盖。
以上方法,当指定图形只有一个的时候,可以方便实现,可一旦指定图形有复数个,固然可以利用st_intersects先找到与输入图形相交的图形,再使用st_unions进行合并之后再求交集,但真要在后台使用sql实现有点麻烦,因此我们可以寻找一些别的思路,
一般来说,在判断空间冲突之后,我们一般是要在前台可视化出冲突相关的图形,因此要在接口中返回冲突图形的geom信息,既然前台已经拿到这些信息,我们也可以在这里也可以通过前台来实现上面复数指定图形情况下这个复杂的判断:
1.2 前台实现
前台如果要实现空间分析,可以借助js类库turf:
可以使用turf的difference方法,将输入图形与指定图形之一求差集,然后将差集与剩下的指定图形求差集,直到差集为空,若最后差集不为空,则说明不完全覆盖,否则就是完全覆盖。