В библиотеке MapLibre GL JS географические координаты представлены специализированным объектом, инкапсулирующим долготу и широту в единую структуру. Такой подход устраняет неоднозначности при работе с координатами и обеспечивает единый интерфейс для операций преобразования, нормализации и сравнения географических точек.
Основная задача этого класса — предоставить безопасный и предсказуемый способ работы с координатами, учитывая особенности сферической модели Земли и ограничений диапазонов значений.
Объект создаётся через передачу двух числовых значений:
const point = new maplibregl.LngLat(37.6173, 55.7558);
Порядок аргументов принципиально важен: сначала долгота, затем широта. Это соответствует стандарту GeoJSON и внутренним соглашениям MapLibre GL JS.
Нарушение порядка является одной из наиболее частых ошибок при работе
с геоданными, особенно при миграции с API, где используется формат
[lat, lng].
После создания экземпляра доступны два неизменяемых смысловых свойства:
lng — значение долготы в градусахlat — значение широты в градусахconsole.log(point.lng); // 37.6173
console.log(point.lat); // 55.7558
Важно учитывать, что объект не предназначен для хранения дополнительных атрибутов — его задача строго ограничена координатной моделью.
Одной из ключевых особенностей является необходимость нормализации долготы. Географическая система координат допускает значения долготы за пределами диапазона [-180, 180], однако для корректного отображения на карте такие значения приводятся к стандартному интервалу.
Для этого используется метод:
const normalized = maplibregl.LngLat.convert([190, 10]);
или при необходимости явного «оборачивания»:
const wrapped = point.wrap();
Метод wrap() возвращает новый объект координат, в
котором долгота приведена к диапазону [-180, 180].
const p = new maplibregl.LngLat(200, 40);
const w = p.wrap();
console.log(w.lng); // -160
Это особенно важно при работе с:
Для преобразования различных форматов координат используется
статический метод convert.
Он принимает:
[lng, lat]LngLatconst a = maplibregl.LngLat.convert([30, 50]);
const b = maplibregl.LngLat.convert(a);
Такой механизм позволяет унифицировать входные данные, поступающие из разных источников (GeoJSON, API, пользовательский ввод).
Для проверки эквивалентности координат используется метод
equals.
const a = new maplibregl.LngLat(10, 20);
const b = new maplibregl.LngLat(10, 20);
console.log(a.equals(b)); // true
Сравнение производится по строгому равенству значений долготы и широты.
Следует учитывать, что метод не выполняет нормализацию автоматически:
new maplibregl.LngLat(180, 0).equals(new maplibregl.LngLat(-180, 0)); // false
Для интеграции с GeoJSON и сторонними библиотеками координаты часто преобразуются в массив:
const arr = point.toArray();
console.log(arr); // [37.6173, 55.7558]
Такой формат используется в:
Метод toString() возвращает человекочитаемое
представление координат:
console.log(point.toString());
// LngLat(37.6173, 55.7558)
Он полезен при отладке, логировании и трассировке географических данных.
Экземпляры LngLat активно используются в методах
управления картой:
map.setCenter(new maplibregl.LngLat(37.6173, 55.7558));
map.flyTo({
center: new maplibregl.LngLat(37.6173, 55.7558),
zoom: 10
});
Также часто применяются при обработке событий:
map.on('click', (e) => {
console.log(e.lngLat.lng, e.lngLat.lat);
});
Объект e.lngLat уже является экземпляром
LngLat, что упрощает дальнейшие вычисления без
дополнительного преобразования.
Работа класса учитывает фундаментальные особенности глобальной координатной системы:
При выходе за допустимые пределы широты поведение зависит от внутренних механизмов MapLibre GL JS, которые могут ограничивать значение или приводить его к ближайшему допустимому.
map.setCenter(new maplibregl.LngLat(lng, lat));
const p1 = new maplibregl.LngLat(0, 0);
const p2 = new maplibregl.LngLat(10, 10);
function handleInput(lng, lat) {
return maplibregl.LngLat.convert([lng, lat]);
}
Объект координат не предназначен для изменения после создания. Изменение значений напрямую не предусмотрено API.
point.lng = 100; // не рекомендуется и не поддерживается
Для получения новых координат создаётся новый экземпляр:
const updated = new maplibregl.LngLat(point.lng + 1, point.lat);
Такой подход снижает количество ошибок, связанных с побочными эффектами в геометрических вычислениях.
Класс тесно связан с другими географическими структурами:
LngLatBounds — описывает прямоугольные областиPoint — экранные координатыMercatorCoordinate — координаты в проекции
МеркатораПреобразование между ними осуществляется через методы MapLibre GL JS или вспомогательные утилиты.
const bounds = new maplibregl.LngLatBounds(
new maplibregl.LngLat(10, 10),
new maplibregl.LngLat(20, 20)
);
При работе с глобальными слоями возникает необходимость корректной
обработки координат, пересекающих антимеридиан. Метод
wrap() обеспечивает приведение долготы к корректному
диапазону, предотвращая визуальные артефакты:
const edge = new maplibregl.LngLat(179, 0);
const moved = new maplibregl.LngLat(181, 0);
console.log(moved.wrap().lng); // -179
Это критически важно при:
При обработке событий карта возвращает координаты в формате
LngLat, что позволяет сразу использовать их в логике
приложения:
map.on('mousemove', (e) => {
const { lng, lat } = e.lngLat;
updateMarker(lng, lat);
});
Такой подход минимизирует необходимость дополнительного преобразования и снижает вероятность ошибок формата данных.