{T}

JavaScript API

百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用。

版本说明

JavaScript API v3.0

经典版本,稳定可靠,适合传统Web应用。

html
<script src="https://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script>

JavaScript API GL v1.0

新一代WebGL版本,支持3D渲染、更流畅的动画效果。

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

版本特性对比

特性v3.0GL v1.0
2D渲染
3D渲染
倾斜/旋转
WebGL加速
海量点插件支持原生支持
自定义样式基础支持完整支持
兼容性IE9+现代浏览器

加载方式

同步加载

html
<script src="https://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script>
<script>
  var map = new BMap.Map('container');
</script>

异步加载

html
<script>
  window.initMap = function() {
    var map = new BMap.Map('container');
  };
</script>
<script src="https://api.map.baidu.com/api?v=3.0&ak=您的密钥&callback=initMap"></script>

按需加载模块

javascript
// 加载绘图工具库
BMap.loader.load('drawing', function() {
  var drawingManager = new BMapLib.DrawingManager(map);
});

// 加载热力图库
BMap.loader.load('heatmap', function() {
  var heatmapOverlay = new BMapLib.HeatmapOverlay();
});

API参考

Map类

构造函数

javascript
new BMap.Map(container, opts)
参数类型说明
containerString/HTMLElement地图容器元素或ID
optsMapOptions配置选项

MapOptions

属性类型默认值说明
enableMapClickBooleantrue是否开启地图点击热点
minZoomNumber3最小缩放级别
maxZoomNumber19最大缩放级别
mapTypeMapTypeBMAP_NORMAL_MAP地图类型

方法列表

方法参数返回值说明
centerAndZoom(center, zoom)Point, Number-初始化地图
setCenter(center)Point-设置中心点
getCenter()-Point获取中心点
setZoom(zoom)Number-设置缩放级别
getZoom()-Number获取缩放级别
setMapType(type)MapType-设置地图类型
getMapType()-MapType获取地图类型
addOverlay(overlay)Overlay-添加覆盖物
removeOverlay(overlay)Overlay-移除覆盖物
clearOverlays()--清除所有覆盖物
getOverlays()-Array获取所有覆盖物
addControl(control)Control-添加控件
removeControl(control)Control-移除控件
getBounds()-Bounds获取视野范围
setSize(size)Size-设置容器尺寸
getSize()-Size获取容器尺寸
panTo(point)Point-平移到指定点
panBy(x, y)Number, Number-平移指定像素
setViewport(points)Array-设置视野范围
enableDragging()--启用拖拽
disableDragging()--禁用拖拽
enableScrollWheelZoom()--启用滚轮缩放
disableScrollWheelZoom()--禁用滚轮缩放
addEventListener(event, handler)String, Function-添加事件监听
removeEventListener(event, handler)String, Function-移除事件监听

Point类

javascript
new BMap.Point(lng, lat)
属性类型说明
lngNumber经度
latNumber纬度

Marker类

javascript
new BMap.Marker(point, opts)

MarkerOptions

属性类型默认值说明
iconIcon-标注图标
offsetSize(0,0)偏移量
enableDraggingBooleanfalse是否可拖拽
raiseOnDragBooleanfalse拖拽时是否弹起
draggingCursorString-拖拽时光标样式
rotationNumber0旋转角度
shadowIcon-阴影图标
titleString-鼠标悬停提示

Marker方法

方法说明
setPosition(point)设置位置
getPosition()获取位置
setIcon(icon)设置图标
getIcon()获取图标
setRotation(angle)设置旋转角度
setAnimation(animation)设置动画
enableDragging()启用拖拽
disableDragging()禁用拖拽
addEventListener(event, handler)添加事件

Polyline类

javascript
new BMap.Polyline(points, opts)

PolylineOptions

属性类型默认值说明
strokeColorString#006600线颜色
strokeWeightNumber2线宽
strokeOpacityNumber0.8透明度
strokeStyleStringsolid线样式

Polygon类

javascript
new BMap.Polygon(points, opts)

PolygonOptions

属性类型默认值说明
strokeColorString#006600边框颜色
strokeWeightNumber2边框宽度
strokeOpacityNumber0.8边框透明度
fillColorString#006600填充颜色
fillOpacityNumber0.3填充透明度

InfoWindow类

javascript
new BMap.InfoWindow(content, opts)

InfoWindowOptions

属性类型默认值说明
widthNumber自动宽度
heightNumber自动高度
titleString-标题
enableAutoPanBooleantrue是否自动平移
enableCloseOnClickBooleantrue点击地图关闭

地图基础

创建地图实例

javascript
var map = new BMap.Map('container', {
  enableMapClick: false,
  minZoom: 3,
  maxZoom: 19
});

map.centerAndZoom(new BMap.Point(116.404, 39.915), 15);

地图方法详解

javascript
// 设置中心点
map.setCenter(new BMap.Point(116.404, 39.915));

// 平移地图
map.panTo(new BMap.Point(116.404, 39.915));
map.panBy(100, 100);

// 缩放地图
map.setZoom(15);
map.zoomIn();
map.zoomOut();

// 设置视野范围
var bounds = new BMap.Bounds(
  new BMap.Point(116.3, 39.9),
  new BMap.Point(116.5, 40.0)
);
map.setBounds(bounds);

// 根据点数组设置视野
var points = [point1, point2, point3];
map.setViewport(points, {
  margins: [50, 50, 50, 50]  // 上右下左边距
});

覆盖物详解

标注(Marker)

javascript
var marker = new BMap.Marker(point, {
  enableDragging: true,
  raiseOnDrag: true,
  draggingCursor: 'move'
});

marker.enableDragging();
marker.disableDragging();

marker.setPosition(newPoint);
marker.setIcon(icon);
marker.setAnimation(BMAP_ANIMATION_BOUNCE);

海量点(Massive Marker)

当需要展示大量标注时,使用海量点提升性能:

javascript
var points = [];
for (var i = 0; i < 10000; i++) {
  points.push({
    lng: 116.404 + Math.random() * 0.1,
    lat: 39.915 + Math.random() * 0.1
  });
}

var mass = new BMap.MassOverlay({
  points: points,
  icon: new BMap.Icon('marker.png', new BMap.Size(20, 20))
});
map.addOverlay(mass);

点聚合(MarkerClusterer)

javascript
var markers = [];
for (var i = 0; i < 100; i++) {
  var point = new BMap.Point(116.404 + Math.random(), 39.915 + Math.random());
  markers.push(new BMap.Marker(point));
}

var markerClusterer = new BMapLib.MarkerClusterer(map, {
  markers: markers,
  maxZoom: 15,           // 最大聚合级别
  gridSize: 60,          // 聚合网格大小
  styles: [{             // 自定义样式
    url: 'cluster.png',
    size: new BMap.Size(40, 40)
  }]
});

矢量覆盖物

javascript
var shape = new BMap.Shape(
  BMap.ShapeType.POLYGON,
  [
    new BMap.Point(116.387112, 39.920977),
    new BMap.Point(116.385243, 39.913063),
    new BMap.Point(116.394226, 39.917988)
  ],
  {
    strokeColor: 'blue',
    strokeWeight: 2,
    fillColor: 'red',
    fillOpacity: 0.3
  }
);
map.addOverlay(shape);

服务类详解

地点检索服务

javascript
var local = new BMap.LocalSearch(map, {
  renderOptions: {
    map: map,
    panel: 'results'
  },
  onSearchComplete: function(results) {
    console.log('搜索完成');
  }
});

local.search('餐厅');
local.searchNearby('餐厅', point, 1000);
local.searchInBounds('餐厅', map.getBounds());

LocalSearchOptions

属性类型说明
renderOptionsObject渲染选项
onSearchCompleteFunction搜索完成回调
onSearchMarkersSetFunction标注设置回调
onInfoWindowSetFunction信息窗口设置回调
onResultsHtmlSetFunction结果HTML设置回调
pageCapacityNumber每页结果数

搜索结果对象

javascript
local.search('餐厅', {
  onSearchComplete: function(results) {
    // results 为 LocalResult 对象
    var num = results.getCurrentNumPois();  // 当前页结果数
    var keyword = results.getKeyword();      // 搜索关键词
    
    for (var i = 0; i < num; i++) {
      var poi = results.getPoi(i);
      console.log('名称:', poi.title);
      console.log('地址:', poi.address);
      console.log('电话:', poi.phoneNumber);
      console.log('坐标:', poi.point);
      console.log('类型:', poi.type);
    }
  }
});

路线规划服务

驾车路线

javascript
var driving = new BMap.DrivingRoute(map, {
  renderOptions: {
    map: map,
    panel: 'route',
    autoViewport: true
  },
  policy: BMAP_DRIVING_POLICY_LEAST_TIME,
  onSearchComplete: function(results) {
    var plan = results.getPlan(0);
    console.log('距离:' + plan.getDistance() + '米');
    console.log('时间:' + plan.getDuration() + '秒');
  }
});

driving.search(startPoint, endPoint, {waypoints: [waypoint1, waypoint2]});
策略常量说明
BMAP_DRIVING_POLICY_LEAST_TIME最少时间
BMAP_DRIVING_POLICY_LEAST_DISTANCE最短距离
BMAP_DRIVING_POLICY_AVOID_HIGHWAYS避开高速

公交路线

javascript
var transit = new BMap.TransitRoute(map, {
  renderOptions: {map: map},
  policy: BMAP_TRANSIT_POLICY_LEAST_TIME
});

transit.search(startPoint, endPoint);
策略常量说明
BMAP_TRANSIT_POLICY_LEAST_TIME最少时间
BMAP_TRANSIT_POLICY_LEAST_TRANSFER最少换乘
BMAP_TRANSIT_POLICY_LEAST_WALKING最少步行
BMAP_TRANSIT_POLICY_AVOID_SUBWAYS不乘地铁

步行路线

javascript
var walking = new BMap.WalkingRoute(map, {
  renderOptions: {map: map}
});

walking.search(startPoint, endPoint);

骑行路线

javascript
var riding = new BMap.RidingRoute(map, {
  renderOptions: {map: map}
});

riding.search(startPoint, endPoint);

地理编码服务

地址解析

javascript
var geocoder = new BMap.Geocoder();

geocoder.getPoint('北京市海淀区上地十街10号', function(point) {
  if (point) {
    map.centerAndZoom(point, 16);
    map.addOverlay(new BMap.Marker(point));
  }
}, '北京市');

逆地址解析

javascript
geocoder.getLocation(point, function(result) {
  if (result) {
    console.log('地址:' + result.address);
    console.log('省份:' + result.addressComponents.province);
    console.log('城市:' + result.addressComponents.city);
    console.log('区县:' + result.addressComponents.district);
    console.log('街道:' + result.addressComponents.street);
    console.log('门牌号:' + result.addressComponents.streetNumber);
    
    // 周边POI
    if (result.surroundingPois) {
      result.surroundingPois.forEach(function(poi) {
        console.log('周边:', poi.title, poi.address);
      });
    }
  }
});

定位服务

javascript
var geolocation = new BMap.Geolocation();

geolocation.getCurrentPosition(function(result) {
  if (this.getStatus() === BMAP_STATUS_SUCCESS) {
    var point = result.point;
    map.centerAndZoom(point, 15);
    var marker = new BMap.Marker(point);
    map.addOverlay(marker);
    
    console.log('定位精度:', result.accuracy);
    console.log('地址:', result.address);
  } else {
    console.log('定位失败:', this.getStatus());
  }
}, {
  enableHighAccuracy: true,  // 高精度定位
  timeout: 10000             // 超时时间
});

定位状态码

状态常量说明
BMAP_STATUS_SUCCESS0成功
BMAP_STATUS_CITY_LIST1城市列表
BMAP_STATUS_UNKNOWN_LOCATION2未知位置
BMAP_STATUS_UNKNOWN_ROUTE3未知路线
BMAP_STATUS_INVALID_KEY4无效密钥
BMAP_STATUS_INVALID_REQUEST5无效请求
BMAP_STATUS_PERMISSION_DENIED6权限被拒绝
BMAP_STATUS_SERVICE_UNAVAILABLE7服务不可用
BMAP_STATUS_TIMEOUT8超时

事件详解

事件监听

javascript
var listener = map.addEventListener('click', function(e) {
  console.log(e.point);
});

map.removeEventListener('click', listener);

事件对象

javascript
map.addEventListener('click', function(e) {
  console.log('经度:' + e.point.lng);
  console.log('纬度:' + e.point.lat);
  console.log('像素坐标:' + e.pixel.x + ', ' + e.pixel.y);
  console.log('DOM事件:', e.domEvent);
});

自定义事件

javascript
var overlay = new BMap.Overlay();

overlay.addEventListener('customEvent', function(e) {
  console.log('自定义事件触发', e.data);
});

overlay.dispatchEvent(new BMap.Event('customEvent', {data: 'test'}));

WebGL版本特性

3D建筑

javascript
var map = new BMapGL.Map('container');
map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 15);

// 设置倾斜和旋转
map.setHeading(45);   // 旋转角度
map.setTilt(60);      // 倾斜角度

// 启用交互
map.enableRotate(true);
map.enableTilt(true);

3D覆盖物

javascript
// 3D棱柱
var prism = new BMapGL.Prism([
  new BMapGL.Point(116.387112, 39.920977),
  new BMapGL.Point(116.385243, 39.913063),
  new BMapGL.Point(116.394226, 39.917988)
], 5000, {  // 高度5000米
  topFillColor: '#5679ea',
  topFillOpacity: 0.5,
  sideFillColor: '#5679ea',
  sideFillOpacity: 0.9
});
map.addOverlay(prism);

// 3D标签
var label = new BMapGL.Label3D('百度大厦', new BMapGL.Point(116.404, 39.915), {
  fontSize: 20,
  fontColor: '#333',
  backgroundColor: '#fff',
  padding: 10
});
map.addOverlay(label);

热力图

javascript
var heatmapOverlay = new BMapLib.HeatmapOverlay({
  radius: 20,
  opacity: 0.8
});
map.addOverlay(heatmapOverlay);

heatmapOverlay.setDataSet({
  data: [
    {lng: 116.418261, lat: 39.921984, count: 50},
    {lng: 116.423332, lat: 39.916532, count: 51}
  ],
  max: 100
});

// 显示/隐藏热力图
heatmapOverlay.show();
heatmapOverlay.hide();

TypeScript支持

类型声明文件

百度地图提供官方TypeScript类型定义:

typescript
// 安装类型定义
// npm install @types/bmap --save-dev

// 在ts文件中使用
/// <reference path="node_modules/@types/bmap/index.d.ts" />

// 或者配置tsconfig.json
{
  "compilerOptions": {
    "types": ["bmap"]
  }
}

TypeScript示例

typescript
// 定义地图类型
interface MapOptions {
  enableMapClick?: boolean;
  minZoom?: number;
  maxZoom?: number;
}

// 创建地图实例
const map = new BMap.Map('container', {
  enableMapClick: false,
  minZoom: 3,
  maxZoom: 19
} as MapOptions);

// 类型安全的标注创建
const point = new BMap.Point(116.404, 39.915);
const marker = new BMap.Marker(point, {
  enableDragging: true
});

// 类型安全的事件处理
map.addEventListener('click', (e: { point: BMap.Point; pixel: BMap.Pixel }) => {
  console.log(`点击位置:${e.point.lng}, ${e.point.lat}`);
});

// 类型安全的服务调用
const local = new BMap.LocalSearch(map, {
  onSearchComplete: (results: BMap.LocalResult) => {
    const num = results.getCurrentNumPois();
    for (let i = 0; i < num; i++) {
      const poi = results.getPoi(i);
      console.log(poi?.title);
    }
  }
});

封装工具类

typescript
// baidu-map.ts
declare const BMap: any;

export interface BMapOptions {
  ak: string;
  container: string | HTMLElement;
  center?: { lng: number; lat: number };
  zoom?: number;
}

export class BaiduMap {
  private map: any;
  private ak: string;

  constructor(options: BMapOptions) {
    this.ak = options.ak;
    this.initMap(options);
  }

  private initMap(options: BMapOptions): void {
    const container = typeof options.container === 'string'
      ? document.getElementById(options.container)
      : options.container;

    this.map = new BMap.Map(container);
    
    const center = options.center || { lng: 116.404, lat: 39.915 };
    const zoom = options.zoom || 15;
    
    this.map.centerAndZoom(
      new BMap.Point(center.lng, center.lat),
      zoom
    );
  }

  addMarker(lng: number, lat: number, options?: any): any {
    const point = new BMap.Point(lng, lat);
    const marker = new BMap.Marker(point, options);
    this.map.addOverlay(marker);
    return marker;
  }

  setCenter(lng: number, lat: number): void {
    this.map.setCenter(new BMap.Point(lng, lat));
  }

  on(event: string, handler: Function): void {
    this.map.addEventListener(event, handler);
  }
}

性能优化

按需加载

javascript
BMap.loader.load('drawing', function() {
  var drawingManager = new BMapLib.DrawingManager(map, {
    isOpen: true,
    drawingToolOptions: {
      anchor: BMAP_ANCHOR_TOP_RIGHT
    }
  });
});

批量操作

javascript
map.disableDragging();
for (var i = 0; i < markers.length; i++) {
  map.addOverlay(markers[i]);
}
map.enableDragging();

事件节流

javascript
var timer = null;
map.addEventListener('moveend', function() {
  clearTimeout(timer);
  timer = setTimeout(function() {
    console.log('地图移动完成');
  }, 300);
});

内存管理

javascript
// 销毁地图前清理
function destroyMap() {
  // 清除所有覆盖物
  map.clearOverlays();
  
  // 移除所有控件
  map.getControls().forEach(function(control) {
    map.removeControl(control);
  });
  
  // 移除事件监听
  // ...
  
  map = null;
}

下一步