Клуб API Карт

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

Пост в архиве.

Здравствуйте!

мной была иницирована тема - http://clubs.ya.ru/mapsapi/replies.xml?item_no=57754&with_parent=1&parent_id=57763&for_reply=text.

хотелось остаться в рамках ее, но ответа уже в течении 2-3 недель дождаться не могу.

 

задача: информация об объектах карты берется со стороннего сервера(набор открытых данных Вологодского портала открытых данных, данные могут меняться) - записывается в масив. Далее надо их геокодировать.

Объектов мб много.

 

Бабушка-бэтмэн советовал использовать геокодирование на стороне сервера с кэшированием.

Сейчас использую локальный сервер. Скачала node.js поставила модуль с помощью команды

npm install multi-geocoder

в папке с проектом появилось \node_modules\multi-geocoder\*

пытаюсь использовать код из примера, попробовать геокодировать:

var MultiGeocoder = require('multi-geocoder'), geocoder = new MultiGeocoder({ coordorder: 'latlong', lang: 'ru-RU' }); geocoder.geocode([ 'Москва, 1905 года ул., д.19', 'Москва, 1-ая Квесисская ул., д 18', 'Москва, 1-й Тверской-Ямской пер, д.16' ], { // Описание объектов в ответе будет на алглийском языке, // несмотря на то что параметр lang задан также в конструкторе MultiGeocoder. lang: 'en-US' }) .then(function (res) { console.log(res); });

 



В консоли пишет ошибку: ReferenceError: require is not defined

Значит не подключены скрипты?

Что подключить - index.js?

 

В интернете каких либо "глубоких" инструкций по этому вопросу не нашла, может быть и плохо искала. В клубе тоже ничего.

 

Можете разжевать для "неодоренных"?

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

Где вы выполняете код из примера? В браузере? )

Старалась) пока ждала ответа нашла пост, что надо делать из консоли. Мне так не надо:)

ТОгда остается лишь одно использовать БД да? чтобы один раз геокодировать все, а потом брать координаты из БД?

Других способов чтобы не попасть в бан не найти, верно?

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

Ну сначала первй мой пост назывался по-другому.

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

Таким образом надо определить координаты объектов. Потом отобразить их, и при этом желательно обойтись без БД.

Написав все это епврый раз и дума использоваться gocode для каждого объекта, получила от вас ответ что если я буду это делать каждый раз на стороне клиента, то тогда "получу в лоб". И вы меня направили на геокодирование на стороне сервера.

 

Стала изучать тему.

Я думала что в моем случае это будет примерно так: получила объекты, смотрю их координаты уже в существующем отвте геокодера, если его нет, то зауская скрипт ктороый лежит на сервере.

Да я не права что спрашиваю глупости и стала писать код в браузере.

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

 

 

Если пропустить то что я делала не правильно, то ответ на мой вопрос будет каким?

Чтобы не геокоировать все объекты на каждом клиенте, то надо все равно использовать какую то БД, или xml генерировать да? Иначе эт будет плохо?

Еще раз, давайте на пальцах...

 

вариант первый – делаем на клиенте (как вы изначально хотели):

у вас 100 точек – это 100 запросов в геокодер.

к вам пришло в день 250 посетителей

100 * 250 = 25 000 запросов – вы превысили лимит и вас забанили, это конечно если раньше вы не "получили в лоб" от своих пользователей за такое.

 

вариант второй – делаем то же самое на сервере,

на клиенте берем адреса и склеиваем через разделитель (например тильда "~") в одну строку (Москва~Новосибирск~и так далее) , отправляем на ВАШ сервер ОДИН запрос вместо 100 к Яндексу, на вашем сервере разбиваем строку на отдельные адреса через тот же разделитель, с него идем с каждым из них в http-геокодер, получаем результат, склеиваем все результаты в один, отдаем его обратно клиенту в браузер как ответ на первый запрос.

С Яндексом ничего не изменилось 100 * 250 = 25000 

Вас снова забанили. Но уже хорошо что вы не "получили  в лоб" от пользователей, отправив один запрос вместо 100

 

вариант третий – улучшаем вариант второй

Начало идентичное, далее вам на сервер пришла строка адресов через разделитель.

Для каждого адреса полученный из геокодера Яндекса результат сохраняете в кэш (с помощью memcached, redis, любой програмный кэш) используя адрес как строковый ключ

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

Результат склеивается частично из кэша, частично из ответов Яндекса (которые так же кладутся в кэш) и отдается клиенту.

Вас не забанили и синяки на лбу почти прошли, Ураааа!!!

 

ИТОГО:

что в третьем варианте у вас не получается?

 

PS:

Мы не хотим чтобы в качестве кэша использовалась БД потому что:

во-первых формально (согласно условиям использования) сохранять результаты ответов можно у себя только временно для улучшения скорости ответов и снижения нагрузки на наши http-сервисы (в данном случае геокодер)

Яндекс естественно не заинтересован в "выдалбливании" его базы объектов и использовании ее впоследствии третьими лицами.

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

в-третьих использовать для этих целей БД это типичный пример использования инструмента не по назначению. БД позволяет много-много-много чего, а нам в данном случае хватит обычного типа данных hash-table, который есть в любом языке программирования.

Также БД не может реализовать вытесняющий кэш, по алгоритму LRU (Least Recently Used)

или проставить ключу ограниченное время жизни,

или ограничить размер кэша, например 1000 объектами.

Поэтому для целей кеширования лучше использовать специальные инструменты, такие как Memcached, Redis, и прочие многие.

Мы рекомендуем сохранять результаты геокодирования на 1 месяц

сделал онлайн-инструмент демонстрирующий вышеописанный подход.

Весь код доступен на github

Здравствуйте!

Спасибо!

Я вас послушала и сделал геокодирование с кэшированием на сервере, все согласно ваших советов!

Отлично, рад что у вас всё получилось.

Успехов!

Спасибо за терпение!