百度地图JSAPI学习笔记



前言

本次学习主要使用的是百度地图的JavascriptAPI用于前端项目,在浏览器中打开网页demo测试实现各个效果

一、注册 申请

使用百度地图前,需要先在百度地图开放平台注册,然后在控制台申请一个atk,本次因为是学习使用,所以申请的密钥用于浏览器端,如下图
在这里插入图片描述

二、 载入API

通过script标签载入百度地图API,类似于在线载入其他JS插件

 <script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=您的密钥">

第一章 基本使用

百度地图使用和许多JS插件一样,通过id对div进行覆盖,可以设置div所处的位置,css样式来选择地图的呈现样式

  //基本使用css样式
 html{height:100%} 
  body{height:100%;margin:0px;padding:0px}
  #container{
    margin:auto;
    height:500px;
    width:700px;
  } 

 //页面div
  <div id="container"></div>

创建地图,调用百度地图API的函数,生成一个地图实例对象

  var map = new BMapGL.Map("container");  //创建地图实例

初始化地图时需要提供地图中心点坐标,可以写城市名(如’北京’) ,也可以写经纬度坐标,官方文档特别说明了,在使用百度地图JavaScript API服务时,需使用百度BD09坐标,如使用其他坐标( WGS84、GCJ02)进行展示,需先将其他坐标转换为BD09,详细说明请参考坐标转换说明,请勿使用非官方的转换方法。

var point = new BMapGL.Point(116.331398,39.897445); //设置地图中心点坐标

有了地图实例和坐标,还需要初始化

map.centerAndZoom(point, 15);  //初始化地图,15为展示级别

只要上述代码,就可以在页面呈现一个基本的地图了,如果你想要给地图添加设置,如支持鼠标滚轮缩放,添加官方提供的地图控件等,可以查阅官方文档,添加对应的函数,

第二章 地图元素

地图元素主要通过两个方法来设置地图元素的显示隐藏

// map.setOptions({displayOptions: yourDisplayOptions})  
   // map.setDisplayOptions(yourDisplayOptions)

所以,当你想要对地图上的图标,文字说明,亦或是3d建筑物的显示隐藏有需求时,可以通过触发函数里调用上述两种方法之一来达成目的。
官网例子提供了示例,通过按钮触发函数,写法如下。

//script部分
 //本次demo使用第二种,可以直接设置poi属性
    //设置地图显示元素
    map.setDisplayOptions({
            poi: true       //初始化设置显示POI信息 
        })
    function showText() {
        map.setDisplayOptions({
            poiText: true    //显示POI
        })
    }
    function hideText() {
        map.setDisplayOptions({
            poiText: false   //关闭POI
        })
    }
    function showIcon() {
        map.setDisplayOptions({
            poiIcon: true   //显示图标
        })
    }
    function hideIcon() {
        map.setDisplayOptions({
            poiIcon: false   //关闭图标
        })
    }
    function show3Dbuild() {
        map.setDisplayOptions({
            building: true
        })
    }
    function hide3Dbuild() {
        map.setDisplayOptions({
            building: false
        })
    }
    //html部分
    <ul class="btn-wrap" style="z-index: 99;">
    <!-- poi Point of Interest  直译兴趣点,在地理系统中可以理解为地标信息点 -->
    <li class = "btn" onclick = "showText()">显示POI文字</li>
    <li class = "btn" onclick = "hideText()">隐藏POI文字</li>
    <li class = "btn" onclick = "showIcon()">显示POI的图标</li>
    <li class = "btn" onclick = "hideIcon()">隐藏POI的图标</li>
    <li class = "btn" onclick = "show3Dbuild()">显示3D建筑物</li>
    <li class = "btn" onclick = "hide3Dbuild()">隐藏3D建筑物</li>
  </ul>

第三章路线规划

第一步,获取坐标

