项目中需要根据点击时候点击的内容,输入百度地图查找并展示规划等相关功能

于是封装了一个单独的百度map的html页面以供调用

功能包括了

①展示底图

②切换卫星图,切换卫星路线图,切换普通地图

③通过百度js对自身进行定位并标注

④根据输入的内容查找地点,并可生成当前位置到目标位置的线路规划

⑤任意两点生成线路规划

⑥清除标注

⑦跳转到百度地图官方页面或打开app进行导航

⑧展示线路规划

使用了自己封装的工具 lyhFloatTip:链接如下:

悬浮提示工具(悬浮出现自动消失)

代码如下:

<!DOCTYPE html>
<html>
<head>
<title>map-index.html</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=2.0&ak=aAgtfUXdoQOxbI7ZLW197GaWZYfhokCO&services=&t=20190123111209"></script>
<script src="./../static/jquery/jquery.easing.1.3.js"></script>

<script src="./../static/tools/tipsTools/lyh-tip-float.js"></script>

<style type="text/css">
.anchorBL {
display: none;
} .btn {
background-color: white;
color: #222222;
} /*去除bootstrap按钮点击后的蓝色方形边框*/
.btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus {
outline: none;
}
</style>
</head>
<body>
<div class='col-lg-12 col-md-12 col-sm-12 col-xs-12'>
<div style="color:white;padding:0px;background-image: linear-gradient( 135deg, #FFAA85 10%, #B3315F 100%);border-radius: 4px"
class='col-lg-12 col-md-12 col-sm-12 col-xs-12'>
<div style='font-zize:24px;padding:5px 10px' class='col-lg-6 col-md-6 col-sm-6 col-xs-6'>路线规划</div>
</div>
</div>
<div class='col-lg-12 col-md-12 col-sm-12 col-xs-12' style='padding:10px'>
<div class='col-lg-12 col-md-12 col-sm-12 col-xs-12' style='border:1px solid #bbbbbb;box-shadow: 2px 2px 2px #aaaaaa'>
<!-- 地图 -->
<div id="map" style="height:600px" class='col-lg-12 col-md-12 col-sm-12 col-xs-12'></div>
<!-- 搜索控件 -->
<div class='col-lg-12 col-md-12 col-sm-12 col-xs-12' style='position:absolute;padding:5px 20px 0px 40px;top:0px'>
<!-- 关闭按钮 -->
<div style='position:absolute;top:7px;left:2px'>
<button class='btn btn-primary btn-sm' onclick="removeAll();$('#map-page').hide(300)">
<span class="glyphicon glyphicon-remove"></span>
</button>
</div>
<input id='search-input' type="text" class="form-control" style='border-color:green'>
<div style='position:absolute;top:10px;right:30px;'>
<button id='search-location-btn' class='btn btn-success btn-xs' onclick='locationSearch("map")'>
<span class="glyphicon glyphicon-search"></span> 搜索
</button>
<button class='btn btn-primary btn-xs' title='自己到目标的步行或骑行路线规划' onclick='goTo("walk")'>步/骑</button>
<button class='btn btn-primary btn-xs' title='自己到目标的公交路线规划' onclick='goTo("bus")'>公交</button>
<button class='btn btn-primary btn-xs' title='自己到目标的自驾车路线规划' onclick='goTo("car")'>驾车</button>
</div>
</div>
<!-- 地图类型切换按钮 -->
<div style='position:absolute;top:45px;right:15px'>
<button class='btn btn-primary btn-sm' onclick="switchMap()" title='切换地图显示'>
<span class="glyphicon glyphicon-globe"></span>
</button>
</div>
<!-- 标记自身 -->
<div style='position: absolute;left:5px;bottom:5px'>
<button class='btn btn-success btn-sm' title='刷新自己的定位' onclick='myLocation()'>
<span class="glyphicon glyphicon-screenshot"></span> 我
</button>
<button class='btn btn-warning btn-sm' onclick='removeAll()'>
<span class="glyphicon glyphicon-trash"></span> 清除标注
</button>
</div>
<!-- 自定义路线开启关闭 -->
<div style='position: absolute;right:5px;bottom:5px'>
<button style='display:none' class='customline btn btn-info btn-sm' onclick='myLine("walk")'>步/骑路线</button>
<button style='display:none' class='customline btn btn-info btn-sm' onclick='myLine("bus")'>公交路线</button>
<button style='display:none' class='customline btn btn-info btn-sm' onclick='myLine("car")'>驾车路线</button>
<button id='customLine' class='btn btn-success btn-sm' onclick='customLine()'>自定义路线开启</button>
</div>
<!-- 调用百度地图html或app导航链接按钮 -->
<div style='position: absolute;right:5px;bottom:45px'>
<button id='nav-baidu' style='display:none' class='customline btn btn-info btn-sm' onclick='navToBaidu()'>百度APP导航</button>
</div>
</div>
</div>
<!-- 路线规划结果 -->
<div id='line-result' class='col-lg-12 col-md-12 col-sm-12 col-xs-12' style='padding:10px'></div>
</body> <script type="text/javascript">
$(function() {
initMap('map'); //加载页面初始化map
}) //我的当前定位的缓存
var mypoint = null;
//地图全局变量
var map = null;
//存入两个坐标点供自定义路线导航的栈
var line = [];
//单击地图的目标定位
var target = null; /**
* 地图初始化函数
*/
function initMap(id) {
map = new BMap.Map(id); // 创建地图实例
map.centerAndZoom('北京', 14); //设置中心点
map.enableScrollWheelZoom(true); //允许滚轮操作
map.disableDoubleClickZoom(); //关闭双击放大功能
map.enableKeyboard(); //开启键盘操作功能 //获取当前定位位置
var pointGet = setInterval(function() {
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r) {
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
mypoint = r; //将当前获取的位置存入缓存
var point = new BMap.Point(r.point.lng, r.point.lat);
var label = new BMap.Label('我', {
offset : new BMap.Size(3, 3)
}); //生成自己的定位的标记
label.setStyle({ //修改自己的定位的标记的样式
'border' : "none",
'background' : 'none',
'color' : 'white',
'border-radius' : '50%',
'width' : '20px',
'height' : '20px',
})
line = []; //初始化线路规划
line.push(mypoint); //存入当前自身定位
addMarker(mypoint.point, label); //加载标注
clearInterval(pointGet); //清除计时器
//console.log('您的位置:' + r.point.lng + ',' + r.point.lat);
} else {
console.error('failed' + this.getStatus());
clearInterval(pointGet); //发生错误清除计时器
}
},
{
enableHighAccuracy : true
}
)
}, 10000); //添加单击监听事件
map.addEventListener("click", function(e) { //获取一个点的定位存入为目标点
target = e;
}); //搜索框回车键监听
$('#search-input').keydown(function(e) { //搜索框激活下按键盘回车键执行搜索
if (event.keyCode == 13) {
$("#search-location-btn").click();
}
})
} var mapType = 0; //三种地图切换的标记
function switchMap() {
if (mapType == 0) {
map.setMapType(BMAP_HYBRID_MAP); //卫星路网
mapType = 1;
} else if (mapType == 1) {
map.setMapType(BMAP_SATELLITE_MAP); //卫星地图
mapType = 2;
} else if (mapType == 2) {
map.setMapType(BMAP_NORMAL_MAP); //普通地图
mapType = 0;
}
} /**
* 自定义路线监听开启函数
*/
customLineFlag = false; //自定义路线的开启/关闭标记
function customLine() {
if (customLineFlag == false) { //开启自定义路线
map.addEventListener("click", getLinePoint);
customLineFlag = true;
$('#customLine').html('自定义路线开启中');
$('.customline').show();
} else { //关闭自定义路线
map.removeEventListener("click", getLinePoint);
customLineFlag = false;
$('#customLine').html('自定义路线已关闭');
$('.customline').hide();
}
} /**
* 自定义路线监听的回调函数
*/
function getLinePoint(e) {
if (line.length > 1) { //自定义路线的点有两个
line.splice(0, 1); //删掉旧的
line.push(e); //插入新点
} else { //自定义路线的点不足两个
line.push(e); //插入新点
}
map.clearOverlays(); //清除当前标注
for (var i = 0; i < line.length; i++) { //重新规划标注
var point = new BMap.Point(line[i].point.lng, line[i].point.lat);
var label = new BMap.Label(i == 0 ? "起" : '终', { //标注上的文字
offset : new BMap.Size(3, 3) //标注文字偏移到标注中心
});
label.setStyle({
'border' : "none",
'background' : 'none',
'color' : 'white',
'border-radius' : '50%',
'width' : '20px',
'height' : '20px',
})
addMarker(point, label); //添加标注
}
} /**
* 从自身定位点到目标点的线路规划
*/
//lyhFloatTip的相关代码的链接为:
function goTo(key) {
if (null == mypoint) { //自身定位未完成提示
lyhFloatTip("正在对自己位置进行定位,请稍后...");
return null;
}
if (null == target) { //没有选择目标点
lyhFloatTip("未点选目标位置!");
return null;
}
var start = new BMap.Point(mypoint.point.lng, mypoint.point.lat);
var end = new BMap.Point(target.point.lng, target.point.lat);
removeAll();
if (key == 'walk') { //徒步,骑行线路规划
var walking = new BMap.WalkingRoute(map, {
renderOptions : {
map : map,
panel : "line-result", //结果显示面板
autoViewport : true,
}
});
walking.search(start, end); //执行搜索
} else if (key == 'bus') { //公交线路规划
var transit = new BMap.TransitRoute(map, {
renderOptions : {
map : map,
panel : "line-result", //结果显示面板
autoViewport : true,
},
});
transit.search(start, end); //执行搜索
} else if (key == 'car') { //自驾车线路规划
var driving = new BMap.DrivingRoute(map, {
renderOptions : {
map : map,
panel : "line-result", //结果显示面板
autoViewport : true,
}
});
driving.search(start, end); //执行搜索
}
$('#nav-baidu').show(300); //有线路规划后,展示app按钮,可直接进入百度app
} /**
* 跳转到百度app或百度地图导航的函数
*/
function navToBaidu() {
if (null == target) {
lyhFloatTip("请点击地图选择要导航的目标位置...");
} else {
var lng = target.point.lng;
var lat = target.point.lat;
window.open("http://api.map.baidu.com/marker?location=" + lat + "," + lng + "&title=目的位置&output=html"); //在新窗口打开连接
console.log("http://api.map.baidu.com/marker?location=" + lat + "," + lng + "&title=目的位置&output=html"); //打开的链接
}
} /**
* 搜索目标位置函数
*/
function locationSearch() {
var val = $('#search-input').val();
var local = new BMap.LocalSearch(map, {
renderOptions : {
map : map
}
});
local.search(val); //以名称搜索位置并显示在地图哄
} /**
* 定位到自身所在位置的函数
*/
var mapLocationTimerCount = 0;
function myLocation() {
var mapLocationTimer = setInterval(function() {
if (null != mypoint) {
console.log('您的位置:' + mypoint.point.lng + ',' + mypoint.point.lat); //删除之前的定位点
var allOverlay = map.getOverlays();
for (var i = 0; i < allOverlay.length; i++) {
try { //并非每个 getLabel[i]都有getLabel函数,所以报错,远程调用,无法使用typeof判断
if (allOverlay[i].getLabel().content == "我") {
map.removeOverlay(allOverlay[i]);
return false;
}
} catch (e) {
//console.log(e)
}
}
//添加新的定位点
var point = new BMap.Point(mypoint.point.lng, mypoint.point.lat);
var label = new BMap.Label('我', {
offset : new BMap.Size(3, 3)
});
label.setStyle({
'border' : "none",
'background' : 'none',
'color' : 'white',
'border-radius' : '50%',
'width' : '20px',
'height' : '20px',
})
line = [];
line.push(mypoint); //添加自身定位作为起点
addMarker(mypoint.point, label); //添加标注
map.panTo(mypoint.point); //将自身定位作为地图中心 clearInterval(mapLocationTimer);
} else {
mapLocationTimerCount++;
if (mapLocationTimerCount > 30) { //30秒都没定位成功....
console.log('30秒都没获取定位点...')
mapLocationTimerCount = 0;
clearInterval(mapLocationTimer);
}
}
}, 1000)
} /**
* 绘制路线 徒步-骑行-公交-驾车
*/
function myLine(key) {
if (line.length < 2) { //路线点少于2个提示
lyhFloatTip("需要两个点才可以进行规划路线!");
return null;
} var start = new BMap.Point(line[0].point.lng, line[0].point.lat); //获取存入的起点
var end = new BMap.Point(line[1].point.lng, line[1].point.lat); //获取存入的终点
map.clearOverlays(); //清除之前的mk
if (key == 'walk') { //步行,骑行规划
var walking = new BMap.WalkingRoute(map, {
renderOptions : {
map : map,
panel : "line-result",
autoViewport : true,
}
});
walking.search(start, end);
} else if (key == 'bus') { //公交规划
var transit = new BMap.TransitRoute(map, {
renderOptions : {
map : map,
panel : "line-result",
autoViewport : true,
},
});
transit.search(start, end);
} else if (key == 'car') { //自驾规划
var driving = new BMap.DrivingRoute(map, {
renderOptions : {
map : map,
panel : "line-result",
autoViewport : true,
}
});
driving.search(start, end);
}
} /**
* 创建标注中心带文字的自定义函数
*/
function addMarker(point, label) {
var marker = new BMap.Marker(point);
map.addOverlay(marker);
marker.setLabel(label);
} /**
* 删除所有当前标注
*/
function removeAll() {
map.clearOverlays();
}
</script>
</html>

