国内三大地图(腾讯、高德、百度)路线规划功能的整合

写在前面

基于导航到门店的需求,于是有了这一个随笔,例如一些社区团购,自提点导航的功能,同样适用的。

话不多说,开整

一、先定一个目标点(这个通常是通过接口获取的)

建议通过腾讯地图坐标拾取器进行拾取坐标

腾讯地图坐标拾取器

因为腾讯和高德用的坐标类型都是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 };

完整代码 戳我

2021/11/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 }

对你有用的话,点个推荐吧!

Original: https://www.cnblogs.com/jae-tech/p/15545495.html
Author: Jae1995
Title: 国内三大地图(腾讯、高德、百度)路线规划功能的整合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622106/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 从源码中理解Spring Boot自动装配原理

    SpringBoot 定义了一套接口规范,这套规范规定: SpringBoot在启动时会扫描外部引用jar包中的 META-INF/spring.factories文件,将文件中配…

    Java 2023年6月16日
    082
  • 10 张图聊聊线程的生命周期和常用 APIs

    上一篇文章我们聊了多线程的基础内容,比如为什么要使用多线程,线程和进程之间的不同,以及创建线程的 4 种方式。 本文已收录至我的 Github: https://github.co…

    Java 2023年5月29日
    070
  • postman变量使用:流水号、时间戳

    使用说明 在tests标签下输入如下js 在body报文中使用{{变量}}的方式引用 1、自增编号1 // &#x5148;&#x8BBE;&#x7F6E;…

    Java 2023年6月9日
    077
  • 海康NVR设备上传人脸图片到人脸库

    海康开放平台——海康文档链接——海康开发包和文档下载链接 硬件:海康超脑NVR(全称Network Video Recorder,即网络视频录像机)、人脸摄像机。 环境:JDK_1…

    Java 2023年6月5日
    0210
  • 老年模式 之 fontScale篇

    之前整理过一篇全局字体设置 || 老年模式的文章,提到过4种方法,各有利弊。 最后推荐了方法4,自定义binding属性来实现。这里扩展一篇。 自定义binding实现的确不错,最…

    Java 2023年6月7日
    084
  • 关键字,接口,代码块,枚举

    今日内容 1 关键字 2 代码块 3 接口 4 枚举 1 Java中的关键字 static关键字 : 静态的意思 , 可以修饰变量 , 也可以修饰方法 , 被static修饰的成员…

    Java 2023年6月13日
    071
  • 30个类手写Spring核心原理之AOP代码织入(5)

    本文节选自《Spring 5核心原理》 前面我们已经完成了Spring IoC、DI、MVC三大核心模块的功能,并保证了功能可用。接下来要完成Spring的另一个核心模块—AOP,…

    Java 2023年6月7日
    071
  • PowerMock进行mock测试

    http://www.open-open.com/lib/view/open1452777403292.html Original: https://www.cnblogs.com…

    Java 2023年6月6日
    070
  • java 异常类与自定义异常

    目录 异常类 Exception 类的层次 throws/throw 关键字: throws: throw: try catch finally语句 声明自定义异常 异常类 在 J…

    Java 2023年6月9日
    094
  • Redis GEO 地理位置

    GEO指令 GEOADD GEODIST GEOPOP GEOHASH GEORADIUS GEORADIUSBYMEMBER 指令补充 删除操作 避免单集合数量过多 存储原理 G…

    Java 2023年6月6日
    066
  • SpringWeb 拦截器

    前言 spring拦截器能帮我们实现验证是否登陆、验签校验请求是否合法、预先设置数据等功能,那么该如何设置拦截器以及它的原理如何呢,下面将进行简单的介绍 1.设置 HandlerI…

    Java 2023年6月9日
    080
  • TypeScript(6)函数

    函数 函数是 JavaScript 应用程序的基础,它帮助你实现抽象层,模拟类,信息隐藏和模块。在 TypeScript 里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义…

    Java 2023年6月9日
    076
  • 【架构视角】一篇文章带你彻底吃透Spring

    框架的意义 对于程序员来说,我们通常知道很多概念,例如组件、模块、系统、框架、架构等,而本文我们重点说 框架。 框架,本质上是一些实用经验集合。即是前辈们在实际开发过程中积攒下来的…

    Java 2023年6月13日
    090
  • Fatal error: Call to undefined function session_start()

    在FreeBSD主机上执行PHP页面报以下错误,Fatal error: Call to undefined function session_start() ,应该是在没有安装扩…

    Java 2023年5月30日
    071
  • Java 方法重写

    重写需要有继承关系,子类重写父类的方法! 重写的条件 1.方法名必须相同2.参数列表必须相同3.修饰符:范围可以扩大 :public>Protected>Default…

    Java 2023年6月9日
    038
  • 基于crudapi增删改查接口后端Java SDK二次开发之环境搭建(一)

    基于crudapi后端Java SDK二次开发之环境搭建(一) 背景 目前crudapi增删改查接口系统的后台Java API服务已经全部可用,为了满足复杂的场景,可以通过集成Ja…

    Java 2023年6月6日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球