百度地圖——判斷一個點是否在一個區域內?
由於目前的一個專案涉及離線地圖,經過查詢資料論證,最終還是決定採用百度地圖。在專案過程中,遇到一個比較實際的問題:怎麼判斷地圖上的一個點(經緯座標下)在一個多邊形區域內?
由於我採用的是百度地圖JavaScript API v2.0介面,同時由於要做的是離線地圖,百度地圖離線版有一些功能函式是不能用的。針對上述問題,在網上查資料發現,百度的BMapLib.GeoUtils裡面有一個函式isPointInPolygon可以用於解決這個問題,但是很遺憾,我用的介面函式版本並不能用這個函式,所以我研究了一下,經過修改寫了一個滿足條件的函式。下面是程式碼部分:
function isInsidePolygon(point, polygon) { if(!(point instanceof BMap.Point) || !(polygon instanceof BMap.Polygon)) { return false; } var polygonBounds = polygon.getBounds(); if(!polygonBounds.containsPoint(point)) { return false; } var pts = polygon.getPath(); var N = pts.length; var boundOrVertex = true; var intersectCount = 0; var precision = 2e-10; var p1, p2;//neighbour bound vertices var p = point; p1 = pts[0];//left vertex for(var i = 1; i <= N; ++i) //check all rays { if(p.equals(p1)) { return boundOrVertex; //p is an vertex } p2 = pts[i % N];//right vertex if(p.lat < Math.min(p1.lat, p2.lat) || p.lat > Math.max(p1.lat, p2.lat)) //ray is outside of our interests { p1 = p2; continue;//next ray left point } if(p.lat > Math.min(p1.lat, p2.lat) && p.lat < Math.max(p1.lat, p2.lat)) { if(p.lng <= Math.max(p1.lng, p2.lng)) { if(p1.lat == p2.lat && p.lng >= Math.min(p1.lng, p2.lng)) { return boundOrVertex; } if(p1.lng == p2.lng) { if(p1.lng == p.lng) { return boundOrVertex; } else { ++intersectCount; } } else { var xinters = (p.lat - p1.lat) * (p2.lng - p1.lng) / (p2.lat - p1.lat) + p1.lng; if(Math.abs(p.lng - xinters) < precision) { return boundOrVertex; } if(p.lng < xinters) { ++intersectCount; } } } } else { if(p.lat == p2.lat && p.lng <= p2.lng) { var p3 = pts[(i+1) % N]; //next vertex if(p.lat >= Math.min(p1.lat, p3.lat) && p.lat <= Math.max(p1.lat, p3.lat)) { ++intersectCount; } else { intersectCount += 2; } } } p1 = p2;//next ray left point } if(intersectCount % 2 == 0) {//偶數在多邊形外 return false; } else { //奇數在多邊形內 return true; } }
參考資料:
http://api.map.baidu.com/library/GeoUtils/1.2/docs/symbols/BMapLib.GeoUtils.html(百度開發平臺)
http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html(百度地圖JavaScript API v2.0類參考)
相關推薦
百度地圖——判斷一個點是否在一個區域內?
由於目前的一個專案涉及離線地圖,經過查詢資料論證,最終還是決定採用百度地圖。在專案過程中,遇到一個比較實際的問題:怎麼判斷地圖上的一個點(經緯座標下)在一個多邊形區域內? 由於我採用的是百度地圖JavaScript API v2.0介面,同時由於要做的
百度地圖之九如何在一個地圖上顯示多條導航路線
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
關於百度地圖 把所有覆蓋物放在一個視野裡的問題
現在搞的app是關於百度地圖的,因為要求要把所有覆蓋物顯示在一個視野。。。所以在網上找了很久,終於找打了方法 用的是 overlayManager.zoomToSpan();方法 程式碼如下:
百度地圖(多點定位+聚合)
初始化 默認 each 直接 搜索 不能 行政 參數 全部 首先頁面引用必須的兩個JS <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的Key值">
百度地圖API 少量點和海量點 自定義新增資訊
開發中遇到需要地圖展示使用者座標點需求,在上一篇文章中解決載入大量點卡頓。需求中提到點選代表使用者發表的動態需要彈出資訊框,找了api中的資訊視窗例項暫時不用考慮圖片,就選擇純文字資訊視窗展示。// 百度地圖API功能 var map = new BMap.Map("all
bootstrap模態框引用百度地圖出現中心點偏移到左上角
當發生中心進行偏移到左上角的時候,我們要知道為什麼會發生這個問題 原因就是模態框在沒有彈出的時候,即隱藏狀態下,地圖api會預設為寬高為0,所以他的初始寬高為0,因此中心點不管取什麼值都會在左上角 解決方案: 我們首先要了解一個地圖api的事件:tilesloaded
百度地圖api之點選地圖獲取座標點
一.首先引入所申請的ak金鑰<script type="text/javascript" src="http://api.map.baidu.com/api?ak=PlhFWpA02aoURjAOpnWcRGqw7AI8EEyO&v=2.0&services=false"><
百度地圖建立標記點
專案需求:專案需要從資料庫載入資料到百度地圖上,顯示未標記點。 js程式碼如下: //建立地圖 function showMap(){ map = new BMap.Map("information_date",{minZoom:6,maxZoom:17});
QGraphicsView 如何實現百度地圖按照滑鼠點進行放大縮小效果
一、簡述 前段時間用了QGraphicsView做了一些工作,然而如何實現QGraphicsView的放大縮小的效果也很簡單,直接重寫QGraphicsView的wheelEvent事件即可,上一篇文章中也提到了,但是僅僅通過以下程式碼實現放大縮小的效果並不是
百度地圖 label新增點選事件,顯示提示資訊
百度地圖的marker新增點選事件是: marker.addEventListener("click", function(){ this.open
Android 百度地圖使幾點始終在合適的螢幕範圍內顯示
專案中整合百度地圖,需要使幾點的位置在螢幕範圍內顯示,剛開始使用的方放是 MapStatusUpdate mapStatusUpdate1 = MapStatusUpdateFactory.zoomTo(18.0f); mBaiduMap.setMapStatus(mapS
百度地圖新增帶有圖案的多邊形區域
日常的工作中繪製多邊形區域可以設定單色矩形區域,但是特殊需求下,需要繪製指定圖案的邊框,下面就簡單實現下 多種顏色矩形 /** * 繪製圍欄 */ private void drawBitmapDescriptor(List<LatLn
百度地圖開發總結----3.判斷一個點是否在一片區域內
主要用到了BMapLib.GeoUtils.isPointInPolygon(point, apolygon)這個函式,第一個引數為百度座標點物件,new BMap.Point(x,y), 第二個引數為覆蓋物物件,物件,物件!!!(就在剛才寫demo的時候還傳錯了,傳的座標
Android 百度地圖 動態畫多邊形,並判斷一個點是否在多邊形內部
由於專案的需求,需要動態的在地圖上畫出多邊形,並且需要判斷一個點是否在多邊形的範圍內,根據官方的demo,結合網上的查的資料,做出的效果如下圖所示: 思路就是: 1.點選地圖增加marker; 2.拿到marker,根據marker來
使用百度地圖實現詳細地址自動補全(補全bug''事件只能綁定到一個上的問題')
item 頁面 tid col border nconf complete ane result loadMapAutocomplete("suggestId","searchResultPanel"); loadMapAutocomplete("suggest
百度地圖輸入一個位置到另一個位置的路線
span search put pan div rand 2.0 lac earch 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-
百度地圖之在一個地圖上顯示多條導航路線
package com.njupt.bmap_helloworld;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.GeoPoint;import com.baidu.mapapi.MKAddrInfo;i
百度地圖API(3):判斷地圖上的點是否在 圓形 多邊形 區域內
GeoUtils.js 效果圖 原始碼 Tips 要注意Point和Circle 都必須是:BMap.Point和BMap.Bounds物件 此案例只展示了多邊形和
Js_百度地圖api的一個坑
呼叫百度地圖api時候標記的marker發飄的解決辦法 Js呼叫百度地圖api的時候發現標記好的小紅點並沒有在地圖中央顯示 前提:已經用map.centerAndZoom(point,xx);設
一個基於百度地圖的桌面軟體(附工程原始碼)
光陰似箭,日月如梭,恍然間,2013就這樣平平淡淡的過去了。想想工資卡上的餘額,心中不免浮起蛋蛋的憂桑。如果再回到2013。。。。。罷了,青春就是如此,每個人都肆無忌憚的揮霍著,在年華正當之時。或許只有當歲月的烙印狠狠落下的那一刻,我們才會想起那再也回不去的美好年華,那落英