Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 關於百度地圖GPS/IP定位的相關說明

關於百度地圖GPS/IP定位的相關說明

編輯:關於Android編程

摘要:關於定位,分為GPS定位和網絡定位2種。GPS定位,精度較高,可達到10米,但室內不可用,且超級費電。網絡定位,分為wifi定位和基站定位,都是通過獲取wifi或者基站信息,然後查詢對應的wifi或者基站位置數據庫,得到的定位地點。定位數據庫可以不斷完善不斷補充,所以,越定位越准確。

一、常見的定位:

 ①GPS全球定位。

常見的GPS定位的原理可以簡單這樣理解:由24顆工作衛星組成,使得在全球任何地方、任何時間都可觀測到4顆以上的衛星, 測量出已知位置的衛星到用戶接收機之間的距離,然後綜合多顆衛星的數據就可知道接收機的具體位置。
在露天環境下效果較好,獲取位置信息非常精確。適合移動設備。
缺點:在地鐵等位置效果較差

 ②IP地址定位。

適用於接入互聯網的設備,通過浏覽器是將位置信息發送給 ISP 服務商來解析,其IP 地址與服務商所在位置有關,可能與用戶所在位置不同,所以這種方式的解析容易出現偏差。
另外,由於國內大部分的省都是以省級為單位劃分基站對外訪問 IP ,也就是說,同樣一個出口 IP,後面的對應用戶
可能是跨多個城市的。也有一部分省是按照市一級為單位劃分的,但是位置偏遠。
備注:IP定位很方便,但是數據不准,需要及時更新,有很多商業化的服務。

 ③WiFi定位。

設備只要偵聽一下附近都有哪些熱點,檢測一下每個熱點的信號強弱,然後把這些信息發送給網絡上的服務端。服務器根據這些信息,查詢每個熱點在數據庫裡記錄的坐標,然後進行運算,就能知道客戶端的具體位置了。一次成功的定位需要兩個先決條件:客戶端能上網 ,偵聽到的熱點的坐標在數據庫裡有。

優點:這種方式與GPS效果同樣精確,適用於室內環境的移動設備。
缺點:
你的這個wifi信號,如果在數據庫中沒有被記錄在案,那就沒法定位了。比如,如果你買了個新的無線路由器,靠它肯定是沒法幫助你的移動設備定位的
數據更新有延遲,WIFI覆蓋並不大
原理說明:當你的移動設備需要使用wifi定位的時候,它會搜索周圍的wifi信號,同時在數據庫中搜索,得到地理位置的數據,加上定位提供商收集的海量數據,能夠構建出信號的“指紋”,比基站定位更精准。

④基站定位

我們把手機基站的覆蓋范圍想像成一個個以基站為圓心的圓,需要定位時,手機就向周邊多座基站發送測量信號,並計算這些測量信號到達基站所需要的時間,推算出手機距離基站的直線距離,再經過數學運算,手機位置坐標就可由3個基站圓的交點來確定。
優點:LBS定位的優勢是方便、成本低,因為它是通過手機進行定位的。理論上說,只要計算三個基站的信號差異,就可以判斷出手機所在的位置,而且用戶所持終端只需一部手機即可。因此,只要用戶手機有信號,就可以隨時進行位置定位,而不受天氣、高樓、位置等影響。
缺點:定位精度隨所處位置基站數不同會有變化。
百度地圖等在web開發時並不提供相關api

二、測試結果:

初步得到的結果:GPS>單點WiFi>基站>IP
GPS和WIFI相對測試的結果較好。 局限性:WIFI效果較好,但是局限性很大。基站定位在web開發時比較麻煩 目前比較好的方式,就是讀取GPS的相關信息(比如經緯度等等),再做進一步操作。 在精准度要求比較高的情況下,並不推薦使用ip定位。ip定位好處是:並不需要用戶授權,方便。

三、業務說明:以百度地圖為例

APP開發的話

百度定位sdk,綜合了wifi定位、基站定位等(混合定位)

web開發的話

浏覽器定位
浏覽器定位插件,封裝了標准HTML5定位,並且包含糾偏模塊。
html5定位:拿到的是GPS的數據,定位准確
備注:獲取經緯度數據,想獲得地址,需要糾偏,再使用接口獲得。
參考地址:asp">http://www.w3school.com.cn/html5/html_5_geolocation.asp
鑒於該特性可能侵犯用戶的隱私,除非用戶同意,否則用戶位置信息是不可用的。
Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位。
注釋:對於擁有 GPS 的設備,比如 iPhone,地理定位更加精確。
另外,浏覽器定位插件也是混合定位,獲取了wifi、基站信息用以定位,對於擁有 GPS 的設備,比如 iPhone,由於獲得GPS信息,使得地理定位更加精確。
★浏覽器定位,最好使用在手機浏覽器上,會更加准確,也更加符合使用場景。PC浏覽器上,建議使用IP定位。
demo :http://developer.baidu.com/map/jsdemo.htm

