地图状态是指地图当前的视野表现,包括中心点、缩放级别、旋转角度(heading)和倾斜角度(tilt)四个核心维度。掌握这些概念及对应的 API,可以精确控制地图展示的区域、比例和视角。
创建地图实例后,使用 centerAndZoom 设置初始中心点和缩放级别
var map = new BMap.Map('container');var point = new BMap.Point(116.404, 39.915);map.centerAndZoom(point, 15);
centerAndZoom 适合初始化地图。地图已经显示后,如需改变单个状态,建议使用下面对应的状态设置方法。
通过setCenter和getCenter设置和获取地图中心点。
setCenter默认会开启“自适应动画”,即目标位置离当前视野为一屏以内,则开启动画,超过一屏则不使用动画。
开发者可以通过noAnimation属性来强制关闭动画效果;在强需求动画切换视野的场景,也可以直接使用下文的flyTo方法。
map.setCenter(new BMap.Point(116.404, 39.915));var center = map.getCenter();console.log(center.lng, center.lat);// 关闭动画并设置回调map.setCenter(new BMap.Point(116.404,39.915), {noAnimation: true,callback: function () {console.log('中心点切换完成');}});
setCenter方法也支持直接传入城市名,内部会调用地址解析服务转换为坐标,这会让设置中心点成为一个异步行为
map.setCenter('北京市');
如果在业务中需要时刻监听当前中心点的位置,可以通过监听地图对象的moveend事件,moveend会在一次地图移动结束后触发。拖拽、平移和视野动画等引起地图移动的操作,都会在结束时触发该事件。如果要监听移动过程中可通过moving事件实现,但moving事件触发频率会很高,需注意节流。
map.addEventListener('moveend', function () {console.log('本次地图移动结束:', map.getCenter());});
缩放级别决定地图的显示比例,取值范围一般为3-21(支持浮点数),数值越大展示越精细。地图可用级别受地图类型、地图配置和容器尺寸等因素影响,应通过 getMinZoom 和 getMaxZoom 获取当前实例的实际范围。
通过setZoom和getZoom设置与获取缩放级别。minZoom与maxZoom可以在初始化地图的时候设置,也可通过setMinZoom与setMaxZoom来设置
var map = new BMap.Map('container', {minZoom: 5,maxZoom: 18});map.setZoom(15);console.log('当前级别:', map.getZoom());console.log('最小级别:', map.getMinZoom());console.log('最大级别:', map.getMaxZoom());
setZoom也可以指定缩放中心点并设置回调
map.setZoom(18, {zoomCenter: new BMapGL.Point(116.404, 39.915),callback: function () {console.log('本次缩放设置完成');}});
可以通过API实现快速控制地图的放大与缩小一级
map.zoomIn(); // 放大一级map.zoomOut(); // 缩小一级
在需要实时判断缩放级别的业务场景下,可以通过监听地图对象的zoomend事件获取当前缩放级别来配合实现业务逻辑。zoomend 在一次缩放过程结束后触发。缩放过程中可通过 zoomstart 和 zooming 观察。
map.addEventListener('zoomend', function() {console.log('当前缩放级别:', map.getZoom());});
当缩放级别到达瓶颈时,可以通过zoomexceeded事件获取到信息。
map.addEventListener('zoomexceeded', function() {console.log('已无法再缩放');});
旋转角度表示地图的正北朝向偏移,即水平方向的旋转。倾斜角度表示地图的俯仰视角,0 表示垂直俯视,数值越大视角越倾斜,视角越接近水平方向。
setHeading 接受任意角度值,内部会自动按一周(360 度)归一化,例如传入 450 等价于 90,传入 -90 等价于 270。推荐按罗盘角度传值(正北 0、正东 90、正南 180、正西 270)。
getHeading 返回的是带符号角度,取值范围为 -180~180,正值表示顺时针偏离正北,负值表示逆时针偏离正北。这样可以直接体现偏离正北的方向和最短旋转量。
需要注意 getHeading 的返回值与 setHeading 的入参不保证数值一致,例如:
map.setHeading(270, {callback: function() {console.log(map.getHeading()); // 返回 -90,而不是 270}});
通过setTilt()和getTilt()设置与获取倾斜角度。设置倾斜角度时,取值范围会被限制在 [0, 87]。通过鼠标/触摸手势拖拽倾斜时,实际上限更低,18 级以下为 50 度,18 级以上逐渐放宽到 73 度。
map.setTilt(60, {callback: function() {console.log('当前倾斜角度:', map.getTilt());}});
由于旋转和倾斜通常都通过鼠标/触摸手势拖拽实现,所以在常见的业务场景中,可以通过监听dragend拖拽结束事件来获取旋转与倾斜角,实现相应的业务逻辑。
map.addEventListener('dragend', function () {console.log('当前旋转角度:', map.getHeading());console.log('当前倾斜角度:', map.getTilt());});
flyTo方法可同时指定中心点、级别、旋转角度、倾斜角度,并以飞行动画的方式过渡
map.flyTo(new BMap.Point(116.404, 39.915), 18, {heading: 90,tilt: 60,duration: 1200,callback: function () { console.log('飞行完成'); }});
根据传入的坐标点集合,自动计算出可以容纳所有点的中心点和缩放级别
map.setViewport([new BMap.Point(116.30, 40.05),new BMap.Point(116.50, 39.85)], {margins: [20, 20, 20, 20] // 上、右、下、左边距});
上一篇
下一篇