Skip to content

矢量数据

本文档详细说明 OpenLayers 如何管理矢量数据,重点关注要素、几何图形和作为处理矢量要素的核心组件的 VectorSource 类。有关矢量数据格式和解析,请参阅格式和解析。有关矢量瓦片,请参阅瓦片系统

矢量要素简介

OpenLayers 中的矢量要素是具有几何图形(点、线、多边形)和属性的地理实体。与栅格数据(如地图瓦片)不同,矢量要素可以单独样式化、选择和修改。VectorSource 类管理这些要素,提供添加、删除、空间查询和事件处理的方法。

VectorSource 架构

SVG
100%

要素管理

添加和删除要素

VectorSource 提供添加和删除要素的方法:

  • addFeature(feature):添加单个要素
  • addFeatures(features):添加多个要素
  • removeFeature(feature):删除要素
  • clear(fast):删除所有要素

添加要素时,它们会按其 ID(如果提供)进行索引并分配唯一标识符 (UID)。具有几何图形的要素会被添加到空间索引 (R-Tree) 中,以便进行高效的空间查询。

SVG
100%

使用 RBush 进行空间索引

OpenLayers 使用 R-Tree 实现 (RBush) 根据要素的空间范围高效地索引和查询要素。这支持以下操作:

  • 查找给定坐标处的要素
  • 查找与给定范围相交的要素
  • 查找离坐标最近的要素
SVG
100%

范围系统

OpenLayers 中的范围是表示边界框的四个数字的数组:[minX, minY, maxX, maxY]extent 模块提供了各种用于处理范围的工具函数。

关键范围操作:

SVG
100%

要素查询

VectorSource 提供了多种查询要素的方法:

  • getFeatures():获取源中的所有要素
  • getFeatureById(id):通过 ID 获取要素
  • getFeaturesInExtent(extent):获取与给定范围相交的要素
  • getClosestFeatureToCoordinate(coordinate):查找离坐标最近的要素
  • forEachFeatureInExtent(extent, callback):迭代范围内的要素

查询方法利用空间索引以提高效率。

从远程源加载要素

VectorSource 可以使用加载器函数从远程 URL 加载要素。默认加载器使用 XHR 获取数据并使用指定格式解析它。

加载策略:

  • all:一次加载所有要素(默认)
  • bbox:加载与当前地图视图范围相交的要素
  • 根据视图确定要加载的范围的自定义策略
SVG
100%

要素更改跟踪

VectorSource 监听要素及其几何图形的更改,并相应地更新空间索引:

  • 当要素的几何图形更改时,它会在空间索引中从旧位置删除并插入到新位置
  • 当要素的 ID 更改时,会更新 ID 索引
  • 要素更改时会触发事件
SVG
100%

比较:VectorSource 与 VectorTile

方面VectorSourceVectorTile
目的通用矢量要素管理针对渲染瓦片矢量数据进行了优化
要素编辑支持要素编辑不适合编辑
内存使用在内存中存储所有要素根据视口按需加载瓦片
优化要素保持其原始几何图形几何图形在瓦片边界附近被剪裁
使用与 VectorLayer 一起使用与 VectorTileLayer 一起使用
加载各种策略(all、bbox 等)基于瓦片的加载

矢量要素聚类

Cluster 源可用于对附近的要素进行分组:

SVG
100%

性能考虑

  • useSpatialIndex:对于具有频繁要素更新和少量要素的源,设置为 false
  • overlaps:对于不重叠的几何图形(如行政边界),设置为 false 以启用渲染器优化
  • wrapX:设置为 false 以禁用围绕世界包裹要素以获得更好的性能
  • 使用 addFeatures() 批量添加要素比多次 addFeature() 调用更有效

使用要素 ID

要素可以具有可选的 ID,这可以通过 getFeatureById() 实现更快的查找。具有相同 ID 的要素被视为重复项,源中只会存储其中一个。

事件

VectorSource 触发几个事件:

  • addfeature:添加要素时
  • removefeature:删除要素时
  • changefeature:要素更改时
  • clear:清除所有要素时
  • featuresloadstart:要素加载开始时
  • featuresloadend:要素加载完成时
  • featuresloaderror:要素加载失败时