百度地图简单入门

1,110 阅读10分钟

百度地图简单入门

JavaScript API GL

介绍:百度地图JavaScript API GL 是一套由JavaScript语言编写的应用程序接口,使用了WebGL对地图、覆盖物等进行渲染,支持3D视角展示地图。帮助开发者在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发。JavaScript API GL提供了丰富的功能接口,包括地图展示、定位、覆盖物、检索、路线规划等,适配多样化的业务场景。

JavaScript API GL与其他百度地图版本库区别

  • JavaScript API GL v1.0 是基于 WebGL 全新开发的地图 API 接口。为了方便开发者迁移升级,大部份接口向下兼容。目前 GL v1.0 版本接口包含了 3D 地图的渲染、基本控件、覆盖物。在后面的版本中,将对原 v2.0、v3.0 中的核心功能进行补全。

  • JavaScript API GL 版本对手机性能要求较高,不建议在移动端调用。若涉及移动端 JS 服务调用,请使用 JavaScript API Lite。

    Lite版专门针对移动端H5页面的使用场景,代码体积小,性能更好。但是不支持PC浏览器

  • JavaScript API GL v1.0 基于 WebGL 开发,对于用户的浏览器环境有兼容性要求。需要完整支持 WebGL 的现代浏览器来支持渲染。对于 WebGL 支持欠佳的浏览器会降级为 Canvas 绘制,若仍然存在兼容性问题,则会降级到瓦片图渲染。确保不同浏览器环境的用户都可以完成地图的基本渲染。

JavaScript API GL创建地图

// html
<div ref="allmap01" id="allmap1"></div>
​
// js
this.ownMap = new BMapGL.Map('allmap1');
// 创建点坐标
this.ownMap.centerAndZoom('上海市', 11);

变更地图类型

控制地图显示的类型

this.ownMap.setMapType(BMAP_EARTH_MAP);      // 设置地图类型为地球模式

地图类型常量:

1.标准地图:BMAP_NORMAL_MAP 2.地球模式:BMAP_EARTH_MAP 3.普通卫星地图:BMAP_SATELLITE_MAP

JavaScript API GL常见控件

  • new BMapGL.ScaleControl() // 默认位于地图左下方,显示地图的比例关系

  • new BMapGL.ZoomControl() // 默认位于地图右下方,控制地图级别的缩放

  • new BMapGL.NavigationControl3D() // 默认位于地图右上方,控制地图3D模式

  • new BMapGL.CityListControl() // 默认位于地图左上方,用于进行城市选择定位

    控制控件位置

    anchor值位置说明
    BMAP_ANCHOR_TOP_LEFT表示控件定位于地图的左上角
    BMAP_ANCHOR_TOP_RIGHT表示控件定位于地图的右上角
    BMAP_ANCHOR_BOTTOM_LEFT表示控件定位于地图的左下角
    BMAP_ANCHOR_BOTTOM_RIGHT表示控件定位于地图的右下角

    控件位置偏移

使用场景:使用多个控件可能会重叠在一起,这时就可以通过偏移值使二者分开显示。

this.ownMap = new BMapGL.Map('allmap1');
// 创建点坐标
this.ownMap.centerAndZoom('上海市', 11);
this.ownMap.addControl(new BMapGL.ScaleControl()); // 添加比例尺控件
this.ownMap.addControl(new BMapGL.ZoomControl()); // 添加缩放控件
this.ownMap.addControl(new BMapGL.NavigationControl3D()); // 添加3D空间this.ownMap.addControl(new BMapGL.CityListControl({
  // 控件的停靠位置(可选,默认左上角)
  anchor: BMAP_ANCHOR_TOP_LEFT,
  // 控件基于停靠位置的偏移量(可选)
  offset: new BMapGL.Size(10, 5)
})); // 添加城市列表空间