坐标的获取有两种,你可以在百度地图的JS文档里看到地址解析,通过地址解析获取坐标,地址必须精确到街道,但是在大多数使用场景里,应该支持用户模糊搜索的,地址解析对地址的要求严苛,所以获取坐标可以采用另一种方式:localSearch本地检索,想要找到详细的对该方法的描述,在JS文档中找到类参考并点击,在类参考的视角动画内往下翻,即可找到localSearch,点击可以看到详细描述。以下是我在制作demo时创建的local实例。

 var local = new BMapGL.LocalSearch(map, {
		renderOptions:{map: map},  //结果呈现位置
        pageCapacity: 1,   //显示1个检索结果
        localResult:{city:'xx市'}  //限制检索的城市
	});

因为一次要检索两个地址的坐标,所以要将得到的俩个地址放在数组里传参,调用方法如下:

local.search([beginPos,endPos]);  //搜索起点,终点

在搜索完毕后的回调函数setSearchCompleteCallback里,可以对地址检索的结果进行操作,在这一步就可以通过searchResult获取地址检索到的起始点坐标,怎么存放这俩个坐标点有多种方法,这里我使用的csdn上一个大佬做两点距离折线时的方法,设置一个数组,将两个坐标依次存入数组

local.setSearchCompleteCallback((searchResult)=>{ 
 			var pois = new Array(); //存储poi
              for(var i=0;i<=1;i++){
                  //获取搜索结果
                  var poi = searchResult[i].getPoi(0);
                  //存储点
                  pois.push(poi.point);
                  //设置放大级别15,范围1-20
                  map.centerAndZoom(poi.point,15);
              }
      ....
   })

这时数组pois[0]就是起点坐标,pois[1]就是终点坐标,之后就可以利用这俩个坐标去做你想要的路线规划了

路线规划-驾车路线规划

驾车路线规划使用 BMapGL.DrivingRoute方法,因为需要做避免拥堵的案例,查找了类参考关于该方法的说明,找到了方案配置项,如下图
在这里插入图片描述
官方没有给调用的例子,但是在公交方案的例子中,有类似的写法可以参考,以下是我的代码:

<style>
  html{height:100%} 
  body{height:100%;margin:0px;padding:0px}
  #container{
    margin:auto;
    height:500px;
    width:700px;
  }
  
</style>
<script type="text/javascript" src="jquery.min.js"></script>
<!-- 在线载入百度地图API -->
<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=你的密钥"></script>
</script>
<body>
    输入您的起点:<input type="text" name="beginPos">
    输入您的终点:<input type="text" name="endPos">
   <input type="button" name="getPoint" value="点我获取路线">
   <select name="select_type" id="select_type">
    <option selected hidden disabled value="">选择出行方案</option>
    <option value="0">默认方案</option>
    <option value="1">避免拥堵</option>
   </select>
    <p id="result">路程</p>
    <p id="time">时间</p>
   <hr>
  <div id="container"></div>
<script>
    var map = new BMapGL.Map("container");  //创建地图实例
    map.centerAndZoom('城市名', 17);  //初始化地图,17为展示级别,直接以城市为中心点坐标
    map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
    $("input[name='getPoint']").bind('click',function(){  //点击按钮
        var beginPos=$("input[name='beginPos']").val();
        var endPos=$("input[name='endPos']").val();
        var local = new BMapGL.LocalSearch(map, {
          renderOptions:{map: map},
              pageCapacity: 1,   //显示1个检索结果
              localResult:{city:'城市名'}  //限制检索的城市

        });
        var selectedF = $("#select_type option:selected").val();
        if(beginPos!='' && endPos!=''  && selectedF!=''){  //输入不为空

          local.search([beginPos,endPos]);  //搜索起点,终点
          local.setSearchCompleteCallback((searchResult)=>{ //搜索后的回调函数
            var pois = new Array(); //存储poi
            for(var i=0;i<=1;i++){
                  //获取搜索结果
                  var poi = searchResult[i].getPoi(0);
                  //存储点
                  pois.push(poi.point);
                  //设置放大级别15,范围1-20
                  map.centerAndZoom(poi.point,15);
              }
            var output1,output2;
            var searchComplete = function (results){
                if (transit.getStatus() != BMAP_STATUS_SUCCESS){
                    return ;
                }
                var plan = results.getPlan(0);
                output1= plan.getDuration(true);                //获取时间   
                output2= plan.getDistance(true);             //获取距离
              }
            var routePolicy = [BMAP_DRIVING_POLICY_DEFAULT,BMAP_DRIVING_POLICY_AVOID_CONGESTION];
            var transit = new BMapGL.DrivingRoute(map, {renderOptions: {map: map},
                policy:0,
                onSearchComplete: searchComplete,
                onPolylinesSet: function(){        
                    setTimeout(function(){
                        document.getElementById("result").innerHTML = `总路程为${output2}`; //页面元素重新赋值
                        document.getElementById("time").innerHTML = `预计时间为${output1}`; //页面元素重新赋值
                    });
              }});
            map.clearOverlays();
            transit.search(pois[0],pois[1],routePolicy[selectedF]);  //通过坐标确定路线
          });
          
        }else{
          alert('请填写完整')
        }
    });  //绑定点击事件
    
 </script>
