Библиотека OpenLayers предназначена для создания интерактивных
веб-карт. Базовым объектом любой карты является экземпляр класса
Map, который объединяет источники данных, слои, элементы
управления и область отображения.
Первая карта обычно включает три обязательных компонента:
Даже самый простой проект строится вокруг этих элементов.
Современные проекты чаще всего используют OpenLayers через менеджеры пакетов, однако для быстрого старта библиотеку можно подключить напрямую через CDN.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Первая карта OpenLayers</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/ol/ol.css"
>
<style>
#map {
width: 100%;
height: 500px;
}
</style>
</head>
<body>
<div id="map"></div>
<script type="module" src="main.js"></script>
</body>
</html>
Ключевым элементом является контейнер:
<div id="map"></div>
Именно внутри него OpenLayers будет отображать карту.
Минимальная структура может выглядеть следующим образом:
project/
│
├── index.html
└── main.js
Файл index.html содержит разметку страницы, а
main.js отвечает за создание и настройку карты.
В OpenLayers карта создаётся через класс Map.
Простейший пример:
import Map from 'https://cdn.jsdelivr.net/npm/ol@latest/Map.js';
import View from 'https://cdn.jsdelivr.net/npm/ol@latest/View.js';
const map = new Map({
target: 'map',
view: new View({
center: [0, 0],
zoom: 2
})
});
После выполнения кода объект карты будет создан, но пользователь увидит пустую область. Причина заключается в отсутствии слоёв.
Карта отображает данные через слои. Наиболее распространённым стартовым вариантом является использование картографического сервиса OpenStreetMap.
Для этого потребуется слой TileLayer и источник данных
OSM.
import Map from 'https://cdn.jsdelivr.net/npm/ol@latest/Map.js';
import View from 'https://cdn.jsdelivr.net/npm/ol@latest/View.js';
import TileLayer from 'https://cdn.jsdelivr.net/npm/ol@latest/layer/Tile.js';
import OSM from 'https://cdn.jsdelivr.net/npm/ol@latest/source/OSM.js';
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
После загрузки страницы появится полноценная интерактивная карта мира.
Свойство target определяет HTML-элемент, в котором
отображается карта.
Пример:
target: 'map'
OpenLayers найдёт элемент:
<div id="map"></div>
и разместит внутри него карту.
Также можно передавать ссылку на DOM-элемент напрямую:
const container = document.getElementById('map');
const map = new Map({
target: container
});
Оба подхода эквивалентны.
Слой представляет собой источник визуальной информации.
На одной карте может находиться несколько слоёв:
Пример массива слоёв:
layers: [
layer1,
layer2,
layer3
]
OpenLayers отображает их сверху вниз в порядке расположения.
Класс View управляет отображаемой областью карты.
Он отвечает за:
Пример:
view: new View({
center: [0, 0],
zoom: 2
})
Если сравнить карту с фотоаппаратом, то слой содержит изображение, а
View определяет положение и увеличение объектива.
Многие начинающие разработчики ожидают увидеть центр карты в виде широты и долготы.
Например:
center: [37.6176, 55.7558]
Однако OpenLayers по умолчанию использует проекцию Web Mercator
(EPSG:3857), а не географические координаты
(EPSG:4326).
Поэтому координаты необходимо преобразовывать.
Для этого используется функция fromLonLat.
import { fromLonLat } from 'https://cdn.jsdelivr.net/npm/ol@latest/proj.js';
Пример для Москвы:
view: new View({
center: fromLonLat([37.6176, 55.7558]),
zoom: 10
})
Теперь центр карты будет установлен корректно.
Рассмотрим несколько примеров.
center: fromLonLat([37.6176, 55.7558])
center: fromLonLat([30.3351, 59.9343])
center: fromLonLat([76.8860, 43.2389])
center: fromLonLat([71.4304, 51.1282])
Во всех случаях используется порядок:
[долгота, широта]
Это важное правило OpenLayers.
Параметр zoom определяет уровень приближения.
Пример:
zoom: 2
Приблизительное соответствие масштабов:
| Zoom | Отображение |
|---|---|
| 1 | Почти весь мир |
| 3 | Континенты |
| 5 | Крупные страны |
| 8 | Регионы |
| 10 | Города |
| 13 | Районы города |
| 16 | Улицы |
| 18+ | Отдельные здания |
Чем больше значение, тем сильнее увеличение.
Иногда требуется запретить слишком сильное удаление или приближение.
Для этого используются параметры:
view: new View({
center: fromLonLat([37.6176, 55.7558]),
zoom: 10,
minZoom: 5,
maxZoom: 18
})
Теперь пользователь не сможет выйти за указанные пределы.
import Map from 'https://cdn.jsdelivr.net/npm/ol@latest/Map.js';
import View from 'https://cdn.jsdelivr.net/npm/ol@latest/View.js';
import TileLayer from 'https://cdn.jsdelivr.net/npm/ol@latest/layer/Tile.js';
import OSM from 'https://cdn.jsdelivr.net/npm/ol@latest/source/OSM.js';
import { fromLonLat } from 'https://cdn.jsdelivr.net/npm/ol@latest/proj.js';
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: fromLonLat([37.6176, 55.7558]),
zoom: 10,
minZoom: 3,
maxZoom: 19
})
});
После загрузки страницы будет отображена карта OpenStreetMap с центром на Москве.
Одной из наиболее распространённых проблем является невидимая карта.
Причина часто заключается в отсутствии высоты контейнера.
Неправильно:
#map {
width: 100%;
}
В этом случае высота равна нулю.
Правильно:
#map {
width: 100%;
height: 500px;
}
Или:
#map {
width: 100%;
height: 100vh;
}
Во втором случае карта займёт весь экран браузера.
Пример оформления:
html,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
Такой подход часто используется в геоинформационных системах и картографических сервисах.
После создания карты автоматически появляются стандартные элементы интерфейса:
Дополнительная настройка для базового сценария не требуется.
После создания экземпляра можно обращаться к нему программно.
Например:
console.log(map);
Получение текущего масштаба:
const zoom = map.getView().getZoom();
console.log(zoom);
Получение центра:
const center = map.getView().getCenter();
console.log(center);
Изменение масштаба:
map.getView().setZoom(12);
Изменение центра:
map.getView().setCenter(
fromLonLat([37.6176, 55.7558])
);
Карта обновится автоматически.
Процесс отображения карты обычно состоит из следующих этапов:
View.Map.Понимание этой последовательности значительно упрощает дальнейшее изучение библиотеки.
#map {
width: 100%;
}
Результат — карта не отображается.
const map = new Map({
target: 'map'
});
Результат — пустая область без картографических данных.
Неверно:
fromLonLat([55.7558, 37.6176])
Правильно:
fromLonLat([37.6176, 55.7558])
Порядок всегда следующий:
[долгота, широта]
Неверно:
center: [37.6176, 55.7558]
Правильно:
center: fromLonLat([37.6176, 55.7558])
Преобразование необходимо из системы WGS84 в Web Mercator.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/ol/ol.css">
<style>
html,
body {
margin: 0;
width: 100%;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script type="module">
import Map from 'https://cdn.jsdelivr.net/npm/ol@latest/Map.js';
import View from 'https://cdn.jsdelivr.net/npm/ol@latest/View.js';
import TileLayer from 'https://cdn.jsdelivr.net/npm/ol@latest/layer/Tile.js';
import OSM from 'https://cdn.jsdelivr.net/npm/ol@latest/source/OSM.js';
import { fromLonLat } from 'https://cdn.jsdelivr.net/npm/ol@latest/proj.js';
new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: fromLonLat([37.6176, 55.7558]),
zoom: 10
})
});
</script>
</body>
</html>
Этот пример демонстрирует полный набор базовых компонентов
OpenLayers: контейнер карты, слой с данными OpenStreetMap, объект
представления (View) и объект карты (Map). На
этой основе строятся все более сложные картографические приложения — от
отображения отдельных маркеров до полноценных геоинформационных
систем.