Vector-источники в OpenLayers представляют собой фундаментальный механизм работы с динамическими пространственными данными на стороне клиента. В отличие от растровых слоёв, где данные приходят в виде готовых изображений, векторные источники оперируют геометриями, атрибутами и стилями, позволяя выполнять фильтрацию, интерактивное редактирование и аналитическую обработку прямо в браузере.
Основным классом для работы с векторными данными выступает
ol/source/Vector. Он хранит коллекцию объектов
Feature, каждая из которых объединяет геометрию и набор
атрибутов.
Ключевые свойства VectorSource:
Внутренне источник не привязан к конкретному источнику данных: он может работать как с локальными объектами, так и с удалёнными API.
Базовая инициализация выполняется через объект конфигурации:
import VectorSource from 'ol/source/Vector.js';
import GeoJSON from 'ol/format/GeoJSON.js';
const source = new VectorSource({
format: new GeoJSON(),
url: '/data/objects.geojson'
});
В этом варианте OpenLayers автоматически загрузит GeoJSON, распарсит
его и создаст набор Feature.
Альтернативный вариант — ручное добавление объектов:
const source = new VectorSource();
source.addFeature(new Feature({
geometry: new Point([0, 0]),
name: 'Center point'
}));
VectorSource не работает напрямую с «сырыми» данными. Для
преобразования используется слой форматов (ol/format).
Наиболее распространённый формат:
import GeoJSON from 'ol/format/GeoJSON.js';
const format = new GeoJSON({
featureProjection: 'EPSG:3857'
});
Особенности:
Используются для обмена данными с GPS-устройствами и GIS-системами:
import KML from 'ol/format/KML.js';
import GPX from 'ol/format/GPX.js';
KML сохраняет стили и описание объектов, GPX ориентирован на треки и маршруты.
При работе с большими наборами данных ключевым фактором становится
стратегия загрузки (strategy).
Загружает весь набор данных единовременно:
import { all } from 'ol/loadingstrategy.js';
Используется для небольших слоёв, где полный объём данных не превышает допустимую нагрузку.
Загружает данные в пределах видимой области карты:
import { bbox } from 'ol/loadingstrategy.js';
Каждое изменение экстента вызывает новый запрос. Это стандарт для серверных API с поддержкой пространственных фильтров.
Разбивает загрузку на тайлы:
import { tile } from 'ol/loadingstrategy.js';
Используется при работе с крупными наборами данных, где сервер поддерживает tile-based выдачу.
При необходимости полного контроля используется
loader:
const source = new VectorSource({
loader: function (extent, resolution, projection) {
const url = `/api/objects?bbox=${extent.join(',')}`;
fetch(url)
.then(response => response.json())
.then(data => {
const features = new GeoJSON().readFeatures(data);
source.addFeatures(features);
});
}
});
Loader позволяет:
VectorSource предоставляет API для управления объектами:
source.addFeature(feature);
source.addFeatures(features);
source.removeFeature(feature);
source.clear();
Также доступны методы поиска:
const features = source.getFeatures();
И фильтрации:
const filtered = source.getFeatures().filter(f =>
f.get('type') === 'road'
);
Изменения автоматически триггерят перерисовку слоя, связанного с источником.
VectorSource генерирует события, позволяющие отслеживать состояние данных:
addfeatureremovefeaturechangefeatureclearПример обработки:
source.on('addfeature', function (event) {
console.log('Добавлен объект:', event.feature);
});
Эта модель используется для синхронизации UI и аналитики.
Для визуализации плотных наборов точек применяется
Cluster-источник:
import Cluster from 'ol/source/Cluster.js';
const clusterSource = new Cluster({
distance: 40,
source: source
});
Особенности:
Кластеризация снижает нагрузку на рендеринг и повышает читаемость карты при больших объёмах данных.
VectorSource всегда оперирует в определённой проекции. Наиболее
распространённая — EPSG:3857.
Преобразование координат выполняется через формат:
new GeoJSON({
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
Несоответствие проекций приводит к смещению объектов и некорректному отображению геометрии.
VectorSource поддерживает сценарии реального времени:
Пример периодического обновления:
setInterval(() => {
source.clear();
source.refresh();
}, 10000);
Хотя стилизация реализуется на уровне слоя, VectorSource предоставляет основу для фильтрации данных до рендера:
const features = source.getFeatures().filter(f =>
f.get('population') > 100000
);
В сочетании с StyleFunction это позволяет строить
сложные визуальные правила отображения.
При работе с VectorSource важно учитывать:
Типичные оптимизации:
Хотя он выходит за рамки классического VectorSource,
VectorTile решает проблему масштабируемости:
Это позволяет работать с миллионами объектов без деградации производительности.
VectorSource может использоваться как временное хранилище геоданных:
Такая модель часто применяется в GIS-редакторах и аналитических панелях, где данные постоянно модифицируются на клиенте.