</body>

调用时控制台没有报错,不过默认和避免拥堵的路线显示是一样的,可能官方默认和避免拥堵的路线整合了,不知道具体原因,控制台没报错路线能显示就当成功了吧。

路线规划-公交规划

公交规划在官方提供的示例demo里有一个结果面板共用户使用,因为公交有多种线路,不同线路公交的路线自然不同,所以提供了结果面板供用户使用,点击每条公交线可以查看到具体的线路,和驾车规划一样,可以在生成实例时配置方案。关于公交结果面板相关的代码如下:

//html页面设置结果面板呈现的位置
  <p id="result"></p>
//js代码
 var transit = new BMapGL.TransitRoute(map, {
                renderOptions: {map: map, panel: 'result'},  //结果映射
                policy: 0,    
              });
 search(pois[0],pois[1],routePolicy[selectedF]);  
              function search(start,end,route){ 
                 transit.setPolicy(route);  //选项设置
                 transit.search(start,end);   //起始坐标查询
              }

路线规划-步行规划

步行规划的方法不需要坐标点提供,我猜想也是套用了本地搜索,用户在输入起始地址后,选择坐标点,将得到步行导航路线,同样有结果面板供用户使用,代码如下:

var walking = new BMapGL.WalkingRoute(map, {
            renderOptions: {map: map, panel: "result", autoViewport: true}
          });    //创建步行规划实例walking  ,  result为返回面板显示区的id
            walking.search(beginPos,endPos);

地铁路线

地铁图和之前的地图生成不一样,参照官方例子写的代码如下,因为我想要用户输入站点后再显示路线,所以地铁图初始化了两次,代码有些冗余,但是能跑,以后有机会再考虑优化:

<body>
    输入您的起点:<input type="text" name="beginPos">
    输入您的终点:<input type="text" name="endPos">
   <input type="button" name="getPoint" value="点我查看路线">
   <hr>
  <div id="container"></div>
  <hr>
   
<script>
    var subwayCityName = '武汉';
    var list = BMapSub.SubwayCitiesList;
    var subwaycity = null;
    for (var i = 0; i < list.length; i++) {
        if (list[i].name === subwayCityName) {
            subwaycity = list[i];
            break;
        }
    };
    //初始化地图
    var subway = new BMapSub.Subway('container', subwaycity.citycode);
    subway.setZoom(0.5);
    var zoomControl  = new BMapSub.ZoomControl({
        anchor: BMAPSUB_ANCHOR_BOTTOM_RIGHT,
        offset: new BMapSub.Size(10,100)
    });
    subway.addControl(zoomControl);
    $("input[name='getPoint']").bind('click',function(){  //点击按钮
        var beginPos=$("input[name='beginPos']").val();
        var endPos=$("input[name='endPos']").val();
        if(beginPos!='' && endPos!=''){  //输入不为空
          // 获取武汉地铁数据-初始化地铁图
          var subway = new BMapSub.Subway('container', subwaycity.citycode);
          var zoomControl  = new BMapSub.ZoomControl({
              anchor: BMAPSUB_ANCHOR_BOTTOM_RIGHT,
              offset: new BMapSub.Size(10,100)
          });
          subway.addControl(zoomControl);
          subway.addEventListener('subwayloaded', function() {
              var drct = new BMapSub.Direction(subway);
              drct.search(beginPos,endPos);
          });
        }else{
          alert('请填写完整')
        }
    });  //绑定点击事件
    
 </script>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值