百度地图JavaScript集成(BMapGL)

1,275 阅读4分钟

一,百度地图api密钥获取

进入这个 百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 网址后,点击右上角的登录,用自己的百度账号进行登录,登录后可以进入api控制台。(如果没有注册为开发者需要注册认证完即可),然后单击创建应用按钮。

屏幕截图 2023-11-01 102402_LI.jpg

屏幕截图 2023-11-01 102527_LI.jpg

屏幕截图 2023-11-01 102929.jpg

填写好应用名称,选择应用类型为浏览器端,选择使用ip白名单校验方式进行校验。在ip白名单的文本框中填写0.0.0.0/0(或者*号),表示不对ip做任何限制。单击提交,即可在api控制台看到自己创建的AK,就是api请求串的必填参数。

有一点注意的是,未认证(个人或企业)的情况下,每个账号一天最多只有2000次调用额,如果认证了,每个账号每天有10万次调用额。

二,开始使用

1.显示地图

在网页中开始引入js地图脚本

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

请注意有点地方是使用的BMap而不是web网站的BMapGL,在用法上有略微不同,请使用者自行查询BMap相关使用功能,在此只推荐和示例使用BMapGL

然后为地图划分一块区域显示,并为其添加基本的功能

<!-- 页面内的元素 -->
<div id="map" style="height: 360px;width: 720px"></div>
<!-- 脚本信息 -->
<script type="text/javascript">
  var map = new BMapGL.Map("map");
  // 以天安门坐标为镜头中心,12级市级显示地址,必须赋值,范围3-19级
  var camera = new BMapGL.Point(116.404, 39.915);
  map.centerAndZoom(camera,12);
</script>

2.地图经纬标注

在上个示例中,camera已经是一个地址信息了,只不过是镜头的中心,现在需要为其标点

<!-- 页面内的元素 -->
<div id="map" style="height: 360px;width: 720px"></div>
<!-- 脚本信息 -->
<script type="text/javascript">
  var map = new BMapGL.Map("map");
  // 以天安门坐标为镜头中心,12级市级显示地址,必须赋值,范围3-19级
  var camera = new BMapGL.Point(116.404, 39.915);
  map.centerAndZoom(camera,12);
  var point = new BMapGL.Point(116.404, 39.915);
  var marker = new BMapGL.Marker(point);        // 创建标注
  map.addOverlay(marker);                     // 将标注添加到地图中
</script>

此时页面内如下所示

2F2R6OE7R9C214FDK653L7NGKC.png

3. 地图文本标注

在当地搜索地址信息,全部标注在地图上

<!-- 页面内的元素 -->
<div id="map" style="height: 360px;width: 720px"></div>
<!-- 脚本信息 -->
<script type="text/javascript">
    var map = new BMapGL.Map("map");
    // 以天安门坐标为镜头中心,12级市级显示地址,必须赋值,范围3-19级
    var camera = new BMapGL.Point(116.404, 39.915);
    map.centerAndZoom(camera,12);
    // 在镜头所在当地搜索一个地址,标注在地图上
    var local = new BMapGL.LocalSearch(map, {
        renderOptions: { map: map }
    })
    local.search('医院')
</script>

效果如下图所示

3BS0G7CE106H1UDHT6ISFLT4FU.png

实现输入框搜索选择第一项的功能,添加类似于上图的提示框

<!-- 页面内的元素 -->
<input type="text" id="localSearch"/><button type="button" onclick="search()">搜索</button>
<div id="map" style="height: 360px;width: 720px"></div>
<!-- 脚本信息 -->
<script type="text/javascript">
    var map = new BMapGL.Map("map");
    // 以天安门坐标为镜头中心,12级市级显示地址,必须赋值,范围3-19级
    var camera = new BMapGL.Point(116.404, 39.915);
    map.centerAndZoom(camera,12);
    function search() {
        var value=document.getElementById('localSearch').value
        map.clearOverlays() //清除当前已有的标点
        // 在镜头所在当地搜索一个地址,标注在地图上
        var local = new BMapGL.LocalSearch(map, {
          	// renderOptions: { map: map },
            onSearchComplete: function (res) {
                var poiInfo=res.getPoi(0)
                // console.log(poiInfo) 打印返回的数据结构
                var marker = new BMapGL.Marker(poiInfo.point);        // 创建标注
                map.setCenter(poiInfo.point)  //设置中心点
                map.addOverlay(marker);                     // 将标注添加到地图中
                var opts = {
                    width : 200,     // 信息窗口宽度
                    height: 100,     // 信息窗口高度
                    title : poiInfo.title , // 信息窗口标题
                }
                var infoWindow = new BMapGL.InfoWindow("地址:"+poiInfo.address, opts);  // 创建信息窗口对象
                marker.addEventListener("click", function() {
                    map.openInfoWindow(infoWindow, poiInfo.point); //开启信息窗口
                })
            }
        })
        local.search(value)
    }
</script>

效果如下图所示

2R9VLA529KTUJQHDEK9OV2EAH3.png

4. 点击地图返回标注信息

Geocoder包含了地址的解析和逆解析
地址解析是指,由详细到街道的结构化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”,“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
逆地址解析是指,由百度经纬度信息得到结构化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。

注意:
1.因为Geocoding和反Geocoding使用的门址数据以及算法都不是一样的,所以会出现不能一一对应的现象。
2.解析过程中可能会出现一对坐标值对应多个地址门牌信息,本接口将返回距离坐标点最近的一个地址门牌信息。

<!-- 页面内的元素 -->
<input type="text" id="localSearch"/>
<div id="map" style="height: 360px;width: 720px"></div>
<!-- 脚本信息 -->
<script type="text/javascript">
    var map = new BMapGL.Map("map");
    // 以天安门坐标为镜头中心,12级市级显示地址,必须赋值,范围3-19级
    var camera = new BMapGL.Point(116.404, 39.915);
    map.centerAndZoom(camera,12);
    map.addEventListener('click', function(e) {
        // console.log(e)
        // console.log(e.latlng)
        var point = new BMapGL.Point(e.latlng.lng,e.latlng.lat);
        var geolocation = new BMapGL.Geocoder(); 
        //进行逆解析
        geolocation.getLocation(point,function (data) {
            // console.log(data)
            document.getElementById('localSearch').value=data.address
        })
        map.clearOverlays()
        var marker = new BMapGL.Marker(point);
        map.setCenter(point)
        map.addOverlay(marker);
    });
</script>

5. 建议添加的相关组件

此类组件不添加不影响使用,在地图上显示额外的控件

map.addControl(new BMapGL.NavigationControl3D()); //3D控件
map.addControl(new BMapGL.ScaleControl()); //比例尺显示控件
map.addControl(new BMapGL.MapTypeControl()); //切换地图样式控件
map.addControl(new BMapGL.ZoomControl()); //加减号缩放控件
map.addControl(new BMapGL.CityListControl()); //城市选择控件
map.enableScrollWheelZoom(true); //滚轮缩放

三,链接文档

百度地图API SDK
lbsyun.baidu.com/index.php?t…
百度地图jsapi webgl 1.0类参考
lbsyun.baidu.com/cms/jsapi/r…
百度地图jsapi 示例中心
lbsyun.baidu.com/index.php?t…