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

一、 使用openlayers自帶的geom. containsXY方法函數

該方法是監測座標點是否在多邊形內,因此Geom的類型只能是Polygon、MultiPolygon、GeometryCollection、Circle中的一個,且該方法的參數是點性能

使用:polygon.containsXY(coors[0], coors[1])測試

那咱們如何使用這個檢測點與面關係的函數,去檢測面與面之間的關係?咱們能夠這樣作:spa

好比有A、B兩個多邊形
一、遍歷A多邊形上的點,判斷是否有座標點在B多邊形內 --- 返回結果 a
二、遍歷B多邊形上的點,判斷是否有座標點在A多邊形內 --- 返回結果 b3d

若是a、b都爲true,則兩個多邊形相交
若是a爲true,b爲false,則多邊形B包含多邊形A
若是a爲false,b爲true,則多邊形A包含多邊形B
若是a、b都爲false,則兩個多邊形遠離code

代碼以下:blog

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]
}

二、 使用truf庫的booleanContains函數,這個函數能夠檢測兩個幾何是否爲包容關係it

使用:引入相關函數,由於truf識別的geometry不是openlayers中的geometry,因此須要使用其提供的函數,轉換成對應的geometryio

import booleanContains from '@turf/boolean-contains'
import {geometry, polygon, lineString} from '@turf/helpers'

let contains = booleanContains( polygon(parent.coors), polygon(child.coors) )

函數能夠監測的類型以下
booleanContainsfunction

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

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

通過測試,使用openlayers自帶的方法性能上可能比truf要好,並且不須要在引入額外庫,因此推薦使用openlayers自帶的函數進行封裝。

相關文章
相關標籤/搜索