В основе работы веб-карт лежит географическая система координат WGS84, стандартизированная как EPSG:4326. Она описывает положение точки на поверхности Земли через:
В MapLibre GL JS входные географические координаты всегда задаются в формате:
[lng, lat]
Пример:
const point = [69.2401, 41.2995]; // Ташкент (пример)
Важно учитывать порядок: сначала долгота, затем широта, что часто является источником ошибок при миграции с других систем.
Для отображения карты в браузере используется проекция Web Mercator (EPSG:3857). Она преобразует сферические координаты Земли в плоскую двумерную систему.
Особенности проекции:
Преобразование из широты/долготы в координаты Web Mercator:
[ x = R ] [ y = R (( + ))]
где:
MapLibre GL JS внутри использует промежуточную систему — world coordinates.
В этой системе:
Принцип:
Это напрямую связано с системой XYZ-тайлов.
Карты в MapLibre GL JS состоят из квадратных тайлов фиксированного размера (обычно 256×256 пикселей).
Адрес тайла определяется тремя параметрами:
Формула количества тайлов:
[ n = 2^z]
Координаты тайла:
x ∈ [0, 2^z - 1]
y ∈ [0, 2^z - 1]
Особенность: ось Y направлена сверху вниз, что противоположно географической системе координат.
Zoom в MapLibre GL JS является логарифмической шкалой.
Каждое увеличение zoom на 1:
Разрешение на уровне zoom:
[ resolution(z) = ]
где 256 — размер тайла в пикселях.
MapLibre GL JS выполняет несколько преобразований:
Географическая точка сначала переводится в нормализованную мировую систему:
map.project([lng, lat]);
Результат:
{ x: number, y: number }
Далее применяется камера (центр, zoom, bearing, pitch):
map.project([lng, lat]); // экранные пиксели
Экранная система:
Обратное преобразование:
map.unproject([x, y]);
Используется при обработке событий мыши:
map.on('click', (e) => {
const coords = e.lngLat;
});
Web Mercator и MapLibre GL JS поддерживают бесшовное повторение мира по долготе.
Это означает:
Механизм wrap:
lng = ((lng + 180) % 360) - 180
При работе с визуализацией данных важно учитывать дублирование объектов при пересечении ±180°.
Система координат MapLibre GL JS тесно связана с понятием камеры, которая определяет:
Любая точка мира преобразуется через матрицу трансформации:
[ P_{screen} = M_{camera} P_{world}]
Где ( M_{camera} ) включает:
Это делает MapLibre GL JS полноценным WebGL-движком, а не просто тайловым рендерером.
В современных версиях MapLibre GL JS поддерживается альтернативная модель представления мира — globe projection.
В этом режиме:
Сравнение моделей:
Из-за особенностей Web Mercator:
lat ∈ [-85.0511, 85.0511]
Значения вне диапазона обрезаются.
MapLibre GL JS работает с координатами double precision:
При zoom > 20 возможны:
Координаты применяются в разных типах слоёв:
symbol — точки и подписиline — линии (маршруты)fill — полигоныcircle — точечная визуализацияcustom — WebGL-рендерПример линии:
{
type: "Feature",
geometry: {
type: "LineString",
coordinates: [
[69.24, 41.29],
[69.28, 41.30]
]
}
}
Перед рендерингом MapLibre GL JS:
Это обеспечивает корректное отображение даже при глобальных данных.
Все пользовательские события возвращают координаты в формате:
map.on('mousemove', (e) => {
console.log(e.lngLat); // { lng, lat }
});
Дополнительно доступны:
point — экранные координатыoriginalEvent — DOM-событиеfeatures — объекты слоя под курсором