首页 / OpenLayers / API 文档
VectorSource
先看结论
矢量数据源。持有要素集合,负责增删、按 id 检索、范围计算,也可以从远程服务按需加载。
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)。