ip定位
通過網絡獲取IP信息,然後查詢IP數據庫,獲取相應的地址信息。
IP數據庫也是可以完善補充,越來越豐富的,所以也是越使用越准確的。
但如果IP有跳轉,有篡改等,那麼IP定位就會不准確了。
demo:http://developer.baidu.com/map/jsdemo.htm

web接口
嫌開發不方便,可以直接調用web接口,體驗更快,缺點是次數限制。

關於JSAPI/webAPI的小小說明
1、js是浏覽器端,而web是服務端。
2、在使用上Web更簡單,若只想使用服務,直接通過調用接口獲取結果的話,並且需求量並不大的 時候,建議使用web。(百度js調用次數不限)
3、想展示地圖,或者超過接口限制,比較復雜的web開發,想要的功能並沒有提供相應的接口,會需要用到js。

在微信中使用

引用微信js即可使用

給的接口只有兩類,一類是用內置浏覽器(使用並不多),一類是得到想要的配置

示例一:使用微信內置地圖查看位置接口
wx.openLocation({
    latitude: 0, // 緯度,浮點數,范圍為90 ~ -90
    longitude: 0, // 經度,浮點數,范圍為180 ~ -180。
    name: '', // 位置名
    address: '', // 地址詳情說明
    scale: 1, // 地圖縮放級別,整形值,范圍從1~28。默認為最大
    infoUrl: '' // 在查看位置界面底部顯示的超鏈接,可點擊跳轉
});

示例二:獲取地理位置接口
wx.getLocation({
    type: 'wgs84', // 默認為wgs84的gps坐標,如果要返回直接給openLocation用的火星坐標,可傳入'gcj02'
success: function (res) {
    var latitude = res.latitude; // 緯度,浮點數,范圍為90 ~ -90
    var longitude = res.longitude; // 經度,浮點數,范圍為180 ~ -180。
    var speed = res.speed; // 速度,以米/每秒計
    var accuracy = res.accuracy; // 位置精度
    }
});

四、其他說明

一. 特殊說明:
1. 通過百度jsapi測試結果看,通過ip定位城市效果也會存在比較大的誤差,更別提精確定位。但是只要數據庫足夠豐富,定位結果會准確的多,但是成本會特別高。如:https://www.ipip.net/ip.html
2. 對於GPS坐標轉換成使用百度api需要轉換百度坐標(糾偏)

二、自己寫的參考demo (ak需要自己申請)
1. js版(利用html5定位,再調用百度api,調用次數不限)
好處:去除了地圖展示等一些功能,直接顯示位置。




<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=xxx"></script>

點擊這個按鈕,獲得您的坐標:

2.web請求,這個比較簡單,直接根據經緯度調用接口。
好處:少一次調用

         'xxx',
                    'ip' => $ip,
                    'coor' => 'bd09ll'//百度地圖GPS坐標

                                                    );
                $api = 'http://api.map.baidu.com/location/ip';
                $resp = $this->async($api, $params);
                $data = json_decode($resp, true);
                //有錯誤
                if ($data['status'] != 0)
                {
                    throw new Exception($data['message']);
                }
                //返回地址信息
                return array(
                    'address' => $data['content']['address'],
                    'province' => $data['content']['address_detail']['province'],
                    'city' => $data['content']['address_detail']['city'],
                    'district' => $data['content']['address_detail']['district'],
                    'street' => $data['content']['address_detail']['street'],
                    'street_number' => $data['content']['address_detail']['street_number'],
                    'city_code' => $data['content']['address_detail']['city_code'],
                    'lng' => $data['content']['point']['x'],
                    'lat' => $data['content']['point']['y']
                );
            }
            /**
             * GPS定位
             * @param $lng
             * @param $lat
             * @return array
             * @throws Exception
             */
            public function locationByGPS($lng, $lat)
            {
                $params = array(
                    'coordtype' => 'wgs84ll',
                    'location' => $lat.','.$lng,
                    'ak' => 'xxx',
                    'from'  => 1,
                    'to'    => 5,
                    'output' => 'json',
                                                      );
                $resp = $this->async('http://api.map.baidu.com/geocoder/v2/', $params, false);
                $data = json_decode($resp, true);
                if ($data['status'] != 0)
                {
                    throw new Exception($data['message']);
                }
                return array(
                    'address' => $data['result']['formatted_address'],
                    'province' => $data['result']['addressComponent']['province'],
                    'city' => $data['result']['addressComponent']['city'],
                    'street' => $data['result']['addressComponent']['street'],
                    'street_number' => $data['result']['addressComponent']['street_number'],
                    'city_code'=>$data['result']['cityCode'],
                    'lng'=>$data['result']['location']['lng'],
                    'lat'=>$data['result']['location']['lat']
                );
            }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved