LngLat — базовый класс в MapLibre GL JS, предназначенный для строгого представления географических координат в формате долготы и широты. Он инкапсулирует работу с координатными парами и обеспечивает предсказуемую нормализацию значений, что критически важно при работе с веб-картами, проекциями и вычислениями расстояний на сфере.
Класс LngLat используется для хранения координат в
формате:
Ключевая особенность заключается в том, что долгота и широта всегда приводятся к корректным диапазонам, что снижает вероятность ошибок при взаимодействии с географическими данными.
Создание объекта:
import { LngLat } from 'maplibre-gl';
const coord = new LngLat(30.5, 50.45);
Альтернативная форма:
const coord = new LngLat({ lng: 30.5, lat: 50.45 });
LngLat автоматически нормализует входные значения:
Пример поведения:
new LngLat(190, 95);
Результат:
Это поведение важно при работе с пользовательским вводом и динамическими источниками данных, где координаты могут выходить за пределы допустимых значений.
toArray()Возвращает координаты в виде массива:
const coord = new LngLat(30, 50);
coord.toArray(); // [30, 50]
Используется при взаимодействии с GeoJSON и низкоуровневыми API.
toString()Возвращает строковое представление:
coord.toString(); // "LngLat(30, 50)"
Полезно для логирования и отладки.
wrap()Метод возвращает новый объект LngLat, где долгота
приведена к диапазону [-180, 180], без изменения широты:
const coord = new LngLat(540, 40);
const wrapped = coord.wrap();
Результат:
Этот метод особенно важен при работе с повторяющимися мирами (wrapped world copies), когда карта отображает несколько копий земной поверхности.
Для проверки равенства координат используется метод:
coord1.equals(coord2);
Он учитывает точность значений и возвращает true, если
координаты совпадают.
Класс LngLatBounds представляет прямоугольную область на
карте, заданную двумя координатами:
import { LngLatBounds } from 'maplibre-gl';
const bounds = new LngLatBounds(
new LngLat(10, 40),
new LngLat(20, 50)
);
Также допускается массивный формат:
const bounds = new LngLatBounds([10, 40], [20, 50]);
LngLatBounds используется для:
Геометрически объект представляет прямоугольник в координатах долготы и широты, но с учётом особенностей глобальной сферы.
extend()Расширяет границы, включая новую точку или другой bounding box:
bounds.extend(new LngLat(25, 55));
или:
bounds.extend([25, 55]);
При расширении происходит пересчёт min/max значений по осям.
getCenter()Возвращает центр прямоугольника:
const center = bounds.getCenter();
Центр вычисляется как среднее значение между минимальными и максимальными координатами.
getNorthEast() и
getSouthWest()Позволяют получить углы:
bounds.getNorthEast();
bounds.getSouthWest();
Эти методы возвращают новые объекты LngLat.
toArray()Представляет границы в виде массива:
bounds.toArray();
Результат:
[
[swLng, swLat],
[neLng, neLat]
]
toString()Строковое представление:
bounds.toString();
Используется для логирования и диагностики.
contains()Определяет, находится ли точка внутри границ:
bounds.contains(new LngLat(15, 45));
Возвращает true, если координата попадает в
прямоугольник.
Хотя прямого метода intersects() может не быть в базовом
API, пересечение можно определить через сравнение диапазонов:
function intersects(a, b) {
return !(
a.getNorthEast().lng < b.getSouthWest().lng ||
a.getSouthWest().lng > b.getNorthEast().lng ||
a.getNorthEast().lat < b.getSouthWest().lat ||
a.getSouthWest().lat > b.getNorthEast().lat
);
}
Одно из основных применений — ограничение перемещения карты:
map.setMaxBounds(
new LngLatBounds(
[-10, 35],
[40, 60]
)
);
Это предотвращает уход пользователя за пределы заданной области.
При пересечении линии ±180° долготы возникает сложность интерпретации
границ. LngLatBounds учитывает это, но разработчик должен
быть осторожен:
extend() может давать неожиданные результаты при
глобальных диапазонахwrap() для точекLngLat является базовой единицей, тогда как
LngLatBounds агрегирует их:
extendLngLatcontains принимает LngLatПример построения границ по набору точек:
const coords = [
new LngLat(10, 10),
new LngLat(20, 20),
new LngLat(15, 25)
];
const bounds = new LngLatBounds(coords[0], coords[0]);
coords.forEach(c => bounds.extend(c));
Оба класса активно используются в управлении камерой:
map.fitBounds(bounds, {
padding: 20,
maxZoom: 10
});
Алгоритм автоматически вычисляет оптимальный центр и масштаб.
Работа с координатами в MapLibre GL JS основана на числах с плавающей точкой, что накладывает ограничения:
equals, а не через
===Частые проблемы при работе с LngLat и
LngLatBounds:
LngLat и LngLatBounds выступают
фундаментальными примитивами геометрии: