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自帶的函數進行封裝。