效果如下图:

以上...

一个百度MAP导航的基础封装的更多相关文章

  1. 手机版的百度map封装,使用gps定位

    代码如下,包自己引 包参考 一个百度MAP导航的基础封装 使用的是浏览器调用gps定位 修改了标注的大小 效果如图: 代码...... <!DOCTYPE html> <html&g ...

  2. 实现百度地图导航Demo的语音播报功能

    上文中实现了在本地导入百度地图导航Demo,那么在此基础上如何实现导航的语音播报呢? 一.为该应用申请语音播报(也叫注册) http://developer.baidu.com/map/index.p ...

  3. (转)百度Map API

    转自  http://blog.sina.com.cn/s/blog_6079f38301013sb3.html 一.与地图操作相关的接口哦! (这些接口的开启都是写在执行成功的回调函数那里) map ...

  4. 利用jquery实现百度新闻导航菜单滑动动画

    前言 前两天,群里有人问百度新闻导航是如何实现的,当时由于忙于工作,没有来得及细看,恰好今天有空闲时间,索性就实现一下这个效果吧: 思路与步骤 1.利用UL创建简单横向导航: <!DOCTYPE ...

  5. 【iOS】苹果,百度Map定位使用与总结

    iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).当中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是 ...

  6. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  7. 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

    前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...

  8. 【Web】利用jquery实现百度新闻导航菜单滑动动画

    前言 前两天,群里有人问百度新闻导航是如何实现的,当时由于忙于工作,没有来得及细看,恰好今天有空闲时间,索性就实现一下这个效果吧: 思路与步骤 1.利用UL创建简单横向导航: <!DOCTYPE ...

  9. 记一个社交APP的开发过程——基础架构选型(转自一位大哥)

    记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...

