1. 程式人生 > >百度地圖——判斷一個點是否在一個區域內?

百度地圖——判斷一個點是否在一個區域內?

       由於目前的一個專案涉及離線地圖,經過查詢資料論證,最終還是決定採用百度地圖。在專案過程中,遇到一個比較實際的問題:怎麼判斷地圖上的一個點(經緯座標下)在一個多邊形區域內?

      由於我採用的是百度地圖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。。。。。罷了,青春就是如此,每個人都肆無忌憚的揮霍著,在年華正當之時。或許只有當歲月的烙印狠狠落下的那一刻,我們才會想起那再也回不去的美好年華,那落英