赞
踩
第三章 面向对象的openlayer
OpenLayers 是一个开源的 JavaScript 库,用于构建丰富的地理信息系统(GIS)应用程序。它提供了多种核心类和功能,用于处理地图、图层、交互、源、视图等。以下是 OpenLayers 的一些类及其关系的详细说明。
这是所有地图渲染器的基类,定义了地图渲染器的基本接口和通用功能。
继承自 ol.renderer.Map,用于基于 Canvas 技术的地图渲染。
负责初始化 Canvas 元素。
管理和调度图层渲染。
处理地图的交互事件。
这是所有基于 Canvas 渲染的图层的基类,定义了图层渲染的基本接口
继承自 ol.renderer.canvas.Layer,用于渲染瓦片图层(如 OpenStreetMap)。
负责加载和渲染瓦片数据。
管理瓦片缓存和显示。
继承自 ol.renderer.canvas.Layer,用于渲染矢量图层。
负责渲染矢量数据(如点、线、面)。
处理矢量数据的样式和交互。
继承自 ol.renderer.Map,用于基于 WebGL 技术的地图渲染。
负责初始化 WebGL 上下文。
管理和调度图层渲染。
处理地图的交互事件。
这是所有基于 WebGL 渲染的图层的基类,定义了图层渲染的基本接口。
继承自 ol.renderer.webgl.Layer,用于渲染瓦片图层(如 OpenStreetMap)。
负责加载和渲染瓦片数据。
管理瓦片缓存和显示。
继承自 ol.renderer.webgl.Layer,用于渲染矢量图层。
负责渲染矢量数据(如点、线、面)。
处理矢量数据的样式和交互。
OpenLayers 提供了丰富的事件处理机制,使得用户可以方便地响应地图和图层上的各种交互操作。以下是 OpenLayers 中事件类的详细介绍,包括如何添加、管理和处理事件。
OpenLayers 使用 ol.events 模块来处理事件,主要通过 ol.Observable 类来实现事件的订阅和发布机制。所有可以触发事件的类都继承自 ol.Observable,因此具备事件处理能力。
主要事件类和接口
ol.Observable
ol.Map
ol.layer.Base
ol.interaction.Interaction
ol.source.Source
ol.Collection
ol.Observable 是事件系统的核心类,所有支持事件的类都继承自它。它提供了事件的基本管理功能,包括添加事件监听、移除事件监听和触发事件。
方法
on(type, listener):添加事件监听。
un(type, listener):移除事件监听。
once(type, listener):添加一次性事件监听。
dispatchEvent(event):触发事件。
ol.Map 类是 OpenLayers 的地图对象,支持多种地图事件,如点击、移动、缩放等。
常见事件类型
click:地图被点击时触发。
pointermove:鼠标指针在地图上移动时触发。
movestart:地图开始移动时触发。
moveend:地图移动结束时触发。
zoomstart:地图开始缩放时触发。
zoomend:地图缩放结束时触发。
ol.layer.Base 是所有图层类的基类,支持图层相关的事件。
常见事件类型
change:source:图层的数据源发生变化时触发。
ol.interaction.Interaction 是所有交互操作类的基类,支持交互操作相关的事件。
事件类型
change:active:交互操作的激活状态发生变化时触发。
ol.source.Source 是所有数据源类的基类,支持数据源相关的事件。
常见事件类型
change:数据源发生变化时触发。
ol.Collection 类用于管理一组对象,支持集合相关的事件。
常见事件类型
add:对象被添加到集合时触发。
remove:对象从集合中移除时触发。
OpenLayers 支持多种数据格式和数据源,并通过一系列类和模块来组织和管理这些数据。
数据源 (ol.source)
ol.source 包含了各种数据源的实现,包括瓦片数据源、矢量数据源、图像数据源等。
ol.source.Tile:用于瓦片图层的数据源。
ol.source.Vector:用于矢量图层的数据源。
ol.source.Image:用于图像图层的数据源。
图层 (ol.layer)
ol.layer 定义了地图中的不同图层,每个图层对应一个数据源。
ol.layer.Tile:用于展示瓦片地图。
ol.layer.Vector:用于展示矢量数据。
ol.layer.Image:用于展示图像数据。
格式 (ol.format)
ol.format 包含了数据解析和序列化的类,用于处理各种地理数据格式,如 GeoJSON、KML、GML、GPX 等。
ol.format.GeoJSON:用于解析和生成 GeoJSON 格式的数据。
ol.format.KML:用于解析和生成 KML 格式的数据。
ol.format.GML:用于解析和生成 GML 格式的数据。
ol.format.GPX:用于解析和生成 GPX 格式的数据。
OpenLayers 的渲染类是地图渲染过程中的核心组件,负责将地图图层和其内容渲染到屏幕上。下面详细介绍 OpenLayers 的渲染流程。
- 地图初始化:创建 ol.Map 对象,配置视图、图层和控件。
- 创建 HTML 容器:生成主 div容器和子容器(div.ol-viewport、div.ol-overlaycontainer-stopevent、div.ol-overlaycontainer、canvas.ol-unselectable)。
- 设置视图:初始化 ol.View 对象,根据中心点、缩放级别等参数配置视图。 添加图层:创建图层对象(如ol.layer.Tile),并设置数据源。
- 渲染引擎初始化:根据浏览器,创建合适的渲染器(如 CanvasRenderer或WebGLRenderer)。
- 渲染循环:使用 requestAnimationFrame启动渲染循环,确保地图在每一帧都能重新渲染。
- 图层渲染:遍历所有图层,调用每个图层的 render 方法,将图层内容绘制到 canvas上。
- 处理事件:监听和处理用户交互事件(如点击、拖动、缩放等),并更新视图和图层状态。
OpenLayers 在创建地图应用时,内部会生成一系列的 HTML 元素(如 div 和 canvas),用于呈现地图和其上的图层、控件等。以下是对这些内部生成的元素及其作用的详细说明。
主容器 div.ol-viewport
这是 OpenLayers 创建的地图容器的主 div 元素,所有的其他元素都在这个 div 中。
作用:主地图容器,所有的地图元素都在这个容器内。
样式:通常设置 position: relative 以便其内部元素能够正确定位。
<div class="ol-viewport" style="position: relative;">
...
</div>
覆盖物容器 div.ol-overlaycontainer-stopevent 和 div.ol-overlaycontainer
这两个 div 元素用于存放地图的覆盖物(如弹出窗口、工具提示等)。div.ol-overlaycontainer-stopevent 用于那些需要停止事件传播的覆盖物,而 div.ol-overlaycontainer 则用于不需要停止事件传播的覆盖物。
<canvas class="ol-unselectable" width="800" height="600" style="position: absolute; width: 100%; height: 100%;">
...
</canvas>
渲染图层的 canvas 元素 canvas.ol-unselectable
每个图层通常都会有一个 canvas 元素,这些 canvas 元素用于渲染地图图层。canvas.ol-unselectable 是一个类名,用于防止用户选择 canvas 内容。
<canvas class="ol-unselectable" width="800" height="600" style="position: absolute; width: 100%; height: 100%;">
...
</canvas>
控件容器 div.ol-control
地图控件(如缩放控件、比例尺控件等)会被添加到一个 div.ol-control 元素中。每个控件都有其自己的 div 元素,用于组织和样式化控件。
<div class="ol-control">
<div class="ol-zoom" style="position: absolute; top: 1em; left: 1em;">
...
</div>
</div>
为了更好地理解 OpenLayers 内部生成的元素及其层次结构,下面是一个详细的结构图
<div id="map" class="map"> <div class="ol-viewport" style="position: relative;"> <div class="ol-overlaycontainer-stopevent" style="position: absolute; left: 0; top: 0;"> <!-- Overlays that stop event propagation --> </div> <div class="ol-overlaycontainer" style="position: absolute; left: 0; top: 0;"> <!-- Overlays that do not stop event propagation --> </div> <canvas class="ol-unselectable" width="800" height="600" style="position: absolute; width: 100%; height: 100%;"> <!-- Layer content --> </canvas> <div class="ol-control"> <div class="ol-zoom" style="position: absolute; top: 1em; left: 1em;"> <!-- Zoom control --> </div> <div class="ol-scale-line" style="position: absolute; bottom: 1em; left: 1em;"> <!-- Scale line control --> </div> </div> </div> </div>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。