openlayers判斷兩個多邊形的空間關係

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) )

函數可以監測的類型如下
booleanContains

如果父元素的類型是LineString,那麼子元素的類型可以是Point、LineString、MultiPoint,此外都會拋出錯誤,以此類推。

其他相似方法:
booleanCrosses:檢測兩個幾何是否相交
booleanDisjoint:檢測兩個幾何是否不相交

經過測試,使用openlayers自帶的方法性能上可能比truf要好,而且不需要在引入額外庫,所以推薦使用openlayers自帶的函數進行封裝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章