多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 關于百度地圖GPS/IP定位的相關說明

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

來源:程序員人生   發布時間:2016-12-20 16:13:35 閱讀次數:3461次

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

1、常見的定位:

 ①GPS全球定位。

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

 ②IP地址定位。

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

 ③WiFi定位。

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

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

④基站定位

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

2、測試結果:

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

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

APP開發的話

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

web開發的話

  1. 閱讀器定位
    閱讀器定位插件,封裝了標準HTML5定位,并且包括糾偏模塊。
    html5定位:拿到的是GPS的數據,定位準確
    備注:獲得經緯度數據,想取得地址,需要糾偏,再使用接口取得。
    參考地址: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#i8_1

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

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

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

在微信中使用

援用微信js便可使用

給的接口只有兩類,1類是用內置閱讀器(使用其實不多),1類是得到想要的配置

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

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

4、其他說明

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

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

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf⑻" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <script type="text/javascript" src="http://www.vxbq.cn/upload/caiji/20160922/http://api.map.baidu.com/api?v=2.0&ak=xxx"></script>
    <title>我要定位</title>
</head>
<body>
<p id="demo">點擊這個按鈕,取得您的坐標:</p>
<button onclick="getLocation()">試1下</button>
<script>
    // 檢測閱讀器是不是支持HTML5
    function supportsGeoLocation(){
        // return !!navigator.geolocation;
    }
    // 單次位置要求履行的函數
    function getLocation(){
        navigator.geolocation.getCurrentPosition(mapIt,locationError);
    }
    //定位成功時,履行的函數
    function mapIt(position){
        var lon = position.coords.longitude;
        var lat = position.coords.latitude;
        //var url = 'http://api.map.baidu.com/geoconv/v1/?coords='+lon+','+lat+'&from=1&to=5&ak=xxx&output=json';
        //alert("您位置的經度是:"+lon+" 緯度是:"+lat);
        var map = new BMap.Map("");
        var point = new BMap.Point(lon,lat);
        translateCallback = function (data){
            if(data.status === 0) {
                var geoc = new BMap.Geocoder();
                geoc.getLocation(data.points[0], function(rs){
                    var addComp = rs.addressComponents;
                    alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
                });
            }
        }
        var convertor = new BMap.Convertor();
        var pointArr = [];
        pointArr.push(point);
        convertor.translate(pointArr, 1, 5, translateCallback);
    }
    // 定位失敗時,履行的函數
    function locationError(error)
    {
        alert('定位失敗');
        return false;
    }
</script>
</body>
</html>

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

        <?php
        /**
         * Created by PhpStorm.
         * User: Administrator
         * Date: 16⑵⑷
         * Time: 下午4:34
         */
        class map
        {
            private static $_instance;

            const REQ_GET = 1;
            const REQ_POST = 2;

            /**
             * 單例模式
             * @return map
             */
            public static function instance()
            {
                if (!self::$_instance instanceof self)
                {
                    self::$_instance = new self;
                }
                return self::$_instance;
            }

            /**
             * 履行CURL要求
             * @param $url
             * @param array $params
             * @param bool $encode
             * @param int $method
             * @return mixed
             */
            private function async($url, $params = array(), $encode = true, $method = self::REQ_GET)
            {
                $ch = curl_init();
                        if ($method == self::REQ_GET)
                {
                    $url = $url . '?' . http_build_query($params);
                    $url = $encode ? $url : urldecode($url);
                    curl_setopt($ch, CURLOPT_URL, $url);
                }
                else
                {
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
                }
                curl_setopt($ch, CURLOPT_REFERER, 'http://map.baidu.com/');
                curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $res = curl_exec($ch);
                curl_close($ch);
                return $res;
            }

            /**
             * ip定位
             * @param string $ip
             * @return array
             * @throws Exception
             */
            public function locationByIP($ip)
            {
                //檢查是不是合法IP
                if (!filter_var($ip, FILTER_VALIDATE_IP))
                {
                    throw new Exception('ip地址不合法');
                }
                $params = array(
                    'ak' => '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']
                );
            }

5、參考資料和網站

  1. https://www.zhihu.com/question/21063874
  2. http://h-notes.com/notes/RVhVZVNJF1t9RFdZ/20160128/NRl5NZ1Zhp1ddVBthFtdxxh1NlpVttldh1hhtdBB5VBhxhh51RZ51V1x51V1Bx5t/index.html
  3. 百度開發平臺:http://lbsyun.baidu.com/
  4. 微信開發者文檔:http://mp.weixin.qq.com/wiki/home/index.html
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 毛片观看网址 | 日本系列 1页 亚洲系列 | 午夜免费在线观看 | 欧美日韩亚洲国产一区二区三区 | 国产福利在线播放 | 91视频一区二区 | 最新jizz欧美| 国产欧美日韩一区二区三区 | 亚洲一级片免费 | 男人尻女人视频 | 成人久久伊人精品伊人 | 精品理论片一区二区三区 | 欧美性猛| 欧美日韩精品一区二区三区视频在线 | 亚洲2020| 伊人网在线观看 | 亚洲国产成人资源在线软件 | 在线观看视频在线观看 | 欧美午夜精品一区二区三区 | 国产成人一区二区 | 欧美日韩亚洲国产一区二区综合 | 欧洲久久| 亚洲大胆视频 | 欧美第六页| 日韩欧美中文字幕一区 | 欧美极品videosvideoxxx | a免费国产一级特黄aa大 | 中文字幕亚洲天堂 | 国产精品不卡片视频免费观看 | 国产v在线 | 在线看v片 | 福利片国产 | 欧美日韩无线在码不卡一区二区三区 | 日韩欧美一区二区久久 | 日韩精品一区二区三区中文 | 国产成人乱码一区二区三区在线 | 亚洲在线视频免费观看 | 免费能看的黄色网址 | 国产mv在线观看 | 婷婷色九月综合激情丁香 | 波多野结衣一区二区三区 |