本文介绍如何在Web前端利用百度地图API实现地图展示、添加自定义点位及信息窗口,并重点讲解如何唤起百度地图App进行导航。内容涵盖天地图与百度地图的选择、地图初始化、覆盖物添加以及获取用户位置并跳转导航的完整代码实现,针对PC端、Android和iOS不同平台的位置精度差异提供了具体解决方案。
一、需求
前端开发中常需集成地图展示功能,常用的地图服务包括天地图和百度地图,开发者可访问各自官网获取相关资源进行开发。
1.天地图:天地图API

开发者可依据类参考文档或提供的代码示例来构建地图应用。
2.百度地图:jspopularGL | 百度地图API SDK

开发流程包括申请密钥、展示地图以及参考官方demo进行实现。
前端需求通常涉及地图展示、添加地址点位(需获取经纬度并渲染至地图),以及点击点位后跳转至App或官网。此处选用百度地图,因为天地图暂不提供导航服务。
接下来我们将具体实现上述需求。
二、展示地图
HTML代码:
<div class="map" id="map">
</div>其中id为map的div是地图容器,必须为其设置明确的宽度和高度,否则地图无法显示。
CSS代码:
.map{
width: 100%;
height: 100vh;
}
.map .anchorBL {
display: none;
}其中.anchorBL类用于控制百度地图的水印显示,此处将其隐藏,水印样式如图所示:

JS代码:
getMap();
var map;
//展示地图
function getMap(){
map = new BMapGL.Map('map');
var center = new BMapGL.Point(106.639958,26.645316);
map.centerAndZoom(center, 13);
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
map.enableScrollWheelZoom(true);
map.setMapType(BMAP_SATELLITE_MAP);//设置地图类型为普通卫星地图模式
var scaleCtrl = new BMapGL.ScaleControl(); // 添加比例尺控件
var zoomCtrl = new BMapGL.ZoomControl(); // 添加缩放控件
map.addControl(scaleCtrl);
}需注意调用map.setMapType(BMAP_SATELLITE_MAP)以设置地图类型为普通卫星地图模式。
运行结果:

三、添加点覆盖物
let address = [
{
name:'地址一',
lng:106.641252,
lat:26.652775
},
{
name:'地址二',
lng:106.629753,
lat:26.637856
}
];
//添加位置标识
address.forEach((v,k)=>{
addMaker1(v,v.name,-100,-60,'button')
})
function addMaker1(point,name,x,y,button) {
// 创建图标
var myIcon = new BMapGL.Icon("image/pointer.png", new BMapGL.Size(30, 39));
var pointer = new BMapGL.Point(point.lng,point.lat);
var marker = new BMapGL.Marker(pointer, {
icon: myIcon
});
map.addOverlay(marker);
}
运行结果:

四、添加信息窗口(需展示地址名称)
function addMaker1(point,name,x,y,button) {
//...添加点
var opts = {
position: new BMapGL.Point(point.lng,point.lat), // 指定文本标注所在的地理位置
offset: new BMapGL.Size(x,y) // 设置文本偏移量
};
// 创建文本标注对象
let string = `<div style="display: flex;align-items: center">${name}<img class="${button}" style="width: 30px;margin-left: 10px" src="image/logo.png"/></div>`
var label = new BMapGL.Label(string, opts);
// 自定义文本标注样式
label.setStyle({
color: 'black',
borderRadius: '5px',
borderColor: '#ccc',
padding: '5px',
fontSize: '14px',
height: '30px',
lineHeight: '30px',
fontFamily: '微软雅黑'
});
map.addOverlay(label)
var opts = {
width: 100, // 信息窗口宽度
height: 24, // 信息窗口高度
// title: "故宫博物院", // 信息窗口标题
}
label.addEventListener("click",function () {
let lngNum ;
let latNum ;
function myFun(result){
//获取当前所在市的信息,主要为了pc端和ios系统获取不到精准位置用的
console.log(result)
lngNum = result.center.lng;
latNum = result.center.lat;
openBaiduMap(point.lng,point.lat,name,latNum,lngNum);//调起百度地图
}
var myCity = new BMapGL.LocalCity();
myCity.get(myFun);
console.log(latNum)
console.log(lngNum)
}
)
}点击信息窗口时,触发唤起百度地图的动作。
由于PC端和iOS系统难以获取精准位置,需通过var myCity = new BMapGL.LocalCity(); myCity.get(myFun);来获取大概范围(当前所在城市),result的打印内容如下:

运行结果:

五、唤起百度地图
//唤起百度地图
function openBaiduMap(lng, lat, address,lat11,lng11) {
var geolocation = new BMap.Geolocation();
// 开启定位控件
geolocation.enableSDKLocation();
geolocation.getCurrentPosition(function (result) {
var queryString;
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
console.log('11')
queryString = `origin=latlng:${result.point.lat},${result.point.lng}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
} else {
console.log('22')
queryString = `origin=latlng:${lat11},${lng11}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
// var queryString = `origin=latlng:28.238681,116.608768|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
}
var app_url = `baidumap://map/direction?${queryString}`;
var web_url = `http://api.map.baidu.com/direction?${queryString}®ion=中国&output=html`;
// https://map.baidu.com/dir/%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE/%E5%9C%B0%E5%9D%80%E4%B8%80/@11599509.985,3557925.135,7z?querytype=nav&sn=1$$$$12127997.03,4051196.53$$%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE$$$$$$&en=1$$$$11871379.04,3060815.7$$%E5%9C%B0%E5%9D%80%E4%B8%80$$$$$$&c=233&version=4&route_traffic=1&mrs=1&da_src=shareurl
//尝试唤起百度地图App
window.location.href = app_url;
//唤起失败打开Web版百度地图
var startTime = Date.now();
var count = 0;
var t = setInterval(function () {
if (++count < 30) {
return;
}
if (Date.now() - startTime > 800) {
clearInterval(t);
}
if (!(document.hidden || document.webkitHidden)) {
window.location.href = web_url;
// window.open(web_url,'_bank')//浏览器会拦截
}
}, 20);
window.onblur = function () {
clearInterval(t);
};
});
}在Android系统中,this.getStatus()返回BMAP_STATUS_SUCCESS,而在PC和iOS端则无法获取精准位置。
百度地图App将被打开,并从当前位置导航至所选位置,如图所示:
1.PC端:打开导航后位置可能不精准,但可通过鼠标拖动来调整路线。

2.Android:网页获取的当前位置精准,打开百度地图App后同样精准。

3.iOS:网页端仅能获取城市级位置,但打开百度地图App后定位是精准的。
六、完整代码
记得申请密钥哦!!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.map{
width: 100%;
height: 100vh;
}
.map .anchorBL {
display: none;
}
</style>
</head>
<body>
<div>
<div class="map" id="map">
</div>
</div>
<script type="text/javascript" src="jquery.min.js"></script>
<script src="http://api.map.baidu.com/api?v=3.0&ak=您的秘钥"></script>
<script src="http://api.map.baidu.com/api?type=webgl&v=1.0&ak=您的秘钥"></script>
<script type="text/javascript"src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<script type="text/javascript">
getMap();
var map;
//展示地图
function getMap(){
map = new BMapGL.Map('map');
var center = new BMapGL.Point(106.639958,26.645316);
map.centerAndZoom(center, 13);
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
map.enableScrollWheelZoom(true);
map.setMapType(BMAP_SATELLITE_MAP);//设置地图类型为普通卫星地图模式
var scaleCtrl = new BMapGL.ScaleControl(); // 添加比例尺控件
var zoomCtrl = new BMapGL.ZoomControl(); // 添加缩放控件
map.addControl(scaleCtrl);
}
let address = [
{
name:'地址一',
lng:106.641252,
lat:26.652775
},
{
name:'地址二',
lng:106.629753,
lat:26.637856
}
];
//添加位置标识
address.forEach((v,k)=>{
addMaker1(v,v.name,-100,-60,'button')
})
function addMaker1(point,name,x,y,button) {
// 创建图标
var myIcon = new BMapGL.Icon("image/pointer.png", new BMapGL.Size(30, 39));
var pointer = new BMapGL.Point(point.lng,point.lat);
var marker = new BMapGL.Marker(pointer, {
icon: myIcon
});
map.addOverlay(marker);
var opts = {
position: new BMapGL.Point(point.lng,point.lat), // 指定文本标注所在的地理位置
offset: new BMapGL.Size(x,y) // 设置文本偏移量
};
// 创建文本标注对象
let string = `<div style="display: flex;align-items: center">${name}<img class="${button}" style="width: 30px;margin-left: 10px" src="image/logo.png"/></div>`
var label = new BMapGL.Label(string, opts);
// 自定义文本标注样式
label.setStyle({
color: 'black',
borderRadius: '5px',
borderColor: '#ccc',
padding: '5px',
fontSize: '14px',
height: '30px',
lineHeight: '30px',
fontFamily: '微软雅黑'
});
map.addOverlay(label)
var opts = {
width: 100, // 信息窗口宽度
height: 24, // 信息窗口高度
// title: "故宫博物院", // 信息窗口标题
}
label.addEventListener("click",function () {
let lngNum ;
let latNum ;
function myFun(result){
console.log(result)//获取当前所在市的信息,主要为了pc端和ios系统获取不到精准位置用的
lngNum = result.center.lng;
latNum = result.center.lat;
openBaiduMap(point.lng,point.lat,name,latNum,lngNum);//调起百度地图
}
var myCity = new BMapGL.LocalCity();
myCity.get(myFun);
}
)
}
//唤起百度地图
function openBaiduMap(lng, lat, address,lat11,lng11) {
var geolocation = new BMap.Geolocation();
// 开启定位控件
geolocation.enableSDKLocation();
geolocation.getCurrentPosition(function (result) {
var queryString;
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
console.log('11')
queryString = `origin=latlng:${result.point.lat},${result.point.lng}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
} else {
console.log('22')
queryString = `origin=latlng:${lat11},${lng11}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
// var queryString = `origin=latlng:28.238681,116.608768|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
}
var app_url = `baidumap://map/direction?${queryString}`;
var web_url = `http://api.map.baidu.com/direction?${queryString}®ion=中国&output=html`;
// https://map.baidu.com/dir/%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE/%E5%9C%B0%E5%9D%80%E4%B8%80/@11599509.985,3557925.135,7z?querytype=nav&sn=1$$$$12127997.03,4051196.53$$%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE$$$$$$&en=1$$$$11871379.04,3060815.7$$%E5%9C%B0%E5%9D%80%E4%B8%80$$$$$$&c=233&version=4&route_traffic=1&mrs=1&da_src=shareurl
//尝试唤起百度地图App
window.location.href = app_url;
//唤起失败打开Web版百度地图
var startTime = Date.now();
var count = 0;
var t = setInterval(function () {
if (++count < 30) {
return;
}
if (Date.now() - startTime > 800) {
clearInterval(t);
}
if (!(document.hidden || document.webkitHidden)) {
window.location.href = web_url;
// window.open(web_url,'_bank')//浏览器会拦截
}
}, 20);
window.onblur = function () {
clearInterval(t);
};
});
}
</script>
</body>
</html>总结
到此这篇关于前端百度地图添加点并跳转到百度地图进行导航的文章就介绍到这了,更多相关前端百度地图添加点跳进行导航内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!