Одна из наиболее частых проблем связана с несовпадением систем координат. В OpenLayers базовая веб-карта работает в проекции EPSG:3857 (Web Mercator), тогда как большинство геоданных приходит в EPSG:4326 (WGS84).
Типичная ошибка проявляется в виде «пустой карты» или объектов, смещённых на тысячи километров.
Основные симптомы:
Ключевой источник проблемы — отсутствие преобразования координат:
import { fromLonLat, transform } from 'ol/proj';
// неправильно (4326 напрямую в карту)
const point = [55.75, 37.61];
// правильно
const point = fromLonLat([37.61, 55.75]);
Для GeoJSON критично учитывать dataProjection и
featureProjection:
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const features = format.readFeatures(data, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
Частая ситуация — слой создан, но не отображается.
Основные причины:
source) не загружает данные;Проверка базовой структуры:
const layer = new TileLayer({
source: new OSM()
});
const map = new Map({
target: 'map',
layers: [layer],
view: new View({
center: [0, 0],
zoom: 2
})
});
Если слой векторный и пустой, проблема часто в источнике:
const vector = new VectorSource({
url: 'data.geojson',
format: new GeoJSON()
});
Ошибки загрузки GeoJSON часто связаны с CORS или неверным форматом данных.
При использовании внешних WMS/XYZ/WMTS источников часто возникает блокировка браузером.
Симптомы:
Причины:
Access-Control-Allow-Origin;Пример корректного XYZ слоя:
new TileLayer({
source: new XYZ({
url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
})
});
Если сервер не поддерживает CORS, требуется прокси, иначе OpenLayers не сможет получить данные.
Ошибки центра карты приводят к «пустому экрану».
Типичные причины:
[lon, lat] без преобразования;extent не соответствует данным.Ошибочный вариант:
view: new View({
center: [55.75, 37.61],
zoom: 10
});
Правильный:
view: new View({
center: fromLonLat([37.61, 55.75]),
zoom: 10
});
GeoJSON может быть валидным по JSON, но не подходить OpenLayers.
Типичные проблемы:
coordinates;type: "Feature" или
FeatureCollection;[lat, lon] вместо
[lon, lat];null или пустые массивы.Пример корректной структуры:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [37.61, 55.75]
},
"properties": {}
}
Частая ошибка — ручное создание объектов без учета спецификации OpenLayers:
new Feature({
geometry: new Point([37.61, 55.75]) // ошибка без transform
});
Стили в OpenLayers часто становятся источником неожиданных эффектов.
Основные ошибки:
undefined;fill/stroke.Ошибка:
style: function () {
if (condition) {
return new Style({ ... });
}
// ничего не возвращается
}
Правильно:
style: function () {
return new Style({
stroke: new Stroke({
color: 'blue',
width: 2
})
});
}
Для производительности стиль лучше кэшировать, иначе при большом количестве объектов начинается деградация FPS.
VectorSource не всегда автоматически обновляет отображение.
Симптомы:
Причины:
changed();modify без обновления source;Принудительное обновление:
vectorSource.addFeature(feature);
vectorSource.changed();
Конфликты между взаимодействиями приводят к «сломанных» жестов карты.
Типичные ситуации:
Draw и Select;DoubleClickZoom мешает редактированию;DragPan конфликтует с кастомными обработчиками.Пример отключения:
map.getInteractions().forEach(function (interaction) {
if (interaction instanceof DoubleClickZoom) {
interaction.setActive(false);
}
});
Метод fit() часто используется неправильно.
Ошибки:
Неправильный вариант:
map.getView().fit([]);
Правильный:
map.getView().fit(vectorSource.getExtent(), {
padding: [50, 50, 50, 50],
maxZoom: 12
});
При тысячах объектов карта начинает тормозить.
Причины:
setStyle;Кластеризация как решение:
import Cluster from 'ol/source/Cluster';
const clusterSource = new Cluster({
distance: 40,
source: vectorSource
});
OpenLayers не всегда автоматически реагирует на изменение размера контейнера.
Симптом:
Решение связано с вызовом обновления размера:
map.updateSize();
Особенно важно при:
Слои могут перекрывать друг друга неожиданным образом.
Причины:
zIndex;Пример управления:
layer.setZIndex(10);
baseLayer.setZIndex(0);
WMTS часто требует строгой конфигурации.
Типичные ошибки:
matrixSet;tileGrid;Симптом:
При динамическом создании карт или слоёв часто забывают удалять слушатели.
Проблемы:
Ошибка:
map.on('click', handler);
// без unByKey или un
Правильный подход:
import { unByKey } from 'ol/Observable';
const key = map.on('click', handler);
unByKey(key);