Mapbox Geocoding API — сервис преобразования адресов, названий объектов и географических описаний в координаты, а также выполнения обратной операции: получения адресной информации по известным координатам.
В экосистеме Mapbox геокодирование является одним из важнейших инструментов, поскольку позволяет связывать текстовые данные пользователей с пространственными объектами на карте. Типичные сценарии применения:
Mapbox GL JS отвечает за визуализацию карты, тогда как Geocoding API предоставляет информацию о географических объектах.
Прямое геокодирование представляет собой процесс преобразования текстового запроса в координаты.
Например:
Москва
Результат:
{
"center": [37.6176, 55.7558]
}
Другие примеры запросов:
Красная площадь
1600 Pennsylvania Avenue NW
Paris
Tokyo Station
С точки зрения пользователя процесс выглядит следующим образом:
Текстовый запрос
↓
Geocoding API
↓
Координаты и данные объекта
↓
Отображение на карте
Обратное геокодирование выполняет противоположную задачу.
Исходными данными являются координаты:
[37.6176, 55.7558]
В ответ API возвращает сведения о местоположении:
{
"place_name": "Москва, Россия"
}
Типичные сценарии использования:
Для работы с Geocoding API необходим токен доступа.
Пример конфигурации:
mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
Токен используется во всех запросах к сервисам Mapbox.
Базовый URL:
https://api.mapbox.com/geocoding/v5/mapbox.places/
Пример запроса:
https://api.mapbox.com/geocoding/v5/mapbox.places/Moscow.json?access_token=TOKEN
Структура:
/geocoding/v5/
↓
mapbox.places
↓
поисковая строка
↓
формат ответа
↓
параметры
Наиболее распространённый способ работы с Geocoding API в JavaScript — использование Fetch API.
Пример:
const query = 'Moscow';
fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?access_token=${mapboxgl.accessToken}`
)
.then(response => response.json())
.then(data => {
console.log(data);
});
Использование async/await:
async function geocode(query) {
const response = await fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?access_token=${mapboxgl.accessToken}`
);
return await response.json();
}
Типичный ответ:
{
"type": "FeatureCollection",
"query": ["moscow"],
"features": [
{
"id": "place.123",
"type": "Feature",
"place_type": ["place"],
"text": "Moscow",
"place_name": "Moscow, Russia",
"center": [37.6176, 55.7558]
}
]
}
Основные поля:
| Поле | Описание |
|---|---|
| type | Тип объекта |
| query | Исходный запрос |
| features | Список результатов |
| center | Координаты |
| text | Краткое название |
| place_name | Полное название |
| place_type | Тип объекта |
Поле features содержит найденные результаты.
Пример:
data.features.forEach(feature => {
console.log(feature.place_name);
});
Вывод:
Moscow, Russia
Moscow Oblast, Russia
Moscow River
API может вернуть несколько вариантов соответствия.
Mapbox классифицирует объекты по типам.
Наиболее распространённые:
| Тип | Описание |
|---|---|
| country | Страна |
| region | Регион |
| postcode | Почтовый индекс |
| district | Район |
| place | Город |
| locality | Населённый пункт |
| neighborhood | Микрорайон |
| address | Адрес |
| poi | Точка интереса |
Пример:
{
"place_type": ["country"]
}
После получения координат объект можно показать на карте.
const coordinates = data.features[0].center;
new mapboxgl.Marker()
.setLngLat(coordinates)
.addTo(map);
Результат:
Поиск адреса
↓
Получение координат
↓
Создание маркера
↓
Отображение на карте
Часто после поиска необходимо переместить карту к найденному объекту.
map.flyTo({
center: data.features[0].center,
zoom: 14
});
Метод flyTo() создаёт плавную анимацию перемещения.
Также можно использовать:
map.jumpTo({
center: coordinates
});
или
map.easeTo({
center: coordinates
});
Пример реализации формы поиска:
<input id="search">
<button id="find">Найти</button>
document
.getElementById('find')
.addEventListener('click', async () => {
const query =
document.getElementById('search').value;
const response = await fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?access_token=${mapboxgl.accessToken}`
);
const data = await response.json();
const feature = data.features[0];
map.flyTo({
center: feature.center,
zoom: 14
});
});
Параметр limit задаёт максимальное число
результатов.
Пример:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Paris.json
?limit=5
&access_token=${mapboxgl.accessToken}`;
Ответ будет содержать не более пяти объектов.
Можно искать только определённые типы объектов.
Поиск исключительно городов:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Paris.json
?types=place
&access_token=${mapboxgl.accessToken}`;
Поиск только адресов:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Main.json
?types=address
&access_token=${mapboxgl.accessToken}`;
Несколько типов:
types=place,address
Параметр country уменьшает количество нерелевантных
результатов.
Поиск только в России:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Moscow.json
?country=ru
&access_token=${mapboxgl.accessToken}`;
Поиск в нескольких странах:
country=ru,kz,by
Полезно для локальных сервисов.
Параметр proximity влияет на порядок выдачи
результатов.
Пример:
proximity=37.6176,55.7558
Полный запрос:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Park.json
?proximity=37.6176,55.7558
&access_token=${mapboxgl.accessToken}`;
Система отдаёт приоритет объектам, расположенным ближе к указанным координатам.
Параметр bbox задаёт прямоугольную область поиска.
Формат:
minLng,minLat,maxLng,maxLat
Пример:
bbox=37.4,55.5,37.8,55.9
Запрос:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Street.json
?bbox=37.4,55.5,37.8,55.9
&access_token=${mapboxgl.accessToken}`;
Результаты будут ограничены указанной территорией.
Для поисковых строк обычно используется параметр:
autocomplete=true
Пример:
const url =
`https://api.mapbox.com/geocoding/v5/mapbox.places/Mos.json
?autocomplete=true
&access_token=${mapboxgl.accessToken}`;
По мере ввода текста сервис будет предлагать варианты завершения запроса.
Пример реализации:
const input =
document.getElementById('search');
input.addEventListener('input', async e => {
const query = e.target.value;
if (query.length < 3) return;
const response = await fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?autocomplete=true&access_token=${mapboxgl.accessToken}`
);
const data = await response.json();
console.log(data.features);
});
Подобный подход лежит в основе большинства современных поисковых интерфейсов.
Получение адреса после выбора точки:
map.on('click', async e => {
const { lng, lat } = e.lngLat;
const response = await fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${lng},${lat}.json?access_token=${mapboxgl.accessToken}`
);
const data = await response.json();
console.log(
data.features[0].place_name
);
});
Сценарий работы:
Клик по карте
↓
Получение координат
↓
Reverse Geocoding
↓
Получение адреса
↓
Отображение информации
Результат поиска можно показать через Popup.
const feature = data.features[0];
new mapboxgl.Popup()
.setLngLat(feature.center)
.setHTML(feature.place_name)
.addTo(map);
Popup может содержать:
При работе с внешним API необходимо учитывать возможные ошибки.
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error('Request failed');
}
const data = await response.json();
} catch (error) {
console.error(error);
}
Основные причины ошибок:
Для упрощения интеграции существует официальный плагин геокодирования.
Подключение:
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v5.0.0/mapbox-gl-geocoder.min.js"></script>
<link
href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v5.0.0/mapbox-gl-geocoder.css"
rel="stylesheet">
Создание элемента поиска:
const geocoder =
new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl
});
map.addControl(geocoder);
После подключения автоматически появляются:
Плагин генерирует событие получения результата.
geocoder.on('result', event => {
console.log(event.result);
});
Объект результата содержит всю информацию, возвращаемую Geocoding API.
geocoder.on('result', event => {
const coordinates =
event.result.center;
console.log(coordinates);
});
Пример вывода:
[37.6176, 55.7558]
geocoder.on('clear', () => {
console.log('Search cleared');
});
Обычно используется для:
Частые запросы при вводе текста могут создавать избыточную нагрузку.
Для уменьшения количества обращений применяется debounce.
function debounce(callback, delay) {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
callback(...args);
}, delay);
};
}
Использование:
const search = debounce(async value => {
const response =
await fetch(url);
}, 300);
Запрос будет выполняться только после завершения ввода пользователем.
Типичная схема взаимодействия компонентов выглядит следующим образом:
Поле ввода
↓
Debounce
↓
Geocoding API
↓
Получение результатов
↓
Выбор объекта
↓
Mapbox GL JS
↓
Перемещение карты
↓
Маркер и Popup
Такой подход используется в:
Глубокая интеграция Mapbox Geocoding API и Mapbox GL JS позволяет строить полнофункциональные геопоисковые интерфейсы с поддержкой адресного поиска, подсказок, обратного геокодирования, фильтрации результатов и интерактивного отображения найденных объектов на карте.