Клуб API Карт

Множественное геокодирование

Пост в архиве.
Множественное геокодирование

Мы заметили, что достаточно часто пользователи клуба сталкиваются с задачей получения координат для списка адресов (или получения адресов для списка координат). При этом встроенный в API геокодер позволяет получать данные только для одного адреса за один запрос.

Для обработки массива адресов мы написали класс множественного геокодирования. Его интерфейс полностью соответствует интерфейсу стандартного класса геокодирования в API, т.е. принимает те же опции и также возвращает объект-обещание (Promise). С его помощью можно делать смешанное гекодирование в одном запросе: для адресов — прямое, для координат — обратное (["Москва", [55.7, 37.5]]).

Также мы написали пример с использованием этого класса.

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

Использование этого класса позволяет решить проблемы, возникающие из-за асинхронности работы геокодера. Когда для каждого адреса из списка отправляется отдельный http-запрос, при этом время ответа сервера может быть разное, и как следствие, результаты могут прийти в разном порядке, например пятый адрес может прийти вторым и т.д. Написанный нами класс решает сразу две задачи:
1. Расположить найденные результаты в правильном порядке, соответствующем порядку в массиве адресов во входных данных.
2. Дождавшись ответа по всем запросам, сигнализировать о успешном выполнении и отдать агрегированный результат или вернуть ошибку.

Выбирая решение для вашего проекта, рекомендуем учитывать, что иногда лучше прогеокодировать все адреса на сервере, записать их в базу и работать на клиенте уже с координатами. Таким образом вы сэкономите трафик пользователей. Алгоритм множественного геокодирования на сервере подробно рассмотрен в статье «Получение координат для списка адресов».

9 комментариев

Добрый день, это Вы по мою душу ссылку опубликовали?

Если Вам она поможет, я буду счастлива :-)

можно еще вопросик? В API 1 была функция redraw(), когда скрывали карту, потом снова показывали, то инфа на карте оставалась и не перерисовывалась, а так же сохраняласть позиция на карте. Есть ли аналог данной функции в API 2?

map.container.fitToViewport();

Спасибо, опробую

Евгений Белоусов
28 января 2016, 03:53

Было бы намного лучше, если все это было одним запросом к серверу. а так, это множественным геокодированием назвать нельзя ((

В этой статье речь идет о множественном геокодировании на клиенте. Про серверное геокодирование тут.

Или Вы что-то другое имеете ввиду?

Евгений Белоусов
28 января 2016, 03:53

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

 

В апи это сделано проще

что и где в АПИ сделано проще?

 

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

С чего такой вывод?

Запросы выполняются один за другим (оч. быстро),

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