数据管理
简介
OpenLayers 中的数据管理系统为处理整个库中的地理空间数据提供了全面的基础设施。该系统包含三个核心领域:用于坐标和范围的空间数据工具、用于各种地理空间标准的格式解析器、以及用于处理瓦片地图数据的瓦片管理基础设施。
该系统构成了整个 OpenLayers 生态系统中数据摄取、转换和空间操作的基础。它桥接了外部数据源与图层、渲染器和用户交互所使用的内部表示。
数据管理架构概览
有关利用此数据管理基础设施的 Source 系统,请参阅Source 系统。
数据格式和解析
OpenLayers 提供了全面的格式系统,用于以各种标准读取和编写地理数据。该系统处理多种地理空间格式的数据摄取、转换和序列化。
格式架构
格式系统基于处理不同数据序列化方法的格式类层次结构构建,以 FeatureFormat 类作为抽象基类。
格式类层次结构和关系
格式系统组织为三个主要分支:
- XMLFeature:基于 XML 的格式(KML、GML、WFS、GPX)
- JSONFeature:基于 JSON 的格式(GeoJSON、TopoJSON、EsriJSON)
- TextFeature:基于文本的格式(WKT、Polyline、IGC)
数据处理管线
格式系统遵循一致的数据处理管线来读取和编写地理数据,并支持坐标转换。
格式处理流程
转换管线处理:
- 坐标系转换:源投影和目标投影之间
- 几何优化:用于性能的抽稀和简化
- 要素构建:创建
Feature或RenderFeature对象 - 属性映射:处理属性和元数据
支持的格式标准
OpenLayers 支持针对不同用例和数据源的全面地理空间数据格式。
格式支持矩阵
| 格式 | 类型 | 模块 | 用例 | 主要特性 |
|---|---|---|---|---|
| GeoJSON | JSON | format/GeoJSON | Web 地图标准 | 符合 RFC 7946,投影支持 |
| KML | XML | format/KML | Google Earth 集成 | 样式、文件夹、网络链接 |
| WFS | XML | format/WFS | OGC Web 服务 | 版本 1.0.0、1.1.0、2.0.0 |
| GML | XML | format/GMLBase | OGC 几何标准 | GML 2.1.2、3.1.1、3.2 |
| MVT | 二进制 | format/MVT | 矢量瓦片 | Mapbox 矢量瓦片规范 |
| TopoJSON | JSON | format/TopoJSON | 拓扑编码 | 共享边界、更小文件 |
| WKT | 文本 | format/WKT | 简单文本格式 | Well-Known Text 标准 |
| EsriJSON | JSON | format/EsriJSON | Esri 生态系统 | ArcGIS REST API 格式 |
| Polyline | 文本 | format/Polyline | 路线编码 | Google polyline 算法 |
| GPX | XML | format/GPX | GPS 数据交换 | 轨迹、路线、航点 |
XML 处理基础设施
XML 格式系列利用复杂的解析基础设施来处理复杂的 XML 模式和命名空间管理。
XML 处理组件
XML 基础设施提供:
- 命名空间处理:
makeStructureNS()用于多命名空间文档 - 解析器组合:
makeArrayPusher()、makeObjectPropertySetter()用于构建复杂解析器 - 递归解析:
pushParseAndPop()用于嵌套 XML 结构 - 模式合规性:特定格式的解析器配置
特定格式的功能
每种格式实现都提供超出基本格式接口的专门功能。
高级格式功能
空间数据和工具
空间数据工具为在整个 OpenLayers 中处理地理坐标、空间范围和坐标转换提供基础数据类型和操作。
坐标系
OpenLayers 中的坐标表示为简单的数字数组,通常采用 [x, y] 或 [经度, 纬度] 的形式。coordinate.js 模块提供用于操作和转换坐标的工具函数。
核心坐标操作
关键坐标操作:
| 函数 | 目的 | 返回类型 |
|---|---|---|
| add() | 向坐标添加增量 | Coordinate |
| rotate() | 按给定角度旋转坐标 | Coordinate |
| distance() | 计算坐标之间的距离 | number |
| format() | 根据模板格式化坐标 | string |
| wrapX() | 围绕反子午线包裹坐标 | Coordinate |
范围管理
范围表示定义为四个数字数组的矩形边界框:[minX, minY, maxX, maxY]。extent.js 模块提供用于创建和操作空间范围的全面函数。
范围操作和关系
关键范围操作包括:
- 空间查询:
containsCoordinate()、containsExtent()、intersects() - 几何操作:
buffer()、extend()、getCenter() - 测量:
getWidth()、getHeight()、getArea() - 坐标包裹:
wrapX()用于处理反子午线交叉
瓦片坐标系
瓦片坐标表示分层瓦片方案中的特定瓦片,定义为三个数字的数组:[z, x, y],其中 z 是缩放级别,x 是列,y 是行。
瓦片坐标操作
瓦片坐标系提供:
- 唯一标识:每个瓦片都有唯一的
[z, x, y]坐标 - 字符串键:
getKey()创建用于缓存的字符串标识符 - 哈希函数:
hash()提供用于高效查找的数字哈希 - 验证:
withinExtentAndZ()根据网格边界检查瓦片有效性
空间工具函数
OpenLayers 提供额外的空间工具函数,用于几何计算和坐标系操作,支持整个库中的各种地图操作。
空间计算管线
坐标处理
OpenLayers 提供全面的坐标处理系统,坐标是所有地理数据的基本构建块。
坐标
OpenLayers 中的坐标表示为简单的数字数组,通常采用 [x, y] 或 [经度, 纬度] 的形式。坐标模块提供用于操作和转换坐标的工具函数:
坐标操作的示例包括:
add():向坐标添加增量rotate():按给定角度旋转坐标distance():计算两个坐标之间的距离format():根据模板格式化坐标wrapX():围绕反子午线包裹坐标以适应给定投影
范围
范围表示矩形边界框,定义为四个数字的数组:[minX, minY, maxX, maxY]。范围模块提供用于创建和操作范围的各种函数:
关键范围操作包括:
buffer():按给定值增加范围containsCoordinate():检查范围是否包含坐标intersects():确定两个范围是否相交getCenter():获取范围的中心extend():扩大范围以包含另一个范围
瓦片系统
瓦片系统为管理分层瓦片地图数据提供基础设施,包括瓦片坐标系、URL 生成和瓦片网格管理。该系统是高效处理栅格和矢量瓦片源的基础。
瓦片网格架构
TileGrid 类构成 OpenLayers 瓦片系统的基础,定义瓦片如何在空间和缩放级别上组织。
TileGrid 系统组件
关键 TileGrid 功能:
- 多分辨率支持:管理具有相应分辨率的缩放级别
- 空间索引:将地理坐标映射到瓦片坐标
- 范围管理:定义瓦片可用性边界
- 范围计算:确定特定地图视图的瓦片集
瓦片坐标系
瓦片坐标使用 [z, x, y] 系统,其中 z 表示缩放级别,x 表示列,y 表示行。tilecoord.js 模块提供处理这些坐标的工具。
瓦片坐标操作
瓦片坐标系提供:
- 唯一标识:每个瓦片都有唯一的
[z, x, y]坐标 - 字符串表示:
getKey()创建可缓存的字符串标识符 - 哈希函数:
hash()提供用于高效存储的数字哈希 - 边界验证:
withinExtentAndZ()检查瓦片有效性
瓦片 URL 生成
tileurlfunction.js 模块提供用于从模板和瓦片坐标生成瓦片 URL 的函数,支持各种 URL 模式和服务器配置。
URL 函数创建管线
URL 生成功能:
- 模板支持:标准
{z}/{x}/{y}模板格式 - 负载均衡:分布在多个瓦片服务器
- 自定义模式:支持非标准 URL 方案
- 瓦片网格集成:针对不同网格的正确坐标转换
createFromTemplates() 函数通过使用瓦片坐标哈希在多个服务器之间分布请求来提供自动负载均衡。
瓦片范围管理
瓦片范围表示特定缩放级别的矩形瓦片集,用于高效的批量操作和视口计算。
瓦片范围操作
瓦片范围操作实现:
- 空间查询:检查瓦片是否在特定区域内
- 批量处理:高效操作瓦片集
- 内存管理:计算用于预加载或清理的瓦片集
- 相交测试:确定重叠的瓦片区域
与 Source 系统的集成
瓦片系统与 OpenLayers 的源系统集成,以提供无缝的瓦片加载和管理。
瓦片系统集成流程
瓦片系统为以下内容提供基础:
- 高效加载:仅加载当前视口内的瓦片
- 缓存策略:根据坐标键管理瓦片缓存
- 渐进加载:根据需要加载不同分辨率的瓦片
- 源抽象:不同瓦片源的公共接口
转换和投影
OpenLayers 提供了强大的系统,用于在不同坐标系(投影)之间转换地理数据。
坐标转换
转换几何图形的关键函数是 transformGeometryWithOptions(),它处理读取或写入要素时的坐标转换:
转换过程涉及:
- 检查源投影和目标投影是否不同
- 获取适当的转换函数
- 将转换应用于几何图形中的所有坐标
- 可选地,将坐标四舍五入到指定的小数位数
围绕日期线包裹
坐标处理中的一个特殊情况是处理跨越反子午线(180° 经度)的坐标。坐标和范围模块中的 wrapX() 函数确保正确处理跨越此边界的数据。
// 围绕日期线包裹坐标的示例
const wrappedCoord = wrapX([185, 45], projection);
// 根据投影,结果可能是 [-175, 45]要素管理
要素是 OpenLayers 中的核心数据对象,表示具有属性和几何图形的地理实体。
要素结构
要素由以下部分组成:
- 几何图形(点、线、多边形等)
- 属性集
- 可选 ID
- 可选样式
要素通过 Feature 类创建和管理,可以如前几节所示从各种格式读取或写入各种格式。
要素转换
当从源读取要素或写入输出时,其几何图形通常需要在不同的坐标系之间转换。这由格式系统使用前面描述的转换函数来处理。
经纬网
Graticule(经纬网)图层是一种特殊的图层类型,提供坐标系的网格表示。它对于在地图上可视化坐标网格特别有用。
经纬网图层:
- 生成经线(经度线)和纬线(纬度线)
- 可以显示坐标标签
- 随地图视图变化自动更新
- 支持各种样式选项
处理序列化数据
OpenLayers 提供一致的 API 用于处理序列化地理数据,使在各种格式中导入和导出数据变得容易。
读取数据
要从数据源读取要素:
// 示例:从 GeoJSON 源读取要素
const format = new GeoJSON();
const features = format.readFeatures(jsonData, {
dataProjection: 'EPSG:4326', // 数据的投影
featureProjection: 'EPSG:3857' // 要转换到的投影
});写入数据
要将要素写入数据格式:
// 示例:将要素写入 GeoJSON
const format = new GeoJSON();
const jsonOutput = format.writeFeatures(features, {
dataProjection: 'EPSG:4326', // 输出的投影
featureProjection: 'EPSG:3857', // 要素当前所在的投影
decimals: 5 // 坐标的小数位数
});结论
OpenLayers 提供了全面且灵活的数据管理系统,在处理地理数据复杂性的同时为开发人员提供简单的 API。坐标和范围工具,结合广泛的格式支持和投影处理,允许将来自各种源的数据无缝集成到统一的地图环境中。
通过理解这些数据管理组件,您可以有效地处理来自不同来源的地理数据,根据应用程序的需要适当地转换它,并确保无论底层坐标系如何都能正确可视化。