手機端或PC端利用高德地圖和騰訊地圖獲取用戶當前位置信息

目錄

一、簡介

二、高德地圖

三、騰訊地圖

四、總結


一、簡介

最近在項目中,有需要使用到獲取用戶當前地理位置信息的功能,獲取當前用戶位置保存到數據庫中的場景,並且需要支持多種地圖定位方式,我這裏採用系統參數配置的方式,暫時實現了高德地圖和騰訊地圖兩種方式,下面我們就分別對兩種地圖的實現方式做一個總結。

二、高德地圖

【a】註冊高德地圖開發者賬號獲取開發者Key

高德開放平臺地址:https://console.amap.com/dev/key/app

選擇:Web端(JS API)服務平臺

【b】頁面引入相關JS

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=這裏填寫上一步申請成功的應用key"></script>

【c】獲取當前位置代碼

//初始化高德地圖定位
	initGdMap = () => {
		let mapObj = new AMap.Map('iCenter');
		mapObj.plugin('AMap.Geolocation', function() {
			let geolocation = new AMap.Geolocation({
				enableHighAccuracy: true, // 是否使用高精度定位,默認:true
				timeout: 10000,           // 超過10秒後停止定位,默認:無窮大
				maximumAge: 0,            // 定位結果緩存0毫秒,默認:0
				convert: true,            // 自動偏移座標,偏移後的座標爲高德座標,默認:true
				showButton: true,         // 顯示定位按鈕,默認:true
				buttonPosition: 'LB',     // 定位按鈕停靠位置,默認:'LB',左下角
				buttonOffset: new AMap.Pixel(10, 20), // 定位按鈕與設置的停靠位置的偏移量,默認:Pixel(10, 20)
				showMarker: true,         // 定位成功後在定位到的位置顯示點標記,默認:true
				showCircle: true,         // 定位成功後用圓圈表示定位精度範圍,默認:true
				panToLocation: true,      // 定位成功後將定位到的位置作爲地圖中心點,默認:true
				zoomToAccuracy: true,       // 定位成功後調整地圖視野範圍使定位位置及精度範圍視野內可見,默認:false
			});
			mapObj.addControl(geolocation);
			geolocation.getCurrentPosition((status, result) => {
				if (status === 'complete') {
					//縮減地址   result.formattedAddress爲詳細地址(省市縣)
					// let currentAddress = result.addressComponent.building;
					console.log(result);
				} else {
					Toast.fail('定位失敗', 1, () => {
						props.dispatch({
							type: 'studentWorkStudy/changeCurrentAddress',
							currentAddress: '定位失敗',
						});
					});
				}
			});
		});
	};

【d】調用結果

注意事項:移動端包括手機,pad和其它帶有GPS定位芯片的智能設備(如手錶、音箱等),移動端的系統包括iOS和Android。成功完成定位需要達成以下前提條件:

  1. 系統GPS打開;
  2. 所使用的App或瀏覽器已獲取定位權限;
  3. 對打開的頁面允許使用定位;
  4. 對於iOS10以上系統和Android的一些版本已禁止在非HTTPS協議的域名下定位,請儘快將站點升級到HTTPS;

注意,以上只是定位成功的前提條件,滿足這些並不一定等於可以成功定位,定位還與當前位置(室內會影響GPS信息)、手機信號和定位權限等因素影響。如果您在使用過程中定位失敗,可以參考FAQ:Geolocation的定位流程以及定位失敗的原因 。

更多高德地圖相關API功能可以參考:https://lbs.amap.com/api/javascript-api/summary進行學習。

三、騰訊地圖

說實話,騰訊地圖沒有那麼準,如果有開通HTTPS域名訪問的網站,建議使用高德地圖來進行定位,不然獲取的位置可能會有1至2公里的誤差都有可能。

【a】註冊騰訊地圖開發者賬號獲取開發者Key

騰訊地圖開發者平臺地址:https://lbs.qq.com/dev/console/key/manage

【b】頁面引入相關JS

<script type="text/javascript" src="https://map.qq.com/api/js?v=2.exp&key=這裏填寫上一個步驟申請的key"></script>

【c】獲取當前位置代碼

由於考慮到騰訊地圖不是特別準,所以我的做法是:先獲取到當前位置的經緯度信息,然後稍稍做一些微調,然後通過騰訊地圖相關WebService API接口進行經緯度逆解析地理位置信息。

逆地址解析(座標位置描述)參考文檔:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder

注意:下面的mapSecret其實就是剛剛第一步申請的騰訊地圖Key.

