Руководства

Создаём простой поиск «ближайшего офиса»

Компании с несколькими офисами не нужно ничего сложного, чтобы ответить на вопрос «какой офис ближе всего ко мне»: достаточно одного запроса геокодирования и короткого сравнения со списком, который редко меняется.

Геокодирование введённых данных

Вводит ли посетитель адрес или почтовый индекс, выполните геокодирование, чтобы получить координаты.

GET /v1/forward?q=Berlin, Germany&limit=1
{
  "status": "ok",
  "results": [
    {"formatted": "Berlin, Germany", "lat": 52.5200, "lon": 13.4050, "type": "locality", "precision": "city", "confidence": 0.85, "place_id": "bl456", "components": {"city": "Berlin", "country": "DE"}}
  ]
}

Сравнение со списком офисов

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

offices = [
  {"name": "Berlin", "lat": 52.5170, "lon": 13.3888},
  {"name": "Paris", "lat": 48.8566, "lon": 2.3522},
  {"name": "London", "lat": 51.5074, "lon": -0.1278}
]

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

Второй пример: поле с подсказками при вводе

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

Совпадение на уровне города

Обратите внимание: в примере выше точность равна «city», а не «house», поскольку посетитель ввёл только название города. Для поиска офиса это нормально: цель в том, чтобы выбрать ближайший офис из нескольких вариантов, а не найти конкретное здание. Более грубая точность здесь не требует особой обработки, в отличие от адреса доставки.

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

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

Пограничный случай: неоднозначное название места

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

Показывайте не только ближайший офис

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

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

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

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