1、使用 openlayers 自带的 geom. containsXY 方法
该方法是监测坐标点是否在 多边形
内,所以 Geom 的类型只能是 Polygon、MultiPolygon、GeometryCollection、Circle 中的一个,且该方法的参数是点
使用:polygon.containsXY(coors[0], coors[1])
那我们如何使用这个检测点与面关系的函数,去检测面与面之间的关系?我们可以这样做:
比如有 A、B 两个多边形
1、遍历 A 多边形上的点,判断是否有坐标点在 B 多边形内 — 返回结果 a
2、遍历 B 多边形上的点,判断是否有坐标点在 A 多边形内 — 返回结果 b
如果 a、b 都为 true,则两个多边形相交
如果 a 为 true,b 为 false,则多边形 B 包含多边形 A
如果 a 为 false,b 为 true,则多边形 A 包含多边形 B
如果 a、b 都为 false,则两个多边形远离
代码如下:
function judge(coorsA, coorsB){
//booleanContains
let geomA = new ol.geom.Polygon([coorsA])
let geomB = new ol.geom.Polygon([coorsB])
let boola = coorsA.some(item => {return geomB.containsXY(item[0], item[1])
})
let boolb = coorsB.some(item => {return geomA.containsXY(item[0], item[1])
})
return [['相离', 'A 包含 B'],
['B 包含 A', '相交']
][+boola][+boolb]
}
2、使用 truf 库的 booleanContains 函数,这个函数可以检测两个几何是否为包容关系
使用:引入相关函数,因为 truf 识别的 geometry 不是 openlayers 中的 geometry,所以需要使用其提供的函数,转换成对应的 geometry
import booleanContains from '@turf/boolean-contains'
import {geometry, polygon, lineString} from '@turf/helpers'
let contains = booleanContains(polygon(parent.coors), polygon(child.coors) )
函数可以监测的类型如下
如果父元素的类型是 LineString,那么子元素的类型可以是 Point、LineString、MultiPoint,此外都会抛出错误,以此类推。
其他相似方法:
booleanCrosses:检测两个几何是否相交
booleanDisjoint:检测两个几何是否不相交
经过测试,使用 openlayers 自带的方法性能上可能比 truf 要好,而且不需要在引入额外库,所以推荐使用 openlayers 自带的函数进行封装。