经纬志
首页 / OpenLayers / API 文档

VectorSource

先看结论

矢量数据源。持有要素集合,负责增删、按 id 检索、范围计算,也可以从远程服务按需加载。

最后验证 2026-11-03 · OpenLayers 10.3.1 · 更新 2026-10-27 · 引用本文
new ol.source.Vector(options)

构造参数

参数说明
features初始要素数组
format解析器,如 new ol.format.GeoJSON()
url数据地址,可为字符串或返回字符串的函数
loader自定义加载函数,替代默认的 fetch 流程
strategy加载策略,如 ol.loadingstrategy.bbox
wrapX是否在东西方向重复,跨 180 度时需要
useSpatialIndex是否建立空间索引,默认 true,大数量时必须开
overlaps范围判断是否允许重叠,影响重载时的去重

常用方法

方法说明
addFeature(f)加入单个要素
addFeatures(arr)批量加入,只触发一次重绘
removeFeature(f)移除指定要素
clear()清空全部要素
getFeatures()返回要素数组,顺序即加入顺序
getFeatureById(id)按 id 查要素
forEachFeature(cb)遍历,比先取数组再循环更省内存
getExtent()所有要素的总范围,投影坐标
getClosestFeatureToCoordinate(c)找最近的要素,适合吸附
refresh()强制重载远程数据
var source = new ol.source.Vector();

source.addFeatures([
  new ol.Feature({
    geometry: new ol.geom.Point(ol.proj.fromLonLat([116.391263, 39.907359])),
    id: 'tam'
  })
]);

/* 缩放到全部要素,注意判空:没有要素时 getExtent 返回空范围 */
var extent = source.getExtent();
if (!ol.extent.isEmpty(extent)) {
  map.getView().fit(extent, { padding: [50, 50, 50, 50], maxZoom: 15 });
}

按需加载 GeoJSON

指定 url、format 与 strategy 后, 数据源只会在需要时请求当前范围的数据。 初始化时调用一次 loadFeatures 触发首屏加载:

var source = new ol.source.Vector({
  url: '/api/pois.geojson',
  format: new ol.format.GeoJSON({
    dataProjection: 'EPSG:4326',
    featureProjection: 'EPSG:3857'
  }),
  strategy: ol.loadingstrategy.bbox
});

source.loadFeatures(
  map.getView().calculateExtent(map.getSize()),
  map.getView().getResolution(),
  map.getView().getProjection()
);

要素自带的投影由解析器的 featureProjection 决定。 漏写时要素保持经纬度,与视图投影不一致,位置会整体偏到地图外。

增删的批量原则

每调用一次 addFeature 都会让图层重绘一次。 导入上千条记录时应先收集成数组,再 addFeatures; 清空重建时配合 clear() 使用即可。

引用本文

经纬志(2026)。《VectorSource》。https://www.jingweizhi.com/openlayers/api/vector-source.html(访问日期 2026-11-03)。