js/小程序判斷地圖坐標點是否在多邊形區(qū)域內

  • 度娘了一圈,只發(fā)現了一個python代碼有用。其他要么太復雜,要么都是調GD地圖util啊,BD地圖util啊,或者Java util的封裝好的方法,但人家又不開源?。∥野堰@段python翻譯成了js代碼,簡單測試發(fā)現OK。這代碼看起來也太簡單了,簡單到我都不相信,,,but, it works!!!

設:需要判斷的目標點為P
參數
aLat: P的緯度
aLon: P的經度
pointList: 單個多邊形區(qū)域頂點數組。如果有多個獨立區(qū)域,則分別調用本方法,只要有一次為ture即表示在區(qū)域內。
getLatLngFunc: 見調用示例

調用示例:

  - 假設原始數據如 pointList =  [{lng: 113.111111, lat, 23.111111},...],則可省略getLatLngFunc
  utilofMap.IsPtInPoly(23.xx, 113.xx, pointList)

 - 假設原始數據如 pointList = [[113.111111, 23.111111],...],則應傳入的getLatLngFunc為
  utilofMap.IsPtInPoly(23.xx, 113.xx, pointList, (orgin) => {return {lat: orgin[1], lng: orgin[0]}})

 - 假設原始數據如 pointList = [{longitude: 113.111111, latitude, 23.111111},...],則應傳入的getLatLngFunc為
  utilofMap.IsPtInPoly(23.xx, 113.xx, pointList, (orgin) => {return {lat: orgin.latitude, lng: orgin.longitude}})

utilofMap.js文件:

function IsPtInPoly(aLat, aLon, pointList, getLatLngFunc = (obj) => {return obj}) {
  /* 
  :param aLon: double 經度 
  :param aLat: double 緯度 
  :param pointList: list [{latitude: 22.22, longitude: 113.113}...] 多邊形點的順序需根據順時針或逆時針,不能亂 
  */
    var iSum = 0  
    var iCount = pointList.length
      
    if(iCount < 3) {
        return false 
    }
    //  待判斷的點(x, y) 為已知值
    var y = aLat
    var x = aLon
    for(var i = 0; i < iCount; i++) {
        var y1 = getLatLngFunc(pointList[i]).lat  
        var x1 = getLatLngFunc(pointList[i]).lng
        if(i == iCount - 1) {
            var y2 = getLatLngFunc(pointList[0]).lat
            var x2 = getLatLngFunc(pointList[0]).lng
        } else {
            var y2 = getLatLngFunc(pointList[i + 1]).lat  
            var x2 = getLatLngFunc(pointList[i + 1]).lng
        }
        // 當前邊的 2 個端點分別為 已知值(x1, y1), (x2, y2)
        if (((y >= y1) && (y < y2)) || ((y >= y2) && (y < y1))) {
            //  y 界于 y1 和 y2 之間
            //  假設過待判斷點(x, y)的水平直線和當前邊的交點為(x_intersect, y_intersect),有y_intersect = y
            // 則有(2個相似三角形,公用頂角,寬/寬 = 高/高):|x1 - x2| / |x1 - x_intersect| = |y1 - y2| / |y1 - y|
            if (Math.abs(y1 - y2) > 0) {
                var x_intersect = x1 - ((x1 - x2) * (y1 - y)) / (y1 - y2);  
                if(x_intersect < x) {
                    iSum += 1 
                }
            }
        } 
    }
    if(iSum % 2 != 0) {
        return true  
    }else {
        return false 
    }  
}
module.exports = {
  IsPtInPoly: IsPtInPoly,
};

參考鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容