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

写在前面

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

话不多说,开整

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

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

腾讯地图坐标拾取器

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

大家都在看

  • 如何实现跨域?

    https://blog.csdn.net/meism5/article/details/90414283 Original: https://www.cnblogs.com/cr…

    Java 2023年6月13日
    083
  • java SPI思想

    为什么说java spi破坏双亲委派模型? – 大宽宽的回答 – 知乎 Original: https://www.cnblogs.com/myseries…

    Java 2023年5月29日
    081
  • Spring Bean生命周期

    本文基于图灵课堂周瑜老师的讲解整理,包括spring bean加载的过程,主要是扫描BeanDefinition以及初始化非懒加载单例Bean两部分,源码取自SpringFrame…

    Java 2023年6月8日
    088
  • 包机制

    包机制 包就是装代码的文件夹。 为了更好地组织类,JAVA提供了包机制,用于区别类名的组织空间。 package 包语句的句法格式为: 一般利用公司域名倒置作为包名。 import…

    Java 2023年6月9日
    064
  • java 获取类路径下的资源文件

    一、问题 在用freemarker生成word文档的时候,在本地可以成功获取到类路径下的资源文件。但是打了jar包放在linux系统下启动,无法获取到该文件,导致生成的word文档…

    Java 2023年6月16日
    091
  • springboot 中事件监听模型的一种实现

    定义事件本身 定义事件源 定义监听者 一、需要实现 ApplicationListener 二、使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种…

    Java 2023年6月16日
    085
  • Java程序员必备的工具和框架

    最近几年,Java 的技术栈发展的非常快,成百上千的技术工具正不断地涌出来,这也造成了一个问题: 我们作为开发者,到底应该选哪些工具搭建出最合适的技术栈呢? 今天我就推荐一波我常用…

    Java 2023年6月7日
    074
  • 智慧树/知到 一键刷课脚本代码(网页自动版 2020最新版)

    本人亲测可用,两种代码皆可 功能: 自动设置 1.5倍速度(最快),静音,自动切换下一课,跳过答题弹窗 进入智慧树网页版 ,按键盘F12出现以下界面,点击Console(控制台),…

    Java 2023年6月9日
    0625
  • 根据子类查询父类

    1.如果改子类有父类,则把父类加入子类的父ID中 private static List breadthParentFirst(List rootTree) { if (Colle…

    Java 2023年6月16日
    073
  • 20220923-冒泡排序及自定义冒泡排序

    package com.zhz.arrays; import java.util.Arrays; import java.util.Comparator; /** * @autho…

    Java 2023年6月15日
    062
  • grep: memory exhausted, 记录一次日志查询问题

    今天某个项目的数据有些问题,需要查询日志看看具体的情况 结果在执行 cat .log |grep “关键字”* 命令后包如下错误: grep: memory…

    Java 2023年6月5日
    092
  • Spring Boot 实现 WebSocket 示例

    参考资料 什么是 WebSocket ? HTTP vs WebSocket 什么时候使用 WebSocket? 代码示例 1. SpringBoot 使用原生 WebSocket…

    Java 2023年6月13日
    094
  • vue实现录音功能js-audio-recorder带波浪图

    实现效果:可得到三种录音数据, pcm,wav,mp3 等 官方api入口: 点我 (网不好的童鞋可以看最下面的 api 截图) 官方案例入口: 点我 cnpm i js-audi…

    Java 2023年6月8日
    0114
  • SpringBoot日志框架

    日志门面与具体实现 slf4j(http://www.slf4j.org/)、log4j、logback是同一个人开发的 log4j2是apache开发的,只是借了log4j的名字…

    Java 2023年5月30日
    075
  • 垃圾收集器与内存分配策略

    程序计数器、虚拟机栈、本地方法栈三个区域随着线程的创建而创建、执行完成销毁,栈中的栈帧随着放大的进入和退出执行入栈与出栈,每个栈帧分配多少内存基本上是在类结构确定下来时已知,因此这…

    Java 2023年6月9日
    094
  • SpringCloud-Eureka

    1. Eureka简介 Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件。 注册中心可以说是微…

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