矢量数据
本文档详细说明 OpenLayers 如何管理矢量数据,重点关注要素、几何图形和作为处理矢量要素的核心组件的 VectorSource 类。有关矢量数据格式和解析,请参阅格式和解析。有关矢量瓦片,请参阅瓦片系统。
矢量要素简介
OpenLayers 中的矢量要素是具有几何图形(点、线、多边形)和属性的地理实体。与栅格数据(如地图瓦片)不同,矢量要素可以单独样式化、选择和修改。VectorSource 类管理这些要素,提供添加、删除、空间查询和事件处理的方法。
VectorSource 架构
要素管理
添加和删除要素
VectorSource 提供添加和删除要素的方法:
addFeature(feature):添加单个要素addFeatures(features):添加多个要素removeFeature(feature):删除要素clear(fast):删除所有要素
添加要素时,它们会按其 ID(如果提供)进行索引并分配唯一标识符 (UID)。具有几何图形的要素会被添加到空间索引 (R-Tree) 中,以便进行高效的空间查询。
使用 RBush 进行空间索引
OpenLayers 使用 R-Tree 实现 (RBush) 根据要素的空间范围高效地索引和查询要素。这支持以下操作:
- 查找给定坐标处的要素
- 查找与给定范围相交的要素
- 查找离坐标最近的要素
范围系统
OpenLayers 中的范围是表示边界框的四个数字的数组:[minX, minY, maxX, maxY]。extent 模块提供了各种用于处理范围的工具函数。
关键范围操作:
要素查询
VectorSource 提供了多种查询要素的方法:
getFeatures():获取源中的所有要素getFeatureById(id):通过 ID 获取要素getFeaturesInExtent(extent):获取与给定范围相交的要素getClosestFeatureToCoordinate(coordinate):查找离坐标最近的要素forEachFeatureInExtent(extent, callback):迭代范围内的要素
查询方法利用空间索引以提高效率。
从远程源加载要素
VectorSource 可以使用加载器函数从远程 URL 加载要素。默认加载器使用 XHR 获取数据并使用指定格式解析它。
加载策略:
all:一次加载所有要素(默认)bbox:加载与当前地图视图范围相交的要素- 根据视图确定要加载的范围的自定义策略
要素更改跟踪
VectorSource 监听要素及其几何图形的更改,并相应地更新空间索引:
- 当要素的几何图形更改时,它会在空间索引中从旧位置删除并插入到新位置
- 当要素的 ID 更改时,会更新 ID 索引
- 要素更改时会触发事件
比较:VectorSource 与 VectorTile
| 方面 | VectorSource | VectorTile |
|---|---|---|
| 目的 | 通用矢量要素管理 | 针对渲染瓦片矢量数据进行了优化 |
| 要素编辑 | 支持要素编辑 | 不适合编辑 |
| 内存使用 | 在内存中存储所有要素 | 根据视口按需加载瓦片 |
| 优化 | 要素保持其原始几何图形 | 几何图形在瓦片边界附近被剪裁 |
| 使用 | 与 VectorLayer 一起使用 | 与 VectorTileLayer 一起使用 |
| 加载 | 各种策略(all、bbox 等) | 基于瓦片的加载 |
矢量要素聚类
Cluster 源可用于对附近的要素进行分组:
性能考虑
useSpatialIndex:对于具有频繁要素更新和少量要素的源,设置为falseoverlaps:对于不重叠的几何图形(如行政边界),设置为false以启用渲染器优化wrapX:设置为false以禁用围绕世界包裹要素以获得更好的性能- 使用
addFeatures()批量添加要素比多次addFeature()调用更有效
使用要素 ID
要素可以具有可选的 ID,这可以通过 getFeatureById() 实现更快的查找。具有相同 ID 的要素被视为重复项,源中只会存储其中一个。
事件
VectorSource 触发几个事件:
addfeature:添加要素时removefeature:删除要素时changefeature:要素更改时clear:清除所有要素时featuresloadstart:要素加载开始时featuresloadend:要素加载完成时featuresloaderror:要素加载失败时