随机推荐

  1. vmware 虚拟机导入OVF出现路径错误

    现状: 需要将原有数据中心的VM虚拟机导出本地OVF模板,然后迁移至新的机房虚拟化环境后从新导入. 问题: 导入OVF时候,先出现错误问题1,修复完成后,出现错误问题2 1. OVF迁移至本地以后,导 ...

  2. 基础架构之spring cloud基础架构

    这篇文章是给公司设计的微服务基础架构,包括架构设计.部署流程.部署架构.开发Tip等等.这里分享出来,如果对看官们有点用,我就非常的高兴了. 首页 2. 架构设计 3. 部署流程 4. 部署架构 5. ...

  3. 计算球面两点间距离实现Vincenty+Haversine

    vincenty公式  精度很高能达到0.5毫米,但是很慢. Haversine公式半正矢公式,比vincenty快,精度没有vincenty高,也长使用. --------------------- ...

  4. Spring IOC (DI-依赖注入)

    看到一篇文章,讲Spring的依赖注入讲的很好理解,也很容易理解,非常详细.原文地址: https://blog.csdn.net/javazejian/article/details/5456130 ...

  5. Netty高性能web框架

    框架背景: 前期为公司项目做全链路压测,发现公司跑到tomcat上的服务,即使是最简单的方法QPS也就到3000左右,后期查询发现可能和tomcat的业务逻辑有关. 因为以前在项目开发中用netty做 ...

  6. Spring Boot框架搭建

    用idea搭建Springboot还是很方便的 环境变量是JDK1.8 SpringBoot自带了Tomcat启动也很方便 1.创建项目 2. 3.选择SpringBoot的版本以及组件 4.创建完成 ...

  7. 算法之水仙花数(Java语言)

    概述 在数论中,水仙花数(Narcissistic number),也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿姆斯 ...

  8. MySQL复制报错(Slave failed to initialize relay log info structure from the repository)

    机器重启以后,主从出现了问题,具体报错信息: Slave failed to initialize relay log info structure from the repository 解决方案: ...

  9. MySQL 8.0复制性能的提升(翻译)

    What’s New With MySQL Replication in MySQL 8.0 MySQL复制从问世到现在已经经历了多个年头,它的稳定性和可靠性也在稳步的提高.这是一个不停进化的过程,由 ...

  10. Python学习---django知识补充之CBV

    Django知识补充之CBV Django: url    -->  def函数      FBV[function based view]  用函数和URL进行匹配 url    --> ...