//初始化騰訊地圖定位
	initTencentMap = (mapSecret = '') => {
		if (!mapSecret) {
			Toast.fail('請到系統管理設置地圖祕鑰');
			return;
		}
		let props = this.props;
		//初始化騰訊地圖定位
		let geolocation = new qq.maps.Geolocation(mapSecret, 'ly-sm-mobile-ui');
		let options = { timeout: 8000 };
		geolocation.getLocation((position) => {
			//稍微修正騰訊地圖的經緯度偏差
			let latitude = position.lat + 0.00134;
			let longitude = position.lng + 0.01191;
			props.dispatch({
				type: 'studentWorkStudy/getAddressList',
				params: {
					location: `${latitude},${longitude}`,
				},
				callback: data => {
					if (data) {
						let dataMap = JSON.parse(data);
                        console.log(dataMap.result);
						//地址描述
						// let address = dataMap.result.address || '';
						// 經過騰訊地圖優化過的描述方式
						let recommendAddress = dataMap.result.formatted_addresses.recommend || '';
						//更多參數可參考:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder
						props.dispatch({
							type: 'studentWorkStudy/changeCurrentAddress',
							currentAddress: recommendAddress,
						});
					}
				},
			});
		}, () => {
			Toast.fail('定位失敗', 1, () => {
				props.dispatch({
					type: 'studentWorkStudy/changeCurrentAddress',
					currentAddress: '定位失敗',
				});
			});
		}, options);
	};

通過逆地址解析需要後端服務配合去發起WebService請求,其實就是發起一個http請求,請求URL就如下面那樣,只是URL上面的經緯度信息是獲取的當前位置的經緯度。

調用示例: GET請求示例,注意參數值要進行URL編碼
https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&get_poi=1

請求參數說明:

參數 必填 說明 示例
location 位置座標,格式:
location=lat<緯度>,lng<經度>
location= 39.984154,116.307490
get_poi 是否返回周邊POI列表:
1.返回;0不返回(默認)
get_poi=1
poi_options 用於控制POI列表:
1 poi_options=address_format=short
返回短地址,缺省時返回長地址
2 poi_options=radius=5000
半徑,取值範圍 1-5000(米)
3 poi_options=page_size=20
每頁條數,取值範圍 1-20
4 poi_options=page_index=1
頁碼,取值範圍 1-20
注:分頁時page_size與page_index參數需要同時使用
5 poi_options=policy=1/2/3/4/5
控制返回場景,
policy=1[默認] 以地標+主要的路+近距離POI爲主,着力描述當前位置;
policy=2 到家場景:篩選合適收貨的POI,並會細化收貨地址,精確到樓棟;
policy=3 出行場景:過濾掉車輛不易到達的POI(如一些景區內POI),增加道路出入口、交叉口、大區域出入口類POI,排序會根據真實API大用戶的用戶點擊自動優化。
policy=4 社交簽到場景,針對用戶簽到的熱門 地點進行優先排序。
policy=5 位置共享場景,用戶經常用於發送位置、位置分享等場景的熱門地點優先排序
6 poi_options=category=分類詞1,分類詞2,
指定分類,多關鍵詞英文逗號分隔;
(支持類別參見:附錄)
【單個參數寫法示例】:
poi_options=address_format=short
【多個參數英文分號間隔,寫法示例】:
poi_options=address_format=short;radius=5000;
page_size=20;page_index=1;policy=2
key 開發密鑰(Key) key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
output 返回格式:支持JSON/JSONP,默認JSON output=json
callback JSONP方式回調函數 callback=function1

返回結果示例:

