Поиск остановок и станций

Современные картографические приложения часто работают с объектами общественного транспорта: автобусными остановками, трамвайными платформами, железнодорожными станциями, станциями метро и транспортными узлами. В экосистеме HERE Maps такие объекты можно находить при помощи сервиса поиска (Search API), используя текстовые запросы, географические координаты и ограничения по области поиска.

Поиск транспортной инфраструктуры применяется в навигационных системах, транспортных агрегаторах, сервисах планирования маршрутов, мобильных приложениях для пассажиров и корпоративных системах мониторинга перевозок.


Использование 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);

}

Преимущества кэширования:

  • уменьшение нагрузки на сеть;
  • ускорение интерфейса;
  • снижение количества запросов к HERE API;
  • улучшение пользовательского опыта.

Комбинированный поиск нескольких типов транспорта

Иногда требуется получить все транспортные объекты вокруг пользователя.

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);

});

После объединения результатов формируется единый каталог транспортной инфраструктуры, пригодный для отображения на карте, построения маршрутов и анализа доступности общественного транспорта в выбранном регионе.