國內三大地圖(騰訊、高德、百度)路線規劃功能的整合

Jae1995發表於2021-11-12

寫在前面

基於導航到門店的需求,於是有了這一個隨筆,例如一些社群團購,自提點導航的功能,同樣適用的。

 

話不多說,開整

一、先定一個目標點(這個通常是通過介面獲取的)

建議通過騰訊地圖座標拾取器進行拾取座標

騰訊地圖座標拾取器

因為騰訊和高德用的座標型別都是gcj02,而百度用的是bd09ll,所以很顯然的我們會設定目標點的座標型別為gcj02的,後面再進行轉換(文末有)就好了。(這些座標型別這裡不做深究)

 

以廣州塔為例

const to = {
    lng: 113.32446,
    lat: 23.10647,
    city: '廣州市',
    name: '廣州塔'
}

 

二、騰訊地圖

官方文件https://lbs.qq.com/webApi/uriV1/uriGuide/uriWebRoute

我們可以注意下下面框出來的那一句話

 

所以我寫程式碼的時候也沒有帶上起點

貼程式碼

1 function goQQ() {
2     location = 'https://apis.map.qq.com/uri/v1/routeplan?type=drive&to=' +
3         to.name + '&tocoord=' + to.lat + ',' + to.lng + '&policy=1&referer=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77'
4 };

 

三、高德地圖

官方文件https://lbs.amap.com/api/uri-api/guide/travel/route

和騰訊地圖一樣,高德地圖也不需要傳入起點,預設為當前位置,在微信內建瀏覽器內可能無法獲取到當前位置哦,需要用第三方瀏覽器開啟

 

 貼程式碼

function goGd() {
    location = 'https://uri.amap.com/navigation?from=&to=' + to.lat + ',' + to.lng + ',' + to.name +
        '&src=mypage&coordinate=gaode&callnative=0'
};

 

四、百度地圖

官方文件https://lbsyun.baidu.com/index.php?title=uri/api/web

往下翻,找到 2.2.3公交、駕車、步行路線規劃

可以看到框出來的點都是必選的

 

這時候我們就得做一些動作了

1、獲取當前位置

1.1 先申請百度雲的Key

https://lbsyun.baidu.com/index.php?title=jspopular/guide/getkey

1.2 html引入API

<script src="https://api.map.baidu.com/api?v=2.0&ak=pQWl932IkCMb3elP8MpLCyUsWTkFCFGm"></script>

1.3 獲取當前位置資訊

 1 //獲取當前位置資訊
 2 function getPoint() {
 3     return new Promise((resolve, reject) => {
 4         let point = {}; //初始化當前座標資訊
 5         let geolocation = new BMap.Geolocation();
 6         geolocation.getCurrentPosition(function(r) {    //當前座標資訊
 7             if (this.getStatus() == BMAP_STATUS_SUCCESS) {
 8                 mk = new BMap.Marker(r.point);
 9                 point.lng = r.point.lng; //經度
10                 point.lat = r.point.lat; //緯度
11                 let gc = new BMap.Geocoder();
12                 gc.getLocation(r.point, function(rs) {    //逆地址解釋
13                     point.city = rs.addressComponents.city; //當前城市
14                     resolve(point);
15                 });
16             } else {
17                 alert('failed' + this.getStatus());
18             }
19         });
20     })
21 }

 

2、轉換終點座標為百度經緯度座標

 1 /**
 2  * 騰訊地圖座標轉換百度地圖座標
 3  * lng 騰訊經度
 4  * lat 騰訊緯度
 5  */
 6 function qqMapToBMap(lng, lat) {
 7     if (lng == null || lng == '' || lat == null || lat == '')
 8         return [lng, lat];
 9     var x_pi = 3.14159265358979324;
10     var x = parseFloat(lng);
11     var y = parseFloat(lat);
12     var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
13     var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
14     var lng = (z * Math.cos(theta) + 0.0065).toFixed(5);
15     var lat = (z * Math.sin(theta) + 0.006).toFixed(5);
16     return [lng, lat];
17 };

 

3、上程式碼

 1 //因為百度地圖當前定位是非同步獲取的一個方式,所以要使用async/await
 2 async function goBd() {
 3     //等待非同步獲取資料
 4     await getPoint().then(point => {
 5         let destination = qqMapToBMap(to.lng, to.lat); //騰訊地圖座標轉百度地圖座標
 6         let destination_lng = destination[0];
 7         let destination_lat = destination[1];
 8         location =
 9             'http://api.map.baidu.com/direction?origin=latlng:' + point.lat +
10             ',' + point.lng +
11             '|name:我的位置&destination=latlng:' + destination_lat + ',' + destination_lng + '|name:' + to
12             .name +
13             '&origin_region=' + point.city + '&destination_region=' + to.city +
14             '&mode=driving&output=html&src=webapp.baidu.openAPIdemo';
15     });
16 };

 

完整程式碼  戳我

 

附上百度轉騰訊的程式碼

 1 /**
 2  * 百度地圖座標轉換成騰訊地圖座標
 3  * lng 百度經度
 4  * lat 百度緯度
 5  */
 6 function bMapToQQMap(lng, lat) {
 7     if (lng == null || lng == '' || lat == null || lat == '')
 8         return [lng, lat];
 9     var x_pi = 3.14159265358979324;
10     var x = parseFloat(lng) - 0.0065;
11     var y = parseFloat(lat) - 0.006;
12     var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
13     var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
14     var lng = (z * Math.cos(theta)).toFixed(7);
15     var lat = (z * Math.sin(theta)).toFixed(7);
16     return [lng, lat];
17 }

 

對你有用的話,點個推薦吧!

相關文章