{
    "status": 0,
    "message": "query ok",
    "request_id": "c165b6de-b9d9-11ea-8207-5254004df5fd",
    "result": {
        "location": {
            "lat": 39.984154,
            "lng": 116.30749
        },
        "address": "北京市海淀區北四環西路66號",
        "formatted_addresses": {
            "recommend": "海淀區中關村中國技術交易大廈(彩和坊路)",
            "rough": "海淀區中關村中國技術交易大廈(彩和坊路)"
        },
        "address_component": {
            "nation": "中國",
            "province": "北京市",
            "city": "北京市",
            "district": "海淀區",
            "street": "北四環西路",
            "street_number": "北四環西路66號"
        },
        "ad_info": {
            "nation_code": "156",
            "adcode": "110108",
            "city_code": "156110000",
            "name": "中國,北京市,北京市,海淀區",
            "location": {
                "lat": 40.045132,
                "lng": 116.375
            },
            "nation": "中國",
            "province": "北京市",
            "city": "北京市",
            "district": "海淀區"
        },
        "address_reference": {
            "business_area": {
                "id": "14178584199053362783",
                "title": "中關村",
                "location": {
                    "lat": 39.980598,
                    "lng": 116.310997
                },
                "_distance": 0,
                "_dir_desc": "內"
            },
            "famous_area": {
                "id": "14178584199053362783",
                "title": "中關村",
                "location": {
                    "lat": 39.980598,
                    "lng": 116.310997
                },
                "_distance": 0,
                "_dir_desc": "內"
            },
            "crossroad": {
                "id": "529979",
                "title": "海淀大街/彩和坊路(路口)",
                "location": {
                    "lat": 39.982498,
                    "lng": 116.30809
                },
                "_distance": 185.8,
                "_dir_desc": "北"
            },
            "town": {
                "id": "110108012",
                "title": "海淀街道",
                "location": {
                    "lat": 39.974819,
                    "lng": 116.284409
                },
                "_distance": 0,
                "_dir_desc": "內"
            },
            "street_number": {
                "id": "595672509379194165901290",
                "title": "北四環西路66號",
                "location": {
                    "lat": 39.984089,
                    "lng": 116.308037
                },
                "_distance": 45.8,
                "_dir_desc": ""
            },
            "street": {
                "id": "9217092216709107946",
                "title": "彩和坊路",
                "location": {
                    "lat": 39.97921,
                    "lng": 116.308411
                },
                "_distance": 46.6,
                "_dir_desc": "西"
            },
            "landmark_l2": {
                "id": "3629720141162880123",
                "title": "中國技術交易大廈",
                "location": {
                    "lat": 39.984104,
                    "lng": 116.307503
                },
                "_distance": 0,
                "_dir_desc": "內"
            }
        },
        "poi_count": 10,
        "pois": [
            {
                "id": "3629720141162880123",
                "title": "中國技術交易大廈",
                "address": "北京市海淀區北四環西路66號",
                "category": "房產小區:商務樓宇",
                "location": {
                    "lat": 39.984104,
                    "lng": 116.307503
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 0,
                "_dir_desc": "內"
            },
            {
                "id": "9969038414753335812",
                "title": "騰訊科技(北京)有限公司(中國技術交易大廈)",
                "address": "北京市海淀區北四環西路66號中國技術交易大廈第三極大廈5-11層",
                "category": "公司企業:公司企業",
                "location": {
                    "lat": 39.984131,
                    "lng": 116.307503
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 0,
                "_dir_desc": "內"
            },
            {
                "id": "2845372667492951071",
                "title": "中國技術交易大廈A座",
                "address": "北京市海淀區北四環西路66號",
                "category": "房產小區:商務樓宇",
                "location": {
                    "lat": 39.984329,
                    "lng": 116.307419
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 20.4,
                "_dir_desc": ""
            },
            {
                "id": "3724888736111897241",
                "title": "萬學教育集團",
                "address": "北京市海淀區北四環西路66號中國技術交易大廈",
                "category": "公司企業:公司企業",
                "location": {
                    "lat": 39.984085,
                    "lng": 116.307426
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 9.2,
                "_dir_desc": ""
            },
            {
                "id": "13477589832396847863",
                "title": "品·咖啡",
                "address": "北京市海淀區北四環西路66號中國技術交易大廈1樓大廳內",
                "category": "娛樂休閒:咖啡廳",
                "location": {
                    "lat": 39.984192,
                    "lng": 116.30735
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 12.5,
                "_dir_desc": ""
            },
            {
                "id": "3187032738687555052",
                "title": "中關村創業大街",
                "address": "北京市海淀區海淀西大街",
                "category": "購物:商業步行街",
                "location": {
                    "lat": 39.983013,
                    "lng": 116.306732
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 36.3,
                "_dir_desc": "東北"
            },
            {
                "id": "7246616758286733108",
                "title": "基督教堂(彩和坊路)",
                "address": "北京市海淀區彩和坊路9號",
                "category": "旅遊景點:教堂",
                "location": {
                    "lat": 39.983135,
                    "lng": 116.30764
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 69.5,
                "_dir_desc": "北"
            },
            {
                "id": "12925244666643621769",
                "title": "中國技術交易大廈B座",
                "address": "北京市海淀區北四環西路66號",
                "category": "房產小區:商務樓宇",
                "location": {
                    "lat": 39.983906,
                    "lng": 116.307556
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 28.2,
                "_dir_desc": ""
            },
            {
                "id": "12689244359326172642",
                "title": "車庫咖啡",
                "address": "北京市海淀區中關村創業大街6號樓2層",
                "category": "娛樂休閒:咖啡廳",
                "location": {
                    "lat": 39.983898,
                    "lng": 116.306908
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 57.1,
                "_dir_desc": "東北"
            },
            {
                "id": "2926578115367138813",
                "title": "武勝豬肝麪",
                "address": "北京市海淀區北四環西路66號",
                "category": "美食:小喫快餐",
                "location": {
                    "lat": 39.984184,
                    "lng": 116.307503
                },
                "ad_info": {
                    "adcode": "110108",
                    "province": "北京市",
                    "city": "北京市",
                    "district": "海淀區"
                },
                "_distance": 3.6,
                "_dir_desc": ""
            }
        ]
    }
}

通過逆地址解析,還可以獲取當前位置的附近點位置集合信息,這在某些業務場景下還有很有用的。

【d】定位結果

更多騰訊地圖相關API可以參考:https://lbs.qq.com/webApi/javascriptGL/glGuide/glOverview進行學習。

四、總結

以上就是關於高德地圖和騰訊地圖獲取用戶當前位置的功能,簡單來說,基本上都是按照官方文檔進行的,這裏只是做一個總結,方面後面用到的時候可以翻出來看看,還有很多更騷的操作可以參考對應的官方文檔進行學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章