毕设篇:调用百度api实现驾车路线和时间距离计算

效果展示

html页面:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body,html {width: 100%;height: 100%;margin: 0;font-family: "微软雅黑";}#allmap {height: 600px;width: 1000px;margin: 50px auto;}.submitMap {cursor: pointer;display: block;}</style><link rel="stylesheet" href="lib/theme-chalk/index.css"><!-- 百度api调用 设置地图ak, api key 申请的密钥 --><script type="text/javascript"src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=FO9GG7UZlcypetqR3kuWX8DhwzKYpZwb"></script><!-- vue和element导入 --><script src="js/vue.js"></script><script src="lib/index.js"></script>
</head><body><div id="app"><div id="allmap"></div><div style="float: left;margin-right: 100px;"><form action="" method="post"><input type="text" placeholder="请输入起始点坐标" v-model="input1" id="map1" value=""><input type="text" placeholder="请输入目的地坐标" v-model="input2" id="map2" value=""><input type="button" value="提交" onclick="get()"></form></div><div style="float: left;text-align: center;font-size: 16px;">预计驾车所需时间:<span id="time" style="margin: 0 20px;"></span>预计驾车总路程:<span id="distance" style="margin: 0 20px;"></span></div><!-- --><!-- <span class="submitMap"  @click="onSubmit()">提交</span> --></div><!-- <div id='result'>根据起点和终点经纬度驾车导航路线</div> --><script src="js/RouteApi.js"></script>
</body>
</html>

js页面:

//vue
const mapForm = new Vue({//el: '#app',data() {return {//默认初始化,动态绑定input1: '',input2: '',}},methods: {}
});
// 百度地图API功能 初始化地图
var map = new BMapGL.Map("allmap");
//调用函数
setMap();
//公共控件  封装到getMap函数  var与const的区别,可自行百度查阅
function setMap() {//设置地图样式 darkfunction changeThemeDark() { map.setMapStyle({ style: "dark" }); }//鼠标滚动缩放map.enableScrollWheelZoom(true);// 添加比例尺控件var scaleCtrl = new BMapGL.ScaleControl();map.addControl(scaleCtrl);// 添加比例尺控件var zoomCtrl = new BMapGL.ZoomControl();map.addControl(zoomCtrl);// 添加3D控件var navi3DCtrl = new BMapGL.NavigationControl3D();map.addControl(navi3DCtrl);// 创建城市选择控件var cityControl = new BMapGL.CityListControl({// 控件的停靠位置(可选,默认左上角)anchor: BMAP_ANCHOR_TOP_LEFT,// 控件基于停靠位置的偏移量(可选)offset: new BMapGL.Size(10, 5)});// 将控件添加到地图上map.addControl(cityControl);var cr = new BMapGL.CopyrightControl({anchor: BMAP_ANCHOR_TOP_RIGHT,offset: new BMapGL.Size(10, 25)});   //设置版权控件位置map.addControl(cr); //添加版权控件var bs = map.getBounds();   //返回地图可视区域cr.addCopyright({id: 1,content: "<img src='img/logo.png' width='50px' height='50px'/><a href='index.html' target='_blank' style='font-size:12px;color:gray;text-decoration: none;'>@张家界旅心网</a>",bounds: bs});var menu = new BMapGL.ContextMenu();var txtMenuItem = [{text: '放大一级',callback: function () {map.zoomIn();}}, {text: '缩小一级',callback: function () {map.zoomOut();}}];for (var i = 0; i < txtMenuItem.length; i++) {menu.addItem(new BMapGL.MenuItem(txtMenuItem[i].text, txtMenuItem[i].callback, 100));}map.addContextMenu(menu);map.addEventListener('click', function (e) {alert('点击位置经纬度:' + e.latlng.lng.toFixed(3) + ',' + e.latlng.lat.toFixed(3));});// 创建定位控件var locationControl = new BMapGL.LocationControl({// 控件的停靠位置(可选,默认左上角)anchor: BMAP_ANCHOR_TOP_RIGHT,// 控件基于停靠位置的偏移量(可选)offset: new BMapGL.Size(20, 20)});// 将控件添加到地图上map.addControl(locationControl);// 添加定位事件locationControl.addEventListener("locationSuccess", function (e) {var address = '';address += e.addressComponent.province;address += e.addressComponent.city;address += e.addressComponent.district;address += e.addressComponent.street;address += e.addressComponent.streetNumber;alert("当前定位地址为:" + address);});locationControl.addEventListener("locationError", function (e) {alert(e.message);});
}
//初始化地图,用城市名设置地图中心点,显示比例级别
var point = new BMapGL.Point(110.469578, 29.144397);
map.centerAndZoom(point, 15);
function showSH() { map.centerAndZoom("张家界", 14); }
function theLocation() {var city = document.getElementById("cityName").value;if (city != "") {map.centerAndZoom(city, 14);      // 用城市名设置地图中心点,显示比例级别}
}
//设置版权偏移
// map.setCopyrightOffset();// 创建添加点标记
var marker = new BMapGL.Marker(new BMapGL.Point(110.46966, 29.144162));
map.addOverlay(marker);// 创建图文信息窗口
var sContent = `<h4 style='margin:0 0 5px 0;'>吉首大学张家界校区</h4><img style='float:right;margin:0 4px 22px' id='imgDemo' src='img/zjjxq.jpg' width='139' height='104'/><p style='margin:0;line-height:1.5;font-size:13px;text-indent:2em'>坐落于世界旅游知名旅游城市张家界,有着武陵源,天门山,黄龙洞,玻璃桥等世界知名景点,热情张家界欢迎你!</p></div>`;
var infoWindow = new BMapGL.InfoWindow(sContent);
// marker添加点击事件
marker.addEventListener('click', function () {this.openInfoWindow(infoWindow);// 图片加载完毕重绘infoWindowdocument.getElementById('imgDemo').onload = function () {infoWindow.redraw(); // 防止在网速较慢时生成的信息框高度比图片总高度小,导致图片部分被隐藏};
});// 自定义中心点,自定义两地的驾车路线
map.centerAndZoom(new BMapGL.Point(110.470, 29.144), 14);const p1 = new BMapGL.Point(110.471, 29.172);
const p2 = new BMapGL.Point(110.470, 29.144);
const driving = new BMapGL.DrivingRoute(map, { renderOptions: { map: map, autoViewport: true } });
driving.search(p1, p2);//执行点击事件时,调用get()方法,重新加载map地图,关于setMap函数不能复用的原因,是由于调用外部函数会执行两次,位置放置前后也不能解决
function get() {var map = new BMapGL.Map("allmap");//已实现外部函数的复用// function getMap() {// }//调用外部函数function getMap() {//设置地图样式 darkfunction changeThemeDark() { map.setMapStyle({ style: "dark" }); }//鼠标滚动缩放map.enableScrollWheelZoom(true);// 添加比例尺控件var scaleCtrl = new BMapGL.ScaleControl();map.addControl(scaleCtrl);// 添加比例尺控件var zoomCtrl = new BMapGL.ZoomControl();map.addControl(zoomCtrl);// 添加3D控件var navi3DCtrl = new BMapGL.NavigationControl3D();map.addControl(navi3DCtrl);// 创建城市选择控件var cityControl = new BMapGL.CityListControl({// 控件的停靠位置(可选,默认左上角)anchor: BMAP_ANCHOR_TOP_LEFT,// 控件基于停靠位置的偏移量(可选)offset: new BMapGL.Size(10, 5)});// 将控件添加到地图上map.addControl(cityControl);var cr = new BMapGL.CopyrightControl({anchor: BMAP_ANCHOR_TOP_RIGHT,offset: new BMapGL.Size(10, 25)});   //设置版权控件位置map.addControl(cr); //添加版权控件var bs = map.getBounds();   //返回地图可视区域cr.addCopyright({id: 1,content: "<img src='img/logo.png' width='50px' height='50px'/><a href='index.html' target='_blank' style='font-size:12px;color:gray;text-decoration: none;'>@张家界旅心网</a>",bounds: bs});var menu = new BMapGL.ContextMenu();var txtMenuItem = [{text: '放大一级',callback: function () {map.zoomIn();}}, {text: '缩小一级',callback: function () {map.zoomOut();}}];for (var i = 0; i < txtMenuItem.length; i++) {menu.addItem(new BMapGL.MenuItem(txtMenuItem[i].text, txtMenuItem[i].callback, 100));}map.addContextMenu(menu);map.addEventListener('click', function (e) {alert('点击位置经纬度:' + e.latlng.lng.toFixed(3) + ',' + e.latlng.lat.toFixed(3));});// 创建定位控件var locationControl = new BMapGL.LocationControl({// 控件的停靠位置(可选,默认左上角)anchor: BMAP_ANCHOR_TOP_RIGHT,// 控件基于停靠位置的偏移量(可选)offset: new BMapGL.Size(20, 20)});// 将控件添加到地图上map.addControl(locationControl);// 添加定位事件locationControl.addEventListener("locationSuccess", function (e) {var address = '';address += e.addressComponent.province;address += e.addressComponent.city;address += e.addressComponent.district;address += e.addressComponent.street;address += e.addressComponent.streetNumber;alert("当前定位地址为:" + address);});locationControl.addEventListener("locationError", function (e) {alert(e.message);});}getMap();//根据id获取属性值var map1 = document.getElementById("map1").value;var map2 = document.getElementById("map2").value;//测试数据,得知获取的是 类似 110.458,29.158 格式的数据,中间有逗号,所以是字符串,可以使用split对字符串进行分割成数组// console.log(map1, map2);//设置路线显示中心点,这段代码不能省略,否则204行的alert会执行两次map.centerAndZoom(new BMapGL.Point(map1.split(',')[0] + 0.5, map1.split(',')[1] + 0.5), 12);//计算驾车路线时间和距离 由于现在无法实现用户输入两地自动获取其坐标,只能借助百度拾取坐标系统或者通过控件变相实现var output = "";var searchComplete = function (results) {console.log('测试1');if (transit.getStatus() != BMAP_STATUS_SUCCESS) {return;}else {//将数据传递到html页面var jctime = results.getPlan(0).getDuration(true);var stime = document.getElementById("time");stime.innerHTML = jctime;var jcdistance = results.getPlan(0).getDistance(true)var sdistance = document.getElementById("distance");sdistance.innerHTML = jcdistance;//获取时间-获取距离output = "此次驾车需要" + jctime + "\n" + "总路程为:" + jcdistance + "\n";console.log('测试2');}}//var transit = new BMapGL.DrivingRoute(map, {renderOptions: { map: map, autoViewport: true },onSearchComplete: searchComplete,onPolylinesSet() {//可以通过alert弹出相应信息,使用settimeout进行延时// setTimeout(function () { alert(output) }, "3000");}});//动态获取用户输入的两地坐标var start = new BMapGL.Point(map1.split(',')[0], map1.split(',')[1]);var end = new BMapGL.Point(map2.split(',')[0], map2.split(',')[1]);transit.search(start, end);
}
/**/
功能需求:

1.调用百度api实现旅游路线的规划,如何调用百度api请参考https://lbsyun.baidu.com/
2.添加自定义控件 https://lbsyun.baidu.com/index.php?title=open/jsdemo
注意区分BMapGL 和 BMap 的区别,前者无法实现点击图标显示百度地图自带的附属信息
详情参考文档 https://www.jianshu.com/p/1b99444f9a70
3.针对驾车路线和时间距离进行动态获取(如果你想从服务器传递数据,那就更加可以完善这个功能了,可惜我不会)

具体实现:

利用js获取表单信息,然后传递给html;
本来想用vue,但是突然发现vue的方法被js所调用也要通过js的onclick事件进行操作
本人vue学习的不是很好,不会使用vue的watch方法进行监测,同时百度地图api是基于js调用的,很难将百度api的代码放到vue的方法里面
对于外部ui,大家可以使用以下element ui (不过这个需要与vue.js对应版本并结合使用)

问题解决:

1.动态数据获取并随时刷新:利用onclick事件监听,每提交一次就重新刷新map地图,这样可以解决外部与get互不冲突,并且不会保留原有的起始点和终点的路线信息
2.对数据的分割和截取处理,利用js的split方法
3.将数据传递到html,使用innerhtml
4.对坐标信息进行小数点截取,利用toFixed()方法

功能完善:

1.暂无法实现让用户直接输入两地城市名来自动获取坐标,如有大佬看见,给我推荐一个有效的解决办法,或者提供新思路,如何将百度拾取坐标系统调用
或者通过自建json数据,指定24个城市之间的坐标信息,然后间接实现部分功能,关于json数据得获取可以直接用python批量获取,可以去网上找源码
2.如何解决代码复用的问题,setMap和getMap是同一个函数,但是在内部直接调用外部函数会间接执行两次,导致函数内部点击事件失效。如果有小伙伴能够解决,欢迎不吝赐教!

相关资源:

驾车路线模板:https://lbsyun.baidu.com/jsdemo.htm#sLngLatSearchPath

调用百度api实现驾车路线和时间距离计算相关推荐

  1. 微信小程序调用腾讯地图API进行驾车路线规划

    微信小程序调用腾讯地图API进行驾车路线规划 申请key 下载sdk 实现代码 遇到的问题 申请key 微信小程序的地图api是非常有限的,所以部分功能实现需要调用地图api.使用腾讯地图api过程如 ...

  2. 根据两个经纬度点调用百度地图应用查询路线 适用android或者ios中及网页浏览(手机网页同样适用)

    Intent intent = null;try {// 如果有安装百度地图 就启动百度地图StringBuffer sbs = new StringBuffer();sbs.append(" ...

  3. python aipspeech_Python调用百度API实现语音识别(二)

    咪哥杂谈 本篇阅读时间约为 5 分钟. 1 前言 上一篇文章里,大致介绍了百度官方 api 的一些前置准备工作. 想回顾的同学,可以看完本篇在下面找到历史链接. 今天就来上手实战编码,体验一下代码实现 ...

  4. 【Python学习笔记】简单调用百度API应用

    #本文一切代码及理论均来自于郑秋生.夏敏捷二位老师主编<Python项目案例发 从入门到实践>一书,本人仅做微改.创作本文的目的仅为总结本人的学习过程和成果,借此巩固.可能存在许多疏漏之处 ...

  5. Java调用百度API实现图像识别

    Java调用百度API实现图像识别 最近在做一个关于识别的小功能,翻阅了一堆资料,也实践自己去实现这个功能,最后识别的结果不是那么理想.这里介绍一个完全可以商用以及识别率超高的百度ai接口 1.为什么 ...

  6. 调用百度API实现图像风格转换

    目录 1.作者介绍 2.基本概念 2.1 人工智能云服务与百度智能云 2.2 图像风格转换 3.调用百度API实现图像风格转换 3.1 配置百度智能云平台 3.2 环境配置 3.3 完整代码实现 3. ...

  7. mac下载的api文档怎么_Python调用百度API实现语音识别(二)

    Python调用百度API实现语音识别(二) 前言 上一篇文章里,大致介绍了百度官方 api 的一些前置准备工作. 想回顾的同学,可以看完本篇在下面找到历史链接. 今天就来上手实战编码,体验一下代码实 ...

  8. java调用百度翻译_Java调用百度API实现翻译-Go语言中文社区

    下面是Java调用百度API实现翻译的具体步骤: 一.在写代码之前先在在百度翻译平台中,申请APP_ID 申请地址申请的详见点击打开链接 申请之后,会得到APP_ID和SECURITY_KEY 二.j ...

  9. java实现文本纠错功能_调用百度API进行文本纠错

    毕设做的是文本纠错方面,然后今天进组见研究生导师 .老师对我做的东西蛮感兴趣.然后介绍自己现在做的一些项目,其中有个模块需要有用到文本纠错功能. 要求1:有多人同时在线编辑文档,然后文档功能有类似Wo ...

最新文章

  1. markdown学习/mou
  2. C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
  3. 判断C语言变量名是否合法
  4. zz 聊聊并发(二)
  5. 6远程桌面连接不上_windows server2008 远程桌面 创建新用户和多用户登录
  6. 计算机程序CP电子文献,电子文献标识
  7. nv21转jpg c语言,Yuv420转Jpeg(C语言实现)
  8. 【 Linux 网络虚拟化 】Openvswitch
  9. dnastar拼接反向互补序列_反向互补、反向、互补序列有何区别?
  10. Python3爬虫实战——QQ空间自动点赞程序(上)
  11. 三菱PLC安装报错“工程初始化失败”处理方法
  12. 树莓派Raspberry Pi 4B
  13. 金融rate函数解析【附java实现】
  14. dw html段落首行缩进,使用Dreamweaver8实现文本首行缩进
  15. android webview 横竖屏_Android 切换横竖屏
  16. 【ubuntu】解决 Certificate verification failed: The certificate is NOT trusted
  17. python统计一组数据中的概率_Python实现概率分布
  18. 6-3 计算Fibonacci数列每一项时所需的递归调用次数 (10 分)
  19. oracle 表分区
  20. 图文结合带你搞懂MySQL日志之Error Log(错误日志)

热门文章

  1. 3D Slicer 中导入STL文件
  2. 【企业为什么要进行数字化转型】之数字时代新模式
  3. QQ空间掉帧率优化实战
  4. 必备干货,程序员进阶升级全攻略!
  5. 即时通讯软件安全问题分析
  6. android 下拉列表动画,android下拉列表空间Spinner的三种使用方法
  7. 【油猴脚本】B站弹幕机器人
  8. 体寒是不是天生的 体寒四个基本常识须知
  9. android商品销售系统,化工产品销售管理系统
  10. Android中的Gradle之配置及构建优化