常用地图api使用

  • zoomIn()
  • zoomOut()
  • getZoom()
  • setZoom(level) // 设置地图级别
  • panTo() // 将地图的中心点更改为给定的点
  • flyTo() // 飞到指定的中心点和级别,提供给定位缩放地图使用
  • getCenter()
  • setCenter()
api名称api说明
zoomIn()放大一级视图
zoomOut()缩小一级视图
getZoom()返回地图当前缩放级别
setZoom(level)将视图切换到指定的缩放等级,中心点坐标不变。
panTo(level)将地图的中心点更改为给定的点,跳转到指定中心点进行渲染。
getCenter(level)返回矩形的中心点
setCenter(level)设置圆形的中心点坐标
flyTo(center,level)飞到指定的中心点和级别,提供给定位缩放地图使用

注意:

在JavaScript API GL同时使用panTo()setCenter()时,setCenter方法会实效 只能缩放地图级别,不能设置地图中心点,但是在v3.0是可以使用的

这时候可以使用flyTo()

获取省市区范围

BMapGL.Boundary()

var bd = new BMapGL.Boundary();
bd.get('浦东新区', (rs) => {
  console.log('rs', rs)
  this.Overlay = new BMapGL.Polygon(rs.boundaries, {
    fillColor: 'blue',
    fillOpacity: 0.2
  });
  this.ownMap.addOverlay(this.Overlay);
});
​

覆盖物的使用方法

创建覆盖物点

const point = new BMapGL.Point(lng, lat); // 创建点
const marker = new BMapGL.Marker(point); // 创建覆盖物
this.ownMap.addOverlay(marker); // 将覆盖物添加进地图

1、覆盖物的创建方法

BMapGL.Marker(point,<opts>)

属性类型描述
offsetSize标注的位置偏移值
iconIcon标注所用的图标对象
enableMassClearBoolean是否在调用map.clearOverlays清除此覆盖物,默认为true
enableDraggingBoolean是否启用拖拽,默认为false

2、覆盖物的方法

方法返回值描述
disableMassClearnone禁止覆盖物在map.clearOverlays方法中被清除
enableMassClearnone允许覆盖物在map.clearOverlays方法中被清除
addEventListener(event: String, handler: Function)none添加事件监听函数
removeEventListener(event: String, handler: Function)none移除事件监听函数

3、添加自定义图标

new BMapGL.Icon(图片地址, 偏移值);

var myIcon = new BMapGL.Icon(this.icon, new BMapGL.Size(30, 30));
const point = new BMapGL.Point(121.47918, 31.23916);
var marker = new BMapGL.Marker(
  point,
  {
    icon: myIcon // myIcon 图标对象
  }
);
marker.id="haha" // 给覆盖物添加自定义属性 可以再点击事件中获取
this.ownMap.addOverlay(marker);

创建覆盖物点线面

1、创建线

Polyline(points: Array[Point], opts[PolylineOptions])

points:点的数组

opts属性

属性类型描述
strokeColorString折线颜色
strokeWeightNumber折线的宽度,以像素为单位
strokeOpacityNumber折线的透明度,取值范围0 - 1
strokeStyleString折线的样式,solid或dashed
enableMassClearBoolean是否在调用map.clearOverlays清除此覆盖物,默认为true
enableEditingBoolean是否启用线编辑,默认为false
enableClickingBoolean是否响应点击事件,默认为true

Polyline的方法

方法返回值描述
setPath(path: Array< [Point ]>)none设置折线的点数组
getPath()Array< [Point ]>返回折线的点数组
enableEditing()none开启编辑功能
disableEditing()none关闭编辑功能
enableMassClear()none允许覆盖物在map.clearOverlays方法中被清除
disableMassClear()none禁止覆盖物在map.clearOverlays方法中被清除
addEventListener(event: String, handler: Function)none添加事件监听函数
removeEventListener(event: String, handler: Function)none移除事件监听函数
// 创建点标记
var polyline = new BMapGL.Polyline([
  Point,
  Point,
  Point
], {
  strokeColor: 'blue',
  strokeWeight: 2,
  strokeOpacity: 0.5,
  enableEditing: true
});
this.ownMap.addOverlay(polyline); // 增加折线

2、创建圆

Circle(point, radius, opts[PolylineOptions])

// 创建圆
var circle = new BMapGL.Circle(point, 5000, {
  strokeColor: 'blue',
  strokeWeight: 2,
  strokeOpacity: 0.5
});
this.ownMap.addOverlay(circle); // 增加折线

opts属性

属性类型描述
strokeColorString圆形边线颜色
fillColorString圆形填充颜色。当参数为空时,圆形将没有填充效果
strokeWeightNumber圆形边线的宽度,以像素为单位
strokeOpacityNumber圆形边线透明度,取值范围0 - 1
fillOpacityNumber圆形填充的透明度,取值范围0 - 1
strokeStyleString圆形边线的样式,solid或dashed
enableMassClearBoolean是否在调用map.clearOverlays清除此覆盖物,默认为true
enableEditingBoolean是否启用线编辑,默认为false
enableClickingBoolean是否响应点击事件,默认为true

3、创建多边形

Polygon(points: Array, opts:[PolygonOptions])

points:点的数组

opts属性

属性类型描述
strokeColorString边线颜色
fillColorString填充颜色。当参数为空时,折线覆盖物将没有填充效果
strokeWeightNumber边线的宽度,以像素为单位
strokeOpacityNumber边线透明度,取值范围0 - 1
fillOpacityNumber填充的透明度,取值范围0 - 1
strokeStyleString边线的样式,solid或dashed
enableMassClearBoolean是否在调用map.clearOverlays清除此覆盖物,默认为true
enableEditingBoolean是否启用线编辑,默认为false
enableClickingBoolean是否响应点击事件,默认为true

Polygon方法

方法返回值描述
setPath(path: Array< [Point ]>)none设置折线的点数组
getPath()Array< [Point ]>返回折线的点数组
enableEditing()none开启编辑功能
disableEditing()none关闭编辑功能
enableMassClear()none允许覆盖物在map.clearOverlays方法中被清除
disableMassClear()none禁止覆盖物在map.clearOverlays方法中被清除
addEventListener(event: String, handler: Function)none添加事件监听函数
removeEventListener(event: String, handler: Function)none移除事件监听函数
var rectangle = new BMapGL.Polygon([
  Point,
  Point,
  Point
], {
  strokeColor: 'blue',
  strokeWeight: 2,
  strokeOpacity: 0.5
});
this.ownMap.addOverlay(rectangle);

4、创建镂空面

var bd = new BMapGL.Boundary();
      bd.get('浦东新区', (rs) => {
        console.log('rs', rs)
          // 比较坑的一点事 最后一个坐标点不要加分号
          rs.boundaries.push("121.63217620887306,31.229207634496976; 121.64712401255909,31.229701693177855;121.64712401255909,31.213890521597296; 121.63562570203138,31.209937311397614; 121.63505078650499,31.218337683561668; 121.6344758709786,31.22377281683927; 121.63217620887306,31.229207634496976")
          rs.boundaries.push("121.40551238398308,31.234446824188662; 121.47277750057023,31.229506370548492; 121.44460663977732,31.206282744471732; 121.40551238398308,31.234446824188662 ")
          var hole = new BMapGL.Polygon(rs.boundaries, {
              fillColor: 'blue',
              fillOpacity: 0.2
          });
          this.ownMap.addOverlay(hole);
          hole.addEventListener('click', () => {
            console.log('我点击了');
          })
      });

注意:

points 可以是传入数组Point, 传入的数组经纬度组成的字符串集合

传入数组 如果是有重合面 将会镂空显示

字符串集合最后一个坐标点不要加分号

5、添加地面覆盖物

GroundOverlay(bounds:[Bounds], opts:[GroundOverlayOptions])

创建地面叠加层

var bounds = new BMapGL.Bounds(new BMapGL.Point(121.48239239690646, 31.238691477042632), new BMapGL.Point(121.4840395315516, 31.237987014135086));
// 创建地面叠加层实例
var imgOverlay = new BMapGL.GroundOverlay(bounds, {
  type: 'image',
  url: icon,
  opacity: 1,
});
// 叠加层添加到地图
this.ownMap.addOverlay(imgOverlay);

可编辑覆盖物

使用DrawingManager库

引入:

<link href="//mapopen.cdn.bcebos.com/github/BMapGLLib/DrawingManager/src/DrawingManager.min.css" rel="stylesheet">
<script type="text/javascript" src="//mapopen.cdn.bcebos.com/github/BMapGLLib/DrawingManager/src/DrawingManager.min.js"></script>

BMapGLLib.DrawingManager(map, opts)

map: 地图对象

opts属性

属性类型描述
enableDrawingToolBoolean是否显示工具栏
enableCalculateBoolean绘制是否进行测距(画线时候)、测面(画圆、多边形、矩形)
enableSorptionBoolean是否开启边界吸附功能
drawingToolOptionsObject工具栏的配置
sorptionDistanceNumber边界吸附距离
enableGpcBoolean是否开启延边裁剪功能
enableLimitBoolean是否开启超限提示
limitOptionsObject是否启用线编辑,默认为false
enableClickingBoolean是否响应点击事件,默认为true
circleOptionsObject圆的样式
polylineOptionsObject线的样式
polygonOptionsObject多边形的样式
rectangleOptionsObject矩形的样式

DrawingManager方法

方法返回值描述
addEventListener('overlaycomplete', handler: Function)none添加鼠标绘制工具监听事件,用于获取绘制结果
var styleOptions = {
      strokeColor: '#5E87DB', // 边线颜色。
      fillColor: '#5E87DB', // 填充颜色。当参数为空时,圆形将没有填充效果。
      strokeWeight: 2, // 边线的宽度,以像素为单位。
      strokeOpacity: 1, // 边线透明度,取值范围0 - 1。
      fillOpacity: 0.2 // 填充的透明度,取值范围0 - 1。
    };
​
    // 实例化鼠标绘制工具
    this.drawingManager = new BMapGLLib.DrawingManager(this.ownMap, {
      // isOpen: true, //是否开启绘制模式
      enableDrawingTool: true, // 是否显示工具栏
      enableCalculate: true, // 绘制是否进行测距(画线时候)、测面(画圆、多边形、矩形) 
      drawingToolOptions: {
        enableTips: true,
        customContainer: 'selectbox_Drawing',
        hasCustomStyle: true,
        anchor: BMAP_ANCHOR_TOP_RIGHT,
        offset: new BMapGL.Size(15, 15), // 偏离值
        scale: 1, // 工具栏缩放比例
        drawingModes: [
          BMAP_DRAWING_MARKER,
          BMAP_DRAWING_POLYLINE,
          BMAP_DRAWING_RECTANGLE,
          BMAP_DRAWING_POLYGON,
          BMAP_DRAWING_CIRCLE,
        ]
      },
      enableSorption: true, // 是否开启边界吸附功能
      sorptionDistance: 20, // 边界吸附距离
      enableGpc: true, // 是否开启延边裁剪功能
      enableLimit: true,  // 是否开启超限提示
      limitOptions: {
        area: 50000000, // 面积超限值
        distance: 30000
      },
      circleOptions: styleOptions, // 圆的样式
      polylineOptions: styleOptions, // 线的样式
      polygonOptions: styleOptions, // 多边形的样式
      rectangleOptions: styleOptions, // 矩形的样式
    });
    //添加鼠标绘制工具监听事件,用于获取绘制结果
    this.drawingManager.addEventListener('overlaycomplete', this.getPoint);
​

电子围栏

判断是否在目标覆盖物内

引入:

<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>

BMapGLLib.GeoUtils.isPointInPolygon(point, Overlay)

point 目标点

Overlay 目标覆盖物

var result = BMapGLLib.GeoUtils.isPointInPolygon(point, this.Overlay);
console.log('result', result)
console.log(result)
if (result == true) {
  alert('点在多边形内');
  const marker = new BMapGL.Marker(point);
​
  this.ownMap.addOverlay(marker);
}
else {
  alert('点在多边形外');
}

路书

引入:

<script type="text/javascript" src="//bj.bcebos.com/v1/mapopen/github/BMapGLLib/Lushu/src/Lushu.min.js"></script>
  • BMapGLLib.DrawingManager(map, opts)

    通过传入起始点和终点生成两点之间路径

    opts属性

    属性类型描述
    onSearchCompleteFunction回调生成导航信息

    DrawingManager方法

    方法名返回值描述
    search(startPoint, endPoint)null传入起始点和终点 onSearchComplete生成导航信息
  • BMapGLLib.LuShu(map, points: Array, opts)

    points 点的数组

opts属性

属性类型描述
defaultContentString信息窗口文案
autoViewBoolean是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
speedNumber移动速度
iconIcon路书图片
enableRotationBoolean是否设置marker随着道路的走向进行旋转

LuShu方法

方法名返回值描述
startnull开始移动
stopnull停止移动
pausenull暂停移动
hideInfoWindownull隐藏提示框
showInfoWindownull显示提示框
this.drv = new BMapGL.DrivingRoute(this.ownMap, {
  onSearchComplete: (res) => {
    console.log('this.drv.getStatus()', res, this.drv.getStatus(), BMAP_STATUS_SUCCESS)
    if (this.drv.getStatus() == BMAP_STATUS_SUCCESS) {
      var plan = res.getPlan(0);
      console.log('时间:', plan.getDuration(true))
      console.log('总里程:', plan.getDistance(true))
      for (var j = 0; j < plan.getNumRoutes(); j++) {
        var route = plan.getRoute(j);
        this.arrPois = route.getPath()
      }
      this.ownMap.addOverlay(new BMapGL.Polyline(this.arrPois, { strokeColor: '#111' }));
      this.ownMap.setViewport(this.arrPois); // 控制地图窗口
      this.createLuShu()
    }
  }
});
var start = new BMapGL.Point(121.4086479847669, 31.269285495550122);
var end = new BMapGL.Point(121.5592342387356, 31.217970134573644);
this.drv.search(start, end);
​
​
​
createLuShu() {
  //飞机图片
  const fly = img;
​
  this.lushu = new BMapGLLib.LuShu(this.ownMap, this.arrPois, {
    defaultContent: '出发了', // "信息窗口文案"
    autoView: true, // 是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
    speed: 1500,
    // icon: new BMapGL.Icon('./images/car.png', new BMapGL.Size(32, 32), { anchor: new BMapGL.Size(10, 10) }),
    icon: new BMapGL.Icon(fly, new BMapGL.Size(48, 48), { anchor: new BMapGL.Size(24, 24) }),
    enableRotation: true, // 是否设置marker随着道路的走向进行旋转
  });
},
start() {
  this.lushu.start();
},
stop() {
  this.lushu.stop();
},
pause() {
  this.lushu.pause();
},
hideInfo() {
  this.lushu.hideInfoWindow();
},
showInfo() {
  this.lushu.showInfoWindow();
},
​

遇到问题

  • 地图偏移

    // html
    <div ref="allmap08" id="allmap8"></div>
    ​
    // css
    #allmap8 {
      height: 80vh;
      width: 90vw;
      transform: translate(100px, 10px);
    }
    

    html在渲染的时候不能使用css的transform,会导致地图中心点偏移

    在element-iu,dialog弹框使用地图就会遇到这样的问题,需要修改dialog的css样式