数据格式和解析
本文档描述 OpenLayers 中的数据格式和解析子系统,该子系统实现了在各种地理空间标准(包括 GeoJSON、KML、WFS、MVT 等)中读取和编写地理数据的功能。格式类提供读取器和写入器,用于在外部格式表示和 OpenLayers 要素之间进行转换,并包含支持基于 XML 的格式的全面 XML 处理工具。有关矢量数据结构本身的信息,请参阅空间数据和工具。
格式系统概览
OpenLayers 中的格式系统提供了以不同格式读取和编写地理数据的统一方法。所有格式类都遵循一致的 API 模式,同时处理每种格式的编码和解码逻辑的细节。
格式类层次结构
格式系统围绕类层次结构组织,该层次结构提供共享功能,同时支持特定格式的实现。
核心概念
FeatureFormat
FeatureFormat 类是所有格式实现的基类。它定义了用于读取和编写地理数据的 API。
基类提供的核心概念:
- dataProjection:数据的投影(从源读取或写入到源)
- featureProjection:要素在 OpenLayers 中使用的投影
- 读/写选项:控制投影转换、过滤和其他特定于格式的行为
- 要素类:确定要创建的要素对象类型(
Feature或RenderFeature)
读取和编写流程
格式系统遵循用于读取和编写数据的通用模式:
读取地理数据
所有格式类都实现了从各种源读取要素、几何图形和投影的方法:
- readFeature(source, options):从源读取单个要素
- readFeatures(source, options):从源读取多个要素
- readGeometry(source, options):从源读取几何图形
- readProjection(source):从源读取投影信息
每种格式实现特定的解析逻辑,同时保持一致的 API。特定于格式的实现通常处理:
- 根据格式规范解析源数据
- 创建适当的几何图形(Point、LineString、Polygon 等)
- 从源属性设置要素属性
- 在需要时处理投影转换
坐标转换
读取地理数据时,通常需要在不同的坐标参考系之间转换坐标。这由 transformGeometryWithOptions 和 transformExtentWithOptions 函数处理:
编写地理数据
格式类还提供了将要素和几何图形写入各种格式的方法:
- writeFeature(feature, options):写入单个要素
- writeFeatures(features, options):写入多个要素
- writeGeometry(geometry, options):写入几何图形
编写通常涉及:
- 如果需要,将几何图形转换到目标投影
- 根据格式规范序列化几何图形
- 将要素属性添加到输出
- 根据格式的语法规则进行格式化
XML 处理工具
OpenLayers 在 xml.js 中提供了全面的 XML 处理工具,支持所有基于 XML 的格式实现。这些工具处理 XML 解析、序列化和命名空间管理。
核心 XML 处理函数
XML 处理基础设施
关键 XML 工具函数:
| 函数 | 目的 | 位置 |
|---|---|---|
| parse(xml) | 将 XML 字符串解析为 Document | src/ol/xml.js96-103 |
| parseNode(parsersNS, node, objectStack) | 使用命名空间感知解析器解析 XML 节点 | src/ol/xml.js388-406 |
| pushParseAndPop(object, parsersNS, node, objectStack) | 解析节点并管理对象堆栈 | src/ol/xml.js409-423 |
| makeStructureNS(namespaceURIs, structure) | 创建命名空间感知解析器结构 | src/ol/xml.js369-385 |
| makeArrayPusher(valueReader) | 创建将值推送到数组的解析器 | src/ol/xml.js132-157 |
| serialize(serializersNS, nodeFactory, values, objectStack) | 将值序列化为 XML 节点 | src/ol/xml.js426-476 |
格式类型
OpenLayers 提供了广泛的格式实现,按其基础格式结构分类。
基于 XML 的格式
基于 XML 的格式使用上述 XML 处理工具解析和生成 XML 文档。
主要 XML 格式实现
| 格式 | 类 | 描述 | 重要性 |
|---|---|---|---|
| KML | KML | 支持样式的 Keyhole 标记语言 | 高 (83.87) |
| WFS | WFS | Web Feature Service 事务和查询 | 高 (54.75) |
| GML | GMLBase, GML2, GML3, GML32 | 地理标记语言系列 | 中 (37.74) |
| GPX | GPX | GPS 交换格式 | 中 (25.38) |
| OSMXML | OSMXML | OpenStreetMap XML | 低 (15.21) |
| WMSGetFeatureInfo | WMSGetFeatureInfo | WMS GetFeatureInfo 结果 | 低 (13.78) |
XML 格式解析器结构示例 (KML)
基于 JSON 的格式
基于 JSON 的格式解析和生成 JSON 对象。它们处理 JSON 解析和序列化。
主要 JSON 格式实现
| 格式 | 类 | 描述 | 重要性 |
|---|---|---|---|
| MVT | MVT | Mapbox 矢量瓦片(Protocol Buffers) | 高 (41.08) |
| GeoJSON | GeoJSON | OGC GeoJSON 标准 | 中 (30.82) |
| EsriJSON | EsriJSON | Esri JSON 格式 | 中 (24.20) |
| TopoJSON | TopoJSON | 拓扑 JSON | 低 (20.30) |
MVT 格式处理(二进制 Protocol Buffers)
基于文本的格式
基于文本的格式处理解析和生成纯文本格式。
文本格式实现
| 格式 | 类 | 描述 | 重要性 |
|---|---|---|---|
| Polyline | Polyline | 编码 Polyline 算法 | 中 (31.15) |
| WKT | WKT | Well-Known Text 几何表示 | 中 (23.78) |
| IGC | IGC | 国际滑翔委员会飞行格式 | 低 (18.73) |
文本格式解析管线
特定格式的功能
每种格式实现都基于格式规范具有特定的功能和行为。
示例:KML 格式实现
KML 类是最全面的格式实现之一,处理具有完整样式支持和高级功能的 Keyhole 标记语言文件:
KML 格式类结构
KML 高级功能:
- 样式管理:通过
sharedStyles_和createFeatureStyleFunction实现共享样式、样式映射和内联样式 - 几何支持:所有几何类型,包括 Google Earth 扩展(gx:Track、gx:MultiTrack)
- 元数据提取:名称、描述、网络链接、区域和相机信息
- 图标处理:通过
iconUrlFunction_实现自定义图标 URL 转换 - 坐标读取:
readFlatCoordinates(node)支持灵活的坐标解析
示例:WFS 格式实现
WFS 类处理 Web Feature Service 事务和查询,代表最复杂的 XML 格式实现之一:
WFS 格式架构
WFS 实现细节:
- 多版本支持:支持 WFS 1.0.0、1.1.0 和 2.0.0 版本,具有不同的 GML 格式后端
- 事务支持:通过
writeTransaction实现完整的 CRUD 操作,包括 Insert、Update、Delete 操作 - 查询构建:具有 BBOX 过滤器、属性名称和自定义过滤器的复杂查询构建
- 命名空间管理:用于多模式支持的灵活要素命名空间配置
- 响应解析:事务响应、要素集元数据和投影检测
使用格式
通用使用模式
格式通常用于以下方式:
从源读取要素:
// 创建格式实例 const format = new ol.format.GeoJSON(); // 从源读取要素 const features = format.readFeatures(source, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });将要素写入格式:
// 创建格式实例 const format = new ol.format.GeoJSON(); // 将要素写入 GeoJSON const geojson = format.writeFeatures(features, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });
格式选项
大多数格式类接受控制其行为的选项:
| 选项 | 描述 | 示例 |
|---|---|---|
| dataProjection | 数据源的投影 | 'EPSG:4326'、'EPSG:3857' |
| featureProjection | OpenLayers 中要素的投影 | 'EPSG:3857'、'EPSG:4326' |
| geometryName | 几何属性的名称 | 'geometry'、'the_geom' |
| extractStyles | 是否提取样式(用于 KML 等) | true、false |
| featureClass | 用于要素的类 | ol.Feature、ol.render.Feature |
高级主题
投影处理
格式通过 transformGeometryWithOptions 和 transformExtentWithOptions 函数处理坐标系转换。这些函数:
- 比较数据投影和要素投影
- 如果不同,转换坐标
- 应用任何其他转换(例如,坐标四舍五入)
// 使用投影转换读取要素
const features = format.readFeatures(source, {
dataProjection: 'EPSG:4326', // 源数据在 WGS 84 中
featureProjection: 'EPSG:3857' // 要素将在 Web Mercator 中
});RenderFeature 与 Feature
格式系统可以创建两种类型的要素:
- Feature:具有几何图形和属性的全功能对象,可以修改
- RenderFeature:轻量级,为渲染而优化,创建后无法修改
这种选择影响性能与灵活性:
// 使用 RenderFeature 以获得更好的渲染性能
const format = new ol.format.GeoJSON({
featureClass: ol.render.Feature
});扩展格式
创建自定义格式涉及扩展其中一个基类并实现解析和序列化逻辑:
- 扩展基类(XMLFeature、JSONFeature 或 TextFeature)
- 实现所需的读/写方法
- 处理特定于格式的解析和序列化
结论
OpenLayers 中的格式系统提供了用于在各种格式中读取和编写地理数据的全面工具集。通过所有格式的一致 API 和对坐标转换的强大支持,它实现了与不同数据源和服务的无缝互操作性。