Поисковые сервисы HERE Maps API позволяют получать географические объекты по текстовым запросам, координатам, категориям и различным фильтрам. После выполнения поискового запроса основной задачей становится корректная обработка полученных данных: извлечение нужной информации, отображение на карте, организация пользовательской навигации и выполнение последующих действий на основе найденных объектов.
Большинство поисковых операций выполняется через сервис Search API, который возвращает результаты в формате JSON. Каждый найденный объект содержит набор метаданных, необходимых для дальнейшей работы приложения.
Пример результата поиска:
{
"items": [
{
"title": "Central Park",
"id": "here:pds:place:12345",
"resultType": "place",
"address": {
"label": "Central Park, New York, NY, USA"
},
"position": {
"lat": 40.785091,
"lng": -73.968285
}
}
]
}
Массив items содержит список найденных объектов.
Наиболее распространённым способом поиска является метод
discover().
const service = platform.getSearchService();
service.discover(
{
q: "coffee",
at: "40.7128,-74.0060"
},
(result) => {
console.log(result.items);
},
(error) => {
console.error(error);
}
);
После успешного выполнения запроса массив найденных объектов становится доступен через свойство:
result.items
Каждый элемент массива представляет отдельный объект поиска.
Типичный объект содержит следующие поля:
{
title: "Starbucks",
id: "here:af:streetsection:123456",
resultType: "place",
position: {
lat: 40.7123,
lng: -74.0045
},
address: {
label: "New York, NY, USA"
},
categories: [...],
contacts: [...],
distance: 250
}
| Свойство | Назначение |
|---|---|
| title | Название объекта |
| id | Уникальный идентификатор |
| resultType | Тип результата |
| position | Географические координаты |
| address | Адрес объекта |
| distance | Расстояние от точки поиска |
| categories | Категории объекта |
| contacts | Контактные данные |
Чаще всего результаты обрабатываются циклом.
result.items.forEach((item) => {
console.log(item.title);
});
for (const item of result.items) {
console.log(item.title);
}
const names = result.items.map(item => item.title);
console.log(names);
Результат:
[
"Starbucks",
"Costa Coffee",
"Coffee House"
]
Поисковый запрос может не вернуть ни одного объекта.
if (result.items.length === 0) {
console.log("Ничего не найдено");
}
Без подобной проверки возможно возникновение ошибок при попытке обращения к первому элементу массива.
Во многих сценариях требуется только наиболее релевантный объект.
const firstResult = result.items[0];
console.log(firstResult.title);
Перед обращением необходимо убедиться, что массив не пуст.
if (result.items.length > 0) {
const firstResult = result.items[0];
}
Координаты используются для центрирования карты и построения маршрутов.
const item = result.items[0];
const lat = item.position.lat;
const lng = item.position.lng;
console.log(lat, lng);
Также возможно использовать деструктуризацию:
const { lat, lng } = item.position;
После получения координат карта может автоматически переместиться к найденному месту.
map.setCenter(item.position);
map.setZoom(15);
Более компактный вариант:
map.getViewModel().setLookAtData({
position: item.position,
zoom: 15
});
Каждый найденный объект можно визуализировать на карте.
result.items.forEach((item) => {
const marker = new H.map.Marker(item.position);
map.addObject(marker);
});
В результате все найденные точки будут отображены на карте.
Для отображения дополнительной информации используются объекты UI.
const marker = new H.map.Marker(item.position);
marker.setData(item.title);
marker.addEventListener("tap", (event) => {
const bubble = new H.ui.InfoBubble(
event.target.getGeometry(),
{
content: event.target.getData()
}
);
ui.addBubble(bubble);
});
map.addObject(marker);
При нажатии на маркер появляется информационное окно.
Полный адрес содержится в объекте address.
console.log(item.address.label);
Пример значения:
1600 Amphitheatre Parkway,
Mountain View, CA, USA
Если поиск выполняется относительно координат, HERE может вернуть расстояние до результата.
console.log(item.distance);
Пример:
250
Значение измеряется в метрах.
Для отображения в километрах:
const km = (item.distance / 1000).toFixed(1);
После получения данных можно оставить только нужные объекты.
const nearby = result.items.filter(item => {
return item.distance < 1000;
});
Останутся объекты в радиусе одного километра.
const cafes = result.items.filter(item => {
return item.title.includes("Coffee");
});
const sorted = result.items.sort((a, b) => {
return a.distance - b.distance;
});
const sorted = result.items.sort((a, b) => {
return a.title.localeCompare(b.title);
});
Иногда необходимо отображать только часть найденных объектов.
const firstFive = result.items.slice(0, 5);
Либо:
const topThree = result.items.slice(0, 3);
Результаты поиска часто выводятся рядом с картой.
const list = document.getElementById("results");
result.items.forEach(item => {
const li = document.createElement("li");
li.textContent = item.title;
list.appendChild(li);
});
При выборе элемента списка карта может автоматически переходить к соответствующему объекту.
li.addEventListener("click", () => {
map.setCenter(item.position);
map.setZoom(16);
});
Так создаётся синхронизация между интерфейсом и картой.
Каждый объект содержит поле id.
console.log(item.id);
Пример:
here:pds:place:123456789
Идентификатор может использоваться для:
Поле resultType показывает природу результата.
console.log(item.resultType);
Возможные значения:
place
street
locality
houseNumber
administrativeArea
Пример проверки:
if (item.resultType === "place") {
console.log("Найдено место");
}
Многие объекты содержат информацию о категориях.
console.log(item.categories);
Пример структуры:
[
{
id: "100-1000",
name: "Restaurant"
}
]
Получение названий категорий:
const categoryNames = item.categories.map(
category => category.name
);
console.log(categoryNames);
Для коммерческих объектов доступны контакты.
console.log(item.contacts);
Возможные данные:
Получение телефона:
const phone = item.contacts[0].phone[0].value;
Перед обращением необходимо проверять наличие данных.
if (
item.contacts &&
item.contacts.length > 0
) {
console.log(item.contacts);
}
Для удобства callback-механизм можно обернуть в Promise.
function search(query) {
return new Promise((resolve, reject) => {
service.discover(
{
q: query,
at: "40.7128,-74.0060"
},
resolve,
reject
);
});
}
Использование:
const result = await search("museum");
console.log(result.items);
Такой подход упрощает интеграцию поисковых запросов в современные приложения.
Иногда требуется разделить результаты на группы.
const grouped = {};
result.items.forEach(item => {
const category =
item.categories?.[0]?.name || "Other";
if (!grouped[category]) {
grouped[category] = [];
}
grouped[category].push(item);
});
Полученная структура:
{
Restaurant: [...],
Hotel: [...],
Museum: [...]
}
Любой поисковый запрос должен содержать обработчик ошибок.
service.discover(
{
q: "hotel",
at: "40.7128,-74.0060"
},
(result) => {
console.log(result);
},
(error) => {
console.error("Ошибка поиска:", error);
}
);
Распространённые причины ошибок:
Перед новым поиском часто требуется удалить старые маркеры.
map.removeObjects(map.getObjects());
После очистки можно отображать новые результаты.
result.items.forEach(item => {
map.addObject(
new H.map.Marker(item.position)
);
});
Если найдено несколько объектов, удобно показать их одновременно.
const group = new H.map.Group();
result.items.forEach(item => {
group.addObject(
new H.map.Marker(item.position)
);
});
map.addObject(group);
map.getViewModel().setLookAtData({
bounds: group.getBoundingBox()
});
Карта автоматически подберёт масштаб таким образом, чтобы все маркеры оказались в зоне видимости.
Результаты поиска часто используются как конечная точка маршрута.
const destination = item.position;
Далее координаты передаются в Routing API:
routingService.calculateRoute({
origin: "40.7128,-74.0060",
destination:
`${destination.lat},${destination.lng}`,
transportMode: "car"
},
onSuccess,
onError
);
Так объединяются поисковые и навигационные возможности платформы HERE.
Полный цикл работы обычно выглядит следующим образом:
items.Подобная схема лежит в основе большинства картографических приложений: сервисов доставки, навигаторов, туристических каталогов, систем мониторинга транспорта и корпоративных геоинформационных решений.