Работа с координатами является фундаментальной частью любого картографического приложения. В Mapbox GL JS координаты используются для позиционирования карты, отображения маркеров, построения геометрических объектов, выполнения пространственных вычислений и взаимодействия с пользовательскими событиями.
Библиотека опирается на географическую систему координат WGS84, которая использует значения широты (latitude) и долготы (longitude) для определения положения точки на поверхности Земли.
Во всех основных API Mapbox GL JS координаты передаются в формате:
[longitude, latitude]
Пример:
[37.6176, 55.7558]
Данная запись соответствует координатам Москвы:
37.617655.7558Важно помнить, что порядок отличается от привычной записи на многих географических сервисах, где сначала указывается широта.
Правильно:
[37.6176, 55.7558]
Неправильно:
[55.7558, 37.6176]
Ошибочный порядок координат приводит к отображению объектов в совершенно другой точке мира.
Для представления географических координат Mapbox GL JS предоставляет
специальный класс LngLat.
Создание объекта:
const point = new mapboxgl.LngLat(
37.6176,
55.7558
);
Получение отдельных значений:
console.log(point.lng);
console.log(point.lat);
Результат:
37.6176
55.7558
Экземпляр LngLat является объектно-ориентированным
представлением обычного массива координат.
Начальное положение карты задаётся через параметр
center.
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [37.6176, 55.7558],
zoom: 10
});
После загрузки карта будет центрирована на указанных координатах.
Текущий центр карты можно получить методом
getCenter().
const center = map.getCenter();
console.log(center);
Результат:
LngLat {
lng: 37.6176,
lat: 55.7558
}
Доступ к отдельным координатам:
const center = map.getCenter();
console.log(center.lng);
console.log(center.lat);
Для совместимости с другими API объект можно преобразовать обратно в массив.
const center = map.getCenter();
const coords = center.toArray();
console.log(coords);
Результат:
[37.6176, 55.7558]
Создание объекта из массива:
const coords = [37.6176, 55.7558];
const point = mapboxgl.LngLat.convert(coords);
После преобразования доступны свойства объекта:
console.log(point.lng);
console.log(point.lat);
Маркер размещается на карте с помощью метода
setLngLat().
new mapboxgl.Marker()
.setLngLat([37.6176, 55.7558])
.addTo(map);
Использование объекта LngLat также допустимо:
const point = new mapboxgl.LngLat(
37.6176,
55.7558
);
new mapboxgl.Marker()
.setLngLat(point)
.addTo(map);
Координаты существующего маркера можно получить через
getLngLat().
const marker = new mapboxgl.Marker()
.setLngLat([37.6176, 55.7558])
.addTo(map);
const position = marker.getLngLat();
console.log(position.lng);
console.log(position.lat);
Для перетаскиваемых маркеров часто требуется отслеживать новые координаты.
const marker = new mapboxgl.Marker({
draggable: true
})
.setLngLat([37.6176, 55.7558])
.addTo(map);
marker.on('dragend', () => {
const pos = marker.getLngLat();
console.log(pos.lng);
console.log(pos.lat);
});
Каждое событие мыши содержит географические координаты точки взаимодействия.
map.on('click', (event) => {
console.log(event.lngLat);
});
Результат:
LngLat {
lng: 37.62,
lat: 55.75
}
Получение отдельных значений:
map.on('click', (event) => {
console.log(event.lngLat.lng);
console.log(event.lngLat.lat);
});
Частая задача — добавление маркера в точку нажатия.
map.on('click', (event) => {
new mapboxgl.Marker()
.setLngLat(event.lngLat)
.addTo(map);
});
Теперь каждый клик создаёт новый маркер в выбранной позиции.
GeoJSON является основным форматом пространственных данных в Mapbox GL JS.
Точка:
{
"type": "Point",
"coordinates": [37.6176, 55.7558]
}
Линия:
{
"type": "LineString",
"coordinates": [
[37.6176, 55.7558],
[37.6500, 55.7700],
[37.7000, 55.7800]
]
}
Полигон:
{
"type": "Polygon",
"coordinates": [
[
[37.60, 55.75],
[37.70, 55.75],
[37.70, 55.80],
[37.60, 55.80],
[37.60, 55.75]
]
]
}
Во всех случаях используется порядок:
[longitude, latitude]
Для определения текущей видимой области используется метод
getBounds().
const bounds = map.getBounds();
Получение углов:
console.log(bounds.getNorthEast());
console.log(bounds.getSouthWest());
Пример результата:
LngLat {
lng: 37.85,
lat: 55.90
}
LngLat {
lng: 37.30,
lat: 55.55
}
Класс LngLatBounds представляет прямоугольную область на
карте.
Создание:
const bounds = new mapboxgl.LngLatBounds(
[37.30, 55.55],
[37.85, 55.90]
);
Где:
Метод fitBounds() автоматически подбирает масштаб таким
образом, чтобы вся область оказалась в пределах экрана.
const bounds = [
[37.30, 55.55],
[37.85, 55.90]
];
map.fitBounds(bounds);
С отступами:
map.fitBounds(bounds, {
padding: 50
});
const bounds = map.getBounds();
const point = [37.6176, 55.7558];
console.log(
bounds.contains(point)
);
Результат:
true
или
false
Долгота может изменяться от:
-180 до 180
Широта:
-90 до 90
Примеры:
[-74.0060, 40.7128]
Нью-Йорк.
[2.3522, 48.8566]
Париж.
[139.6917, 35.6895]
Токио.
При работе с картой мира значение долготы может выходить за пределы диапазона.
Например:
[190, 55]
или
[-190, 55]
Метод wrap() приводит координаты к корректному
диапазону.
const point = new mapboxgl.LngLat(
190,
55
);
const wrapped = point.wrap();
console.log(wrapped);
Результат:
LngLat {
lng: -170,
lat: 55
}
Иногда требуется узнать положение точки внутри HTML-контейнера карты.
Для этого используется метод project().
const pixel = map.project(
[37.6176, 55.7558]
);
console.log(pixel);
Результат:
Point {
x: 512,
y: 341
}
Координаты указываются в пикселях относительно контейнера карты.
Обратная операция выполняется методом unproject().
const lngLat = map.unproject([
512,
341
]);
console.log(lngLat);
Результат:
LngLat {
lng: 37.6176,
lat: 55.7558
}
Метод полезен при создании собственных HTML-элементов поверх карты.
const point = map.project(
[37.6176, 55.7558]
);
element.style.left = `${point.x}px`;
element.style.top = `${point.y}px`;
Таким образом можно синхронизировать произвольные DOM-элементы с географическими объектами.
Перемещение камеры к определённой точке:
map.flyTo({
center: [37.6176, 55.7558],
zoom: 12
});
Плавный переход:
map.easeTo({
center: [37.6176, 55.7558],
duration: 3000
});
Координаты определяют конечную позицию камеры после завершения анимации.
Массив координат может использоваться для вычисления общей области отображения.
const points = [
[37.6176, 55.7558],
[37.7000, 55.8000],
[37.5000, 55.7000]
];
Создание ограничивающего прямоугольника:
const bounds = new mapboxgl.LngLatBounds();
points.forEach(point => {
bounds.extend(point);
});
После чего область отображается целиком:
map.fitBounds(bounds, {
padding: 40
});
Такой подход широко применяется при отображении маршрутов, групп объектов, кластеров и результатов поиска.
| Объект | Назначение |
|---|---|
LngLat |
Представление одной географической точки |
LngLatBounds |
Прямоугольная область карты |
getCenter() |
Получение центра карты |
setLngLat() |
Установка координат объекта |
getLngLat() |
Получение координат объекта |
getBounds() |
Получение видимой области |
fitBounds() |
Масштабирование по области |
contains() |
Проверка принадлежности точки области |
project() |
Преобразование координат в пиксели |
unproject() |
Преобразование пикселей в координаты |
wrap() |
Нормализация долготы |
flyTo() |
Анимированное перемещение камеры |
easeTo() |
Плавное изменение положения карты |
Корректное понимание системы координат Mapbox GL JS является основой для работы с маркерами, слоями, GeoJSON-данными, пользовательскими событиями, геометрическими вычислениями и любыми пространственными операциями внутри картографического приложения.