地图状态
地图状态包括地图的当前视图参数,如中心点、缩放级别、旋转角度、倾斜角度等。SDK 提供了丰富的方法来获取和设置这些状态。
获取地图状态
获取中心点
javascript
const center = sdk.getCenter();
console.log("地图中心:", center); // [116.39, 39.9]获取缩放级别
javascript
const zoom = sdk.getZoom();
console.log("缩放级别:", zoom); // 10获取边界范围
javascript
const bounds = sdk.getBounds();
console.log("地图边界:", bounds);
// [[minLng, minLat], [maxLng, maxLat]]获取旋转角度
javascript
const bearing = sdk.getBearing();
console.log("旋转角度:", bearing); // 0-360获取倾斜角度
javascript
const pitch = sdk.getPitch();
console.log("倾斜角度:", pitch); // 0-60设置地图状态
设置中心点
javascript
// 直接设置
sdk.setCenter([116.39, 39.9]);
// 带动画效果
sdk.flyTo({
center: [116.39, 39.9],
zoom: 12,
duration: 2000,
});设置缩放级别
javascript
// 直接设置
sdk.setZoom(12);
// 带动画效果
sdk.flyTo({
zoom: 12,
duration: 1000,
});设置旋转角度
javascript
// 直接设置
sdk.setBearing(45);
// 带动画效果
sdk.flyTo({
bearing: 45,
duration: 1500,
});设置倾斜角度
javascript
// 直接设置
sdk.setPitch(60);
// 带动画效果
sdk.flyTo({
pitch: 60,
duration: 1500,
});适应边界范围
javascript
sdk.fitBounds(
[[116.0, 39.0], [117.0, 40.0]], // 边界范围
{
padding: 50, // 边距
duration: 1000, // 动画时长
}
);监听状态变化
监听缩放变化
javascript
sdk.on("zoom", () => {
const zoom = sdk.getZoom();
console.log("缩放级别变化:", zoom);
// 根据缩放级别执行不同操作
if (zoom > 10) {
// 显示详细图层
sdk.showLayers(["detail-layer"]);
} else {
// 隐藏详细图层
sdk.hideLayers(["detail-layer"]);
}
});监听移动变化
javascript
sdk.on("move", () => {
const center = sdk.getCenter();
console.log("地图中心变化:", center);
});监听旋转变化
javascript
sdk.on("rotate", () => {
const bearing = sdk.getBearing();
console.log("旋转角度变化:", bearing);
});状态组合操作
同时设置多个状态
javascript
sdk.flyTo({
center: [116.39, 39.9],
zoom: 12,
bearing: 45,
pitch: 60,
duration: 2000,
});保存和恢复状态
javascript
// 保存当前状态
const savedState = {
center: sdk.getCenter(),
zoom: sdk.getZoom(),
bearing: sdk.getBearing(),
pitch: sdk.getPitch(),
};
// 恢复状态
sdk.flyTo({
...savedState,
duration: 1000,
});动画选项
flyTo 方法支持丰富的动画选项:
javascript
sdk.flyTo({
center: [116.39, 39.9],
zoom: 12,
bearing: 0,
pitch: 0,
duration: 2000, // 动画时长(毫秒)
easing: (t) => t * (2 - t), // 缓动函数
essential: true, // 是否在低性能设备上跳过动画
});限制范围
设置缩放范围
javascript
const sdk = new navMap.MapSDK({
container: "map",
minZoom: 2, // 最小缩放级别
maxZoom: 18, // 最大缩放级别
});设置边界限制
javascript
const sdk = new navMap.MapSDK({
container: "map",
maxBounds: [
[116.0, 39.0], // 西南角
[117.0, 40.0] // 东北角
],
});实用示例
示例1:回到初始位置
javascript
const initialState = {
center: [116.39, 39.9],
zoom: 10,
bearing: 0,
pitch: 0,
};
function resetMap() {
sdk.flyTo({
...initialState,
duration: 1000,
});
}示例2:根据要素自适应
javascript
function fitToFeature(feature) {
const coordinates = feature.geometry.coordinates;
if (feature.geometry.type === "Point") {
// 点要素:居中并设置合适的缩放级别
sdk.flyTo({
center: coordinates,
zoom: 15,
duration: 1000,
});
} else {
// 线或面要素:适应边界
const bounds = calculateBounds(coordinates);
sdk.fitBounds(bounds, {
padding: 50,
duration: 1000,
});
}
}示例3:响应式地图状态
javascript
// 监听窗口大小变化,调整地图
window.addEventListener("resize", () => {
sdk.resize(); // 重新计算地图尺寸
});
// 监听缩放变化,动态调整图层
sdk.on("zoom", () => {
const zoom = sdk.getZoom();
if (zoom < 8) {
// 低缩放级别:显示概览图层
sdk.showLayers(["overview-layer"]);
sdk.hideLayers(["detail-layer"]);
} else {
// 高缩放级别:显示详细图层
sdk.hideLayers(["overview-layer"]);
sdk.showLayers(["detail-layer"]);
}
});注意事项
- 状态设置时机:确保在地图
loadComplete事件后再设置状态 - 性能考虑:频繁的状态变化可能影响性能,考虑使用防抖
- 动画时长:根据用户体验合理设置动画时长,通常 500-2000ms 较为合适
- 边界检查:设置中心点时注意检查是否超出地图边界
