Проекции в картографических библиотеках определяют способ преобразования географических координат (широта и долгота) в плоские координаты, используемые для отображения карты на экране. В Leaflet вся геометрия карты строится вокруг понятия CRS (Coordinate Reference System) — системы координат, которая объединяет проекцию, единицы измерения и правила преобразования между координатами мира и пикселями.
В основе архитектуры лежит интерфейс L.CRS, через
который задаётся поведение карты при масштабировании, панорамировании и
наложении слоёв.
Стандартная система координат в Leaflet — Web Mercator.
Leaflet использует её по умолчанию через
L.CRS.EPSG3857.
Ключевые особенности:
Преобразование базируется на меркаторной проекции:
Это позволяет сохранить углы (конформность), но искажает площади ближе к полюсам.
Вторая базовая система — географическая:
В Leaflet доступна через L.CRS.EPSG4326.
Особенности:
L.CRS.Simple — плоская декартова система координат:
Применение:
Каждая CRS в Leaflet определяется набором функций:
latLngToPoint(latlng, zoom) — перевод географических
координат в пиксели;pointToLatLng(point, zoom) — обратное
преобразование;project(latlng) — проекция в плоское пространство;unproject(point) — обратная операция;scale(zoom) — масштабный коэффициент.Пример структуры:
const CRS = {
project: function (latlng) {},
unproject: function (point) {},
scale: function (zoom) {},
distance: function (latlng1, latlng2) {}
};
Эта абстракция позволяет подменять систему координат без изменения логики слоёв и тайлов.
В Web Mercator используется следующая логика:
Внутренне Leaflet использует вспомогательные классы:
L.Projection.MercatorL.Projection.SphericalMercatorПринцип:
При zoom = 0:
При увеличении зума:
Формула масштабирования:
Это значение используется для перевода координат в пиксельное пространство.
Tile layer в Leaflet полностью зависит от CRS. Каждый тайл имеет координаты:
Пример URL тайлов:
/{z}/{x}/{y}.png
При использовании EPSG:3857:
Если CRS отличается, система тайлов должна соответствовать новой сетке.
Внутренняя реализация включает:
Упрощённо:
x = R * lonRad;
y = R * ln(tan(π/4 + latRad/2));
Эта формула задаёт основу проекции.
Далее координаты нормализуются под пиксельную систему карты.
Zoom в Leaflet не является простым увеличением изображения. Он связан с CRS через масштабную функцию:
Механизм:
scale = 256 * Math.pow(2, zoom);
Это означает, что на каждом уровне зума карта становится плотнее, а не просто «увеличивается».
Leaflet позволяет задавать собственные системы координат через
L.CRS.extend.
Пример структуры:
const customCRS = L.extend({}, L.CRS, {
projection: L.Projection.LonLat,
transformation: new L.Transformation(1, 0, -1, 0)
});
Используется для:
Ключевой элемент — L.Transformation, задающий линейное
преобразование:
Все взаимодействия карты завязаны на CRS:
Пример:
map.on('click', function (e) {
console.log(e.latlng);
});
e.latlng формируется через обратное преобразование:
EPSG:3857 имеет ряд математических искажений:
Leaflet не компенсирует эти искажения, так как цель — совместимость с тайловыми сервисами.
Для сложных систем координат применяется плагин Proj4Leaflet, интегрирующий библиотеку Proj4.
Он позволяет:
Пример:
const crs = new L.Proj.CRS('EPSG:32636',
'+proj=utm +zone=36 +datum=WGS84 +units=m +no_defs', {
resolutions: [8192, 4096, 2048]
});
Это расширяет возможности Leaflet за пределы Web Mercator.
При использовании L.CRS.Simple изображение
интерпретируется как плоскость.
Пример:
const map = L.map('map', {
crs: L.CRS.Simple
});
const bounds = [[0, 0], [1000, 1000]];
L.imageOverlay('image.png', bounds).addTo(map);
В этом случае:
Разные типы слоёв по-разному реагируют на CRS:
Векторные объекты всегда хранятся в географических координатах и пересчитываются при каждом рендере.
Leaflet использует CRS также для:
Например, расстояние:
Каждая CRS может переопределять метод distance().
Viewport (область отображения) всегда вычисляется через CRS:
При изменении zoom пересчёт выполняется полностью, но географическая логика остаётся неизменной.
L.Transformation является связующим звеном между
проекцией и экраном.
Он задаёт:
Без трансформации невозможно корректно совместить координатную систему мира и пиксельный canvas браузера.