Руководства

Создаём поиск магазинов с обратным геокодированием

Поиску магазинов нужны две вещи, работающие вместе: способ узнать, где находится клиент, и список координат магазинов для сравнения. Обратное геокодирование аккуратно решает первую часть.

Превращаем координаты в понятное местоположение

Получив координаты клиента, из введённого им местоположения или из определения по IP, выполните их обратное геокодирование, чтобы показать клиенту понятное название места и подтвердить место поиска до вывода результатов.

GET /v1/reverse?lat=51.5074&lon=-0.1278
{
  "status": "ok",
  "formatted": "Trafalgar Square, London, UK",
  "lat": 51.5074,
  "lon": -0.1278,
  "type": "address",
  "precision": "street",
  "confidence": 0.9,
  "place_id": "lm345",
  "components": {"city": "London", "country": "GB"}
}

Поиск ближайших магазинов

API возвращает координаты, а не расстояния между двумя произвольными точками, поэтому, получив широту и долготу клиента, вычислите расстояние до каждого магазина из своего списка стандартной формулой расстояния по большому кругу для двух пар координат. Отсортируйте список магазинов по этому расстоянию и покажите несколько ближайших.

Возможность ввести адрес вручную

Не каждый посетитель поделится своим местоположением. Для поиска по введённому адресу сначала выполните геокодирование текста через /v1/forward, чтобы получить координаты, а затем проведите то же вычисление расстояния до ближайших магазинов по этому результату. Если вы хотите, чтобы подсказки появлялись во время ввода, а не после полного адреса, /v1/autocomplete может обслуживать поле с подсказками, которое передаёт place_id или уточнённый текст на тот же шаг прямого геокодирования.

Второй пример: мобильное приложение с GPS устройства

Нативное приложение может пропустить шаг обратного геокодирования при поиске ближайших магазинов, так как у него уже есть исходные координаты устройства, которые можно напрямую сравнить со списком магазинов. Но обратное геокодирование и там оправдывает себя для текста подтверждения, который видит клиент, например «Показаны магазины рядом с Трафальгарской площадью, Лондон» вместо голой пары чисел. Это убеждает клиента, что приложение правильно поняло его местоположение, прежде чем он начнёт листать результаты.

Распространённая ошибка, которой стоит избегать

Не рассчитывайте, что каждый введённый адрес геокодируется с точностью до дома, прежде чем запускать вычисление расстояния. Общий запрос, например только название города, всё равно вернёт результат, но с более грубой точностью, и если считать такую приблизительную точку точным зданием клиента, ранжирование «ближайших магазинов» окажется менее надёжным, чем подсказали бы поля confidence и precision.

Два магазина на одинаковом расстоянии

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

Подтверждение совпадения

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

Сколько это стоит

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

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