Skip to content

核心架构

OpenLayers 围绕四个基本组件构建,这四个组件构成每个地图应用程序的支柱:Map(地图)View(视图)Layers(图层)Sources(数据源)。这些组件协同工作,创建一个可以显示和操作来自各种数据源的地理空间数据的交互式地图。

四大核心组件

OpenLayers 核心架构概览

SVG
100%

Map:中央协调器

Map 类(src/ol/Map.js242)作为中央协调器,协调所有其他组件。它管理渲染生命周期并维护地图应用程序的整体状态。

Map 类结构

SVG
100%

Map 职责

Map 类通过几个关键机制协调渲染过程:

组件职责
DOM 管理创建视口、覆盖容器 src/ol/Map.js369-401
渲染协调管理 FrameState 并触发渲染 src/ol/Map.js336-338
瓦片加载通过 TileQueue 协调瓦片加载 src/ol/Map.js484-487
事件路由将浏览器事件路由到交互和控件
组件生命周期管理图层、控件、交互和覆盖的集合

View:状态管理和投影

View 类管理地图的视觉状态,包括中心位置、分辨率(缩放级别)和旋转。它为渲染和用户交互提供几何上下文。

视图状态和 FrameState 集成

SVG
100%

View 的关键职责

函数目的实现
状态管理跟踪中心、分辨率、旋转FrameState 中的 ViewState 对象
投影处理在坐标系统之间转换使用 ol/proj 系统
约束应用将视图更改限制为有效范围更改时应用约束函数
动画支持状态之间的平滑过渡带有缓动函数的动画队列
变换计算将坐标转换为像素FrameState 创建变换矩阵

Layers:显示层次结构

图层定义地图上渲染的内容和顺序。每个图层引用其数据的数据源,并且可以具有渲染特定的属性,如不透明度和可见性。

图层架构和继承

SVG
100%

图层-数据源关系

SVG
100%

Sources:数据提供者

数据源提供图层显示的数据。它们处理来自各种格式和协议的地理空间数据的加载、缓存和管理。

数据源类型和瓦片管理

SVG
100%

瓦片加载和优先级系统

TileQueue 根据距离视口中心的距离管理瓦片加载:

组件函数位置
TileQueue管理加载队列src/ol/TileQueue.js19-50
getTilePriority计算瓦片优先级src/ol/TileQueue.js131-159
Tile states跟踪加载进度src/ol/TileState.js8-18
VectorRenderTile矢量数据的特殊瓦片src/ol/VectorRenderTile.js24-100

瓦片状态生命周期

SVG
100%

FrameState:渲染上下文

FrameState 对象是 OpenLayers 渲染架构的核心。它捕获特定时刻地图状态的快照,并提供渲染所需的所有信息。

FrameState 结构和用法

SVG
100%

关键 FrameState 属性

属性类型目的
viewStateViewState当前视图中心、分辨率、旋转
layerStatesArrayArray<LayerState>每个图层的可见性、不透明度、范围
tileQueueTileQueue瓦片加载管理
coordinateToPixelTransformTransform将地图坐标转换为屏幕像素
pixelToCoordinateTransformTransform将屏幕像素转换为地图坐标
timenumber动画和过渡的时间戳
extentExtent地图单位中的可见地图范围
sizeSize地图的像素大小

组件生命周期和初始化

四个核心组件在创建 OpenLayers 地图时遵循特定的初始化顺序和生命周期。

初始化顺序

SVG
100%

核心组件依赖关系

SVG
100%

总结

OpenLayers 核心架构围绕四个基本组件构建:

组件职责

组件主要职责关键类
Map中央协调器和渲染协调器MapFrameState
View状态管理和坐标转换ViewViewState
Layers显示层次结构和渲染配置LayerGroupVectorLayerTileLayer
Sources数据提供和瓦片管理VectorSourceOSMXYZTileQueue

关键交互

  1. Map 创建和维护捕获渲染上下文的 FrameState 对象
  2. View 提供成为 FrameState 一部分的几何状态(ViewState
  3. Layers 组织渲染的内容并引用 Sources 获取数据
  4. Sources 通过 TileQueue 系统管理数据加载
  5. TileQueue 根据距离视口中心的距离优先处理瓦片加载

此架构在组件之间提供清晰的关注点分离,同时保持组件之间的高效协调。FrameState 概念是理解这些组件在渲染期间如何协同工作的核心。

默认交互和控件

OpenLayers 提供默认的交互和控件集,除非另有说明,否则会自动添加到地图中:

默认交互描述
DragRotate通过 Alt+Shift+拖拽旋转地图
DragPan通过拖拽平移地图
PinchRotate使用双指旋转旋转地图
PinchZoom使用双指捏合缩放地图
KeyboardPan使用键盘方向键平移地图
KeyboardZoom使用键盘 +/- 缩放地图
MouseWheelZoom使用鼠标滚轮缩放地图
DragZoom通过 Shift+拖拽缩放到框
DoubleClickZoom通过双击缩放地图
默认控件描述
Zoom放大和缩小按钮
Rotate重置旋转为北向的按钮
Attribution版权文本

这些默认集可以完全自定义或替换:

// 自定义交互
const map = new Map({
  interactions: [
    new DragPan(),
    new MouseWheelZoom({
      constrainResolution: true
    })
  ],
  // ... 其他选项
});

// 无交互
const map = new Map({
  interactions: [],
  // ... 其他选项
});

// 带有自定义选项的默认交互
const map = new Map({
  interactions: defaultInteractions({
    altShiftDragRotate: false,
    pinchRotate: false
  }),
  // ... 其他选项
});

总结

OpenLayers 的核心架构围绕 Map 作为中央组件构建,它管理 View 以处理地图的视觉状态、用于用户输入的 Interactions 集合以及用于显示内容的 Layers 集合。此架构在组件之间提供清晰的关注点分离,同时保持组件之间的高效通信。

View 中的约束系统确保在与地图交互时行为一致且可预测,而 Interaction 系统提供了一种灵活的方式来处理各种类型的用户输入。这些组件共同构成了 OpenLayers 库的基础。