Skip to content

View

View 类是 OpenLayers 中用来控制地图视图的组件。它定义了地图的:

  • 中心点(center):地图显示的中心坐标。
  • 缩放级别(zoom):地图的缩放比例。
  • 最小/最大缩放级别(minZoom/maxZoom):地图允许的缩放范围。
  • 旋转角度(rotation):地图的旋转角度(以弧度表示)。
  • 投影坐标系(projection):地图数据的坐标参考系统(默认使用 EPSG:3857)。

常用属性

1、设置中心点

定义地图的中心坐标,通常使用 [longitude, latitude] 的数组形式。

EPSG:3857 坐标系中的中心点

js
new View({
  center: [12600000, 4100000],
  zoom: 5,
  projection: 'EPSG:3857',	// 默认的投影值是EPSG:3857,可以不用写
});

或者:

js
import { fromLonLat } from "ol/proj";

new View({
  center: fromLonLat([116.397428, 39.90923]),
  zoom: 5,
});

EPSG:4326 坐标系中的中心点

js
new View({
  center: [116.397428, 39.90923],
  zoom: 5,
  projection: 'EPSG:4326'
});

或者:

js
import { toLonLat } from "ol/proj";

new View({
  center: toLonLat([12600000, 4100000]),
  zoom: 5,
  projection: 'EPSG:4326'
});

TIP

后续的章节中除非明确说明,默认均以EPSG:3857 为默认投影。

2、设置缩放级别

js
const view = new View({
  center: [0, 0],
  zoom: 2,
});

3、设置最小/最大缩放级别

js
const view = new View({
  center: [0, 0],
  zoom: 2,
  minZoom: 1,
  maxZoom: 18,
});

4、设置旋转角度

js
new View({
  center: [0, 0],
  zoom: 2,
  rotation: Math.PI / 4, // 旋转 45 度
});

5、设置投影坐标系

js
new View({
  center: [0, 0],
  zoom: 2,
  projection: 'EPSG:4326',
});

关于投影坐标系的介绍,见后续章节。

动态更新 View 属性

View 对象提供了许多方法来动态更新视图属性,如 setCentersetZoomsetRotation 等。

1、设置中心点

js
import { fromLonLat } from "ol/proj";

map.getView().setCenter(fromLonLat([116.4074, 39.9042]));

2、设置缩放层级

js
map.getView().setZoom(8);

3、旋转地图

js
map.getView().setRotation(Math.PI / 2); // 旋转 90 度

4、 平滑动画效果

OpenLayers 支持通过 animate 方法来实现平滑的地图移动和缩放效果。

js
import { fromLonLat } from "ol/proj";

map.getView().animate({
  center: fromLonLat([116.4074, 39.9042]),
  zoom: 10,
  rotation: Math.PI,
  duration: 2000, // 动画持续时间(毫秒)
});

5、限制地图范围(extent)

通过设置 extent 参数,可以限制地图视图的最大显示范围。地图将无法平移到范围之外的区域。

js
new View({
  center: [0, 0],
  zoom: 2,
  extent: [-5000000, -5000000, 5000000, 5000000], // 设置限制范围,注意,这里的坐标是EPSG:3857
});

view变化的事件

View 支持监听 change 事件,例如当中心点或缩放级别发生变化时触发。

js
const view = map.getView();

view.on('change:center', () => {
  console.log('中心点已改变:', view.getCenter());
});