Современные картографические приложения часто работают с объектами общественного транспорта: автобусными остановками, трамвайными платформами, железнодорожными станциями, станциями метро и транспортными узлами. В экосистеме HERE Maps такие объекты можно находить при помощи сервиса поиска (Search API), используя текстовые запросы, географические координаты и ограничения по области поиска.
Поиск транспортной инфраструктуры применяется в навигационных системах, транспортных агрегаторах, сервисах планирования маршрутов, мобильных приложениях для пассажиров и корпоративных системах мониторинга перевозок.
Поиск объектов выполняется через сервис Discover API, который позволяет находить места по ключевым словам в определённом регионе.
Пример подключения:
<script src="https://js.api.here.com/v3/3.1/mapsjs-core.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-service.js"></script>
Создание платформы:
const platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
Получение объекта поиска:
const searchService = platform.getSearchService();
Часто требуется определить остановки рядом с текущим местоположением пользователя.
Пример поиска автобусных остановок возле заданной точки:
searchService.discover({
q: 'bus stop',
at: '55.751244,37.618423',
limit: 20
}, onResult, onError);
Обработка результатов:
function onResult(result) {
console.log(result.items);
}
function onError(error) {
console.error(error);
}
Параметр at определяет центр поиска.
Параметр limit задаёт максимальное количество найденных
объектов.
Каждый найденный объект содержит:
{
title: 'Bus Stop',
id: 'here:cm:namedplace:123456',
position: {
lat: 55.75,
lng: 37.62
},
address: {
label: 'Москва, Россия'
}
}
Для поиска железнодорожных станций используется соответствующий текстовый запрос.
searchService.discover({
q: 'railway station',
at: '55.751244,37.618423',
limit: 10
}, onResult, onError);
В ответ могут быть получены:
Пример вывода:
function onResult(result) {
result.items.forEach(station => {
console.log(station.title);
});
}
Для метрополитена можно использовать текстовые ключевые слова.
searchService.discover({
q: 'metro station',
at: '55.751244,37.618423',
limit: 20
}, onResult, onError);
Поисковая система HERE анализирует категорию объекта и возвращает станции метро, находящиеся поблизости.
Получение списка названий:
function onResult(result) {
const stations = result.items.map(item => item.title);
console.log(stations);
}
Для поиска остановок трамвая используется специализированный запрос:
searchService.discover({
q: 'tram stop',
at: '55.751244,37.618423',
limit: 15
}, onResult, onError);
При необходимости запрос можно локализовать:
searchService.discover({
q: 'трамвайная остановка',
at: '55.751244,37.618423'
}, onResult, onError);
Сервис автоматически учитывает язык региона и контекст поиска.
Крупные пересадочные станции часто содержат несколько видов транспорта.
Поиск:
searchService.discover({
q: 'transport station',
at: '55.751244,37.618423',
limit: 10
}, onResult, onError);
Полученные объекты могут включать:
Поиск может выполняться не только относительно точки, но и внутри прямоугольной области.
Пример:
searchService.discover({
q: 'bus stop',
in: 'bbox:37.55,55.70,37.75,55.85'
}, onResult, onError);
Формат:
bbox:west,south,east,north
Преимущества:
После получения результатов их можно отобразить маркерами.
function onResult(result) {
result.items.forEach(item => {
const marker = new H.map.Marker({
lat: item.position.lat,
lng: item.position.lng
});
map.addObject(marker);
});
}
Каждая найденная остановка будет отображаться отдельным маркером.
Для отображения названия остановки используется UI-модуль.
Подключение:
<script src="https://js.api.here.com/v3/3.1/mapsjs-ui.js"></script>
<link rel="stylesheet"
href="https://js.api.here.com/v3/3.1/mapsjs-ui.css">
Создание интерфейса:
const ui = H.ui.UI.createDefault(map, defaultLayers);
Создание всплывающего окна:
marker.addEventListener('tap', () => {
const bubble = new H.ui.InfoBubble(
marker.getGeometry(),
{
content: item.title
}
);
ui.addBubble(bubble);
});
Если известно название остановки, можно выполнить текстовый поиск.
searchService.search({
q: 'Central Station'
}, onResult, onError);
Поиск может выполняться по:
Пример:
searchService.search({
q: 'Киевский вокзал'
}, onResult, onError);
Для ввода названия станции удобно использовать механизм подсказок.
searchService.autosuggest({
q: 'Central'
}, onResult, onError);
Полученные варианты:
function onResult(result) {
result.items.forEach(item => {
console.log(item.title);
});
}
Автодополнение позволяет реализовать:
Каждый найденный объект содержит информацию о категориях.
Пример:
result.items.forEach(item => {
console.log(item.categories);
});
Фильтрация станций метро:
const metroStations = result.items.filter(item =>
item.categories.some(category =>
category.name.toLowerCase().includes('metro')
)
);
Фильтрация автобусных остановок:
const busStops = result.items.filter(item =>
item.categories.some(category =>
category.name.toLowerCase().includes('bus')
)
);
Такой подход особенно полезен при комплексном поиске транспортных объектов.
Многие результаты содержат расстояние до точки поиска.
Пример:
result.items.sort(
(a, b) => a.distance - b.distance
);
Получение ближайшей остановки:
const nearestStop = result.items[0];
console.log(nearestStop.title);
Пример вывода:
console.log(
nearestStop.distance + ' метров'
);
Получение координат через Geolocation API:
navigator.geolocation.getCurrentPosition(
position => {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
searchService.discover({
q: 'bus stop',
at: `${lat},${lng}`,
limit: 10
}, onResult, onError);
}
);
Подобный сценарий используется практически во всех транспортных мобильных приложениях.
Полученные результаты могут отображаться в отдельной панели.
function renderStops(items) {
const container =
document.getElementById('stops');
container.innerHTML = '';
items.forEach(stop => {
const div =
document.createElement('div');
div.textContent =
`${stop.title}
(${stop.distance} м)`;
container.appendChild(div);
});
}
Вызов:
function onResult(result) {
renderStops(result.items);
}
При изменении положения карты можно автоматически выполнять новый поиск.
map.addEventListener('mapviewchangeend', () => {
const center = map.getCenter();
searchService.discover({
q: 'bus stop',
at: `${center.lat},${center.lng}`,
limit: 20
}, onResult, onError);
});
Подобный механизм используется в приложениях поиска ближайших объектов.
Чтобы уменьшить количество запросов к API, результаты можно сохранять локально.
const cache = new Map();
Сохранение:
cache.set(query, result.items);
Получение:
if (cache.has(query)) {
const items = cache.get(query);
renderStops(items);
}
Преимущества кэширования:
Иногда требуется получить все транспортные объекты вокруг пользователя.
const searches = [
'bus stop',
'metro station',
'railway station',
'tram stop'
];
Выполнение:
searches.forEach(type => {
searchService.discover({
q: type,
at: '55.751244,37.618423',
limit: 10
}, onResult, onError);
});
После объединения результатов формируется единый каталог транспортной инфраструктуры, пригодный для отображения на карте, построения маршрутов и анализа доступности общественного транспорта в выбранном регионе.