Skip to content

数据格式和解析

本文档描述 OpenLayers 中的数据格式和解析子系统,该子系统实现了在各种地理空间标准(包括 GeoJSON、KML、WFS、MVT 等)中读取和编写地理数据的功能。格式类提供读取器和写入器,用于在外部格式表示和 OpenLayers 要素之间进行转换,并包含支持基于 XML 的格式的全面 XML 处理工具。有关矢量数据结构本身的信息,请参阅空间数据和工具

格式系统概览

OpenLayers 中的格式系统提供了以不同格式读取和编写地理数据的统一方法。所有格式类都遵循一致的 API 模式,同时处理每种格式的编码和解码逻辑的细节。

格式类层次结构

格式系统围绕类层次结构组织,该层次结构提供共享功能,同时支持特定格式的实现。

SVG
100%

核心概念

FeatureFormat

FeatureFormat 类是所有格式实现的基类。它定义了用于读取和编写地理数据的 API。

基类提供的核心概念:

  • dataProjection:数据的投影(从源读取或写入到源)
  • featureProjection:要素在 OpenLayers 中使用的投影
  • 读/写选项:控制投影转换、过滤和其他特定于格式的行为
  • 要素类:确定要创建的要素对象类型(FeatureRenderFeature

读取和编写流程

格式系统遵循用于读取和编写数据的通用模式:

SVG
100%

读取地理数据

所有格式类都实现了从各种源读取要素、几何图形和投影的方法:

  • readFeature(source, options):从源读取单个要素
  • readFeatures(source, options):从源读取多个要素
  • readGeometry(source, options):从源读取几何图形
  • readProjection(source):从源读取投影信息

每种格式实现特定的解析逻辑,同时保持一致的 API。特定于格式的实现通常处理:

  1. 根据格式规范解析源数据
  2. 创建适当的几何图形(Point、LineString、Polygon 等)
  3. 从源属性设置要素属性
  4. 在需要时处理投影转换

坐标转换

读取地理数据时,通常需要在不同的坐标参考系之间转换坐标。这由 transformGeometryWithOptionstransformExtentWithOptions 函数处理:

SVG
100%

编写地理数据

格式类还提供了将要素和几何图形写入各种格式的方法:

  • writeFeature(feature, options):写入单个要素
  • writeFeatures(features, options):写入多个要素
  • writeGeometry(geometry, options):写入几何图形

编写通常涉及:

  1. 如果需要,将几何图形转换到目标投影
  2. 根据格式规范序列化几何图形
  3. 将要素属性添加到输出
  4. 根据格式的语法规则进行格式化

XML 处理工具

OpenLayers 在 xml.js 中提供了全面的 XML 处理工具,支持所有基于 XML 的格式实现。这些工具处理 XML 解析、序列化和命名空间管理。

核心 XML 处理函数

XML 处理基础设施

SVG
100%

关键 XML 工具函数:

函数目的位置
parse(xml)将 XML 字符串解析为 Documentsrc/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 格式实现

格式描述重要性
KMLKML支持样式的 Keyhole 标记语言高 (83.87)
WFSWFSWeb Feature Service 事务和查询高 (54.75)
GMLGMLBase, GML2, GML3, GML32地理标记语言系列中 (37.74)
GPXGPXGPS 交换格式中 (25.38)
OSMXMLOSMXMLOpenStreetMap XML低 (15.21)
WMSGetFeatureInfoWMSGetFeatureInfoWMS GetFeatureInfo 结果低 (13.78)

XML 格式解析器结构示例 (KML)

基于 JSON 的格式

基于 JSON 的格式解析和生成 JSON 对象。它们处理 JSON 解析和序列化。

主要 JSON 格式实现

格式描述重要性
MVTMVTMapbox 矢量瓦片(Protocol Buffers)高 (41.08)
GeoJSONGeoJSONOGC GeoJSON 标准中 (30.82)
EsriJSONEsriJSONEsri JSON 格式中 (24.20)
TopoJSONTopoJSON拓扑 JSON低 (20.30)

MVT 格式处理(二进制 Protocol Buffers)

SVG
100%

基于文本的格式

基于文本的格式处理解析和生成纯文本格式。

文本格式实现

格式描述重要性
PolylinePolyline编码 Polyline 算法中 (31.15)
WKTWKTWell-Known Text 几何表示中 (23.78)
IGCIGC国际滑翔委员会飞行格式低 (18.73)

文本格式解析管线

SVG
100%

特定格式的功能

每种格式实现都基于格式规范具有特定的功能和行为。

示例:KML 格式实现

KML 类是最全面的格式实现之一,处理具有完整样式支持和高级功能的 Keyhole 标记语言文件:

KML 格式类结构

SVG
100%

KML 高级功能:

  • 样式管理:通过 sharedStyles_createFeatureStyleFunction 实现共享样式、样式映射和内联样式
  • 几何支持:所有几何类型,包括 Google Earth 扩展(gx:Track、gx:MultiTrack)
  • 元数据提取:名称、描述、网络链接、区域和相机信息
  • 图标处理:通过 iconUrlFunction_ 实现自定义图标 URL 转换
  • 坐标读取readFlatCoordinates(node) 支持灵活的坐标解析

示例:WFS 格式实现

WFS 类处理 Web Feature Service 事务和查询,代表最复杂的 XML 格式实现之一:

WFS 格式架构

SVG
100%

WFS 实现细节:

  • 多版本支持:支持 WFS 1.0.0、1.1.0 和 2.0.0 版本,具有不同的 GML 格式后端
  • 事务支持:通过 writeTransaction 实现完整的 CRUD 操作,包括 Insert、Update、Delete 操作
  • 查询构建:具有 BBOX 过滤器、属性名称和自定义过滤器的复杂查询构建
  • 命名空间管理:用于多模式支持的灵活要素命名空间配置
  • 响应解析:事务响应、要素集元数据和投影检测

使用格式

通用使用模式

格式通常用于以下方式:

  1. 从源读取要素

    // 创建格式实例
    const format = new ol.format.GeoJSON();
    
    // 从源读取要素
    const features = format.readFeatures(source, {
      dataProjection: 'EPSG:4326',
      featureProjection: 'EPSG:3857'
    });
  2. 将要素写入格式

    // 创建格式实例
    const format = new ol.format.GeoJSON();
    
    // 将要素写入 GeoJSON
    const geojson = format.writeFeatures(features, {
      dataProjection: 'EPSG:4326',
      featureProjection: 'EPSG:3857'
    });

格式选项

大多数格式类接受控制其行为的选项:

选项描述示例
dataProjection数据源的投影'EPSG:4326'、'EPSG:3857'
featureProjectionOpenLayers 中要素的投影'EPSG:3857'、'EPSG:4326'
geometryName几何属性的名称'geometry'、'the_geom'
extractStyles是否提取样式(用于 KML 等)true、false
featureClass用于要素的类ol.Feature、ol.render.Feature

高级主题

投影处理

格式通过 transformGeometryWithOptionstransformExtentWithOptions 函数处理坐标系转换。这些函数:

  1. 比较数据投影和要素投影
  2. 如果不同,转换坐标
  3. 应用任何其他转换(例如,坐标四舍五入)
// 使用投影转换读取要素
const features = format.readFeatures(source, {
  dataProjection: 'EPSG:4326',    // 源数据在 WGS 84 中
  featureProjection: 'EPSG:3857'  // 要素将在 Web Mercator 中
});

RenderFeature 与 Feature

格式系统可以创建两种类型的要素:

  1. Feature:具有几何图形和属性的全功能对象,可以修改
  2. RenderFeature:轻量级,为渲染而优化,创建后无法修改

这种选择影响性能与灵活性:

// 使用 RenderFeature 以获得更好的渲染性能
const format = new ol.format.GeoJSON({
  featureClass: ol.render.Feature
});

扩展格式

创建自定义格式涉及扩展其中一个基类并实现解析和序列化逻辑:

  1. 扩展基类(XMLFeature、JSONFeature 或 TextFeature)
  2. 实现所需的读/写方法
  3. 处理特定于格式的解析和序列化

结论

OpenLayers 中的格式系统提供了用于在各种格式中读取和编写地理数据的全面工具集。通过所有格式的一致 API 和对坐标转换的强大支持,它实现了与不同数据源和服务的无缝互操作性。