Блог API Яндекс.Карт

Геокодирование адреса из формы поиска

9 августа 2013, 13:02

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


Geocode

Если вы хотите, чтобы форма поиска располагалась прямо на карте, рекомендуем использовать элемент управления SearchControl.

Посмотреть пример в новом окне.

Если вы написали статью или хотите рассказать о своей реализации, пишите нам в клубfacebook или на почту ymapsapi@ya.ru.

34 комментария
Подписаться на комментарии к посту

Екатерина, объясниет пожалуйста, каким образом выводится метка с названием объекта? Как в объект Placemark можно передать результаты геокодирования (чтобы задавать  его координаты не в виде широта долгота) ?

Т.е. задача у меня банальна,  вывести карту с расположением объекта (по его адресу) и метку с этим адресом. Код такой:

ymaps.ready(init) ;
    var myMap;
    var myMap,
        myPlacemark;


 function init(){
       // Поиск координат центра.
    ymaps.geocode('Область обл, Город г, Улица ул.', { results: 1 }).then(function (res) {
        // Выбираем первый результат геокодирования.
        var firstGeoObject = res.geoObjects.get(0),

        // Создаем карту с нужным центром.
            myMap = new ymaps.Map("map", {
                center: firstGeoObject.geometry.getCoordinates(),
                zoom: 14,
                behaviors: ['default', 'scrollZoom']
            }) ;


          
            myPlacemark = new ymaps.Placemark(firstGeoObject, { content: 'Здесь  адрес', balloonContent: 'Результаты поиска' }) ;
            myMap.geoObjects.add(myPlacemark);


    }, function (err) {
        // Если геокодирование не удалось, сообщаем об ошибке.
        alert(err.message) ;
    }) ;

    }

Так как написал - результаты геокодирования не передаются в координаты метки. Как это сделать?

Спасибо

кажеться понял:   myPlacemark = new ymaps.Placemark( firstGeoObject.geometry.getCoordinates(, { content: 'Здесь  адрес', balloonContent: 'Результаты поиска' }) )

вроде работает -так правильно?

И еще: почему на Вашей карте масштабирование происходит автоматически, в зависимости от уровня уточнения адреся, хотя масштаб прописан фиксированным. У меня так не получается

Масштаб берется из ответа геокодера

Если ваша карта всегда будет открыватся в одной и той же точке, Вам вообще не надо геокодировать

Т.к. Это лишний http-запрос

проще один раз узнать координаты и масштаб центра с помощью этого инструмента и создавать метку по этим координатам

Карта будет открываться в разных точках. При формировании страницы будет впечатываться разный адрес в geocod( ) в зависимости от выбранного объекта из БД. Но асинхронных запросов из страницы не будет

Все равно надежнее прогеокодировать все адреса из базы на сервере 1 раз,

чем каждый раз геокодированть на клиенте.

У нас есть пара статей на эту тему:

http://ymapsapi.ya.ru/replies.xml?item_no=485

http://ymapsapi.ya.ru/replies.xml?item_no=81

 

Вообщем это мой совет, а там решайте сами.

У Вас по данному примеру какой вопрос?

Ваш пример на запрос вида "Московская обл, ЗАТО Звездный городок п" дает верные результаты, а когда я пытаюсь обработать его-же в своем скриптк , то у меня карта выводится на район метро Кантемировская , Кавказзкий бульвар. :) Если убираю слова ЗАТО из запроса, то результат такой-же как в Вашем примере. Хотя все эти названия населенных пунктов и сокращения я беру из базы КЛАДР, как там написано. Что может обрабатываться не правильно в моем скрипте?

возможно из за опции boundedBy

boundedBy: this._map.getBounds()

База КЛАДР не показательна в плане работы геокодера.

Формат записей в ней никак не учитывается

эту опцию включать в  geocode()? можете написать куда в моем коде надо вставить эт?  вписав ее в параметры  geocode-а получаю ошибку this._map is undefined

Спасибо

Второй параметр в geocode

Замените this._map на имя вашей переменной с картой

Пишу так:

ymaps.ready(init);
    var myMap;

 ymaps.geocode(' строка с адресом', { boundedBy:  myMap.getBounds(), results: 1 }).then(function (res) {   ....далее код как написано выше..

все равно ругается Type error: myMap is undefined

Ведь получается что карта еще не созданаВот если далее  в запросе для создания балуна пишу 

var objects = ymaps.geoQuery(ymaps.geocode('Московская обл, ЗАТО Звездный городок п', { boundedBy: myMap.getBounds() }))
                 .addToMap(myMap);


 тогда ищет все правильно, как в Вашем примере, но возникает неприятный эффект перемещения карты с первоночально неверно найденого центра на правильный результат. Т.е.  нужно еще вставить boundedBy: myMap.getBounds()  именно в начале кода до создания карты. Но там переменная myMap еще не определена. Не пойму как мне правильно это написать :((((

А как реализовать данный пример? где взять файл search-address.js?

Весь код доступен на гитхабе

А как после установки балуна на карте заносить выбранное значение в БД (мускул).

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

Результат в коде выводится в файле search-address.js и выглядит так: return this._result; Как его присвоить php переменной?

Вероятно отправить на сервер с http-запросом

Подскажите, а в этом коде свой API-ключ не нужно указывать что ли? Все подключил, а ключ и не требуется.

В АПИ 2.0 ключи не нужны. Они были только в первой версии

Здравствуйте, решил не открывать новую тему а тут задать вопрос.

На сколько я помню, то было ограничение на количество запросов геокодера, 25000 запросов в день. Это действительно так, или я что-то не то вспомнил?)  

это действительно так

http://legal.yandex.ru/maps_api/

Спасибо большое, долго искал этот текст. У меня еще вопрос, если будет выполнено 25000 запросов, то что случится с картой? просто перестанет работать геокодер до конца суток? 

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

Зддравствуйте. Просто этот вопрос возник из-за того что хочу прикрутить к карте http://dimik.github.io/ymaps/examples/controls/search/ вот такой функционал. И я чувствую что этот фактор не от меня зависит, сколько раз пользователи захотят поискать что-то на карте=(  вдруг кому-то захочется 25000 раз найти свой город или дом на карте=)

Соглано Пользовательского соглашения вы можете кэшировать результаты. Вряд ли Москва поменяет свое расположение :) 

2.3.7.5. Запрещено сохранять, обрабатывать и видоизменять полученные через Сервис Данные (включая результаты геокодирования), за исключением случаев временного хранения (кэширования) результатов геокодирования исключительно для целей улучшения функциональности и работоспособности Сервиса и только для использования в рамках возможностей, предоставляемых Сервисом.

Понял, спасибо. 

При значительном и регулярном привышении лимита функция геокодирования будет недоступна, а может и всё АПИ =)

ну вот, геокод еще ладно, а вот АПИ не хотелось бы)  спасибо

Подскажите пожалуйста, получилась вот такая ситуация: Использую данный пример в форме на сайте, для определения координат объекта... т.е. есть форма где пользователь указывает Город, адрес и другие данные. По введенным полям "город" и "адрес" происходит поиск на карте и определение координат. Но т.к. в итоге в основную форму Я вставляю форму с картой, получается так что форма карты блокирует отправку основной формы.
Подскажите как разделить отправку формы карты и основной формы.

А все разобрался...в скрипте карты изменил отправлять запрос поиска не по submit формы, а по клику на кнопку

поделитесь как вы это сделали?:)

Костыли, конечно, знатные. :-P

Что то не работает поиск по адресу, только городов
Господа!


А как можно передавать на геокодирование содержимое не одного поля input,
а комбинцию из select и input?


Пример: есть форма, где select'ом выбирается город, а в поле input пишется адрес.
Из input'а получается легко без переделки search-address.js, просто добавив в форму нужные аттрибуты.
А как сделать для указанной комбинации?
Допустим, select и input я объединил средствами скрипта.

А как теперь передать объединенный адрес в search-address.js?
У меня геокодирование такого адреса 
г. Санкт-Петербург, ул. Южная дорога, д. 4, яхт-клуб «Крестовский» Крестовский остров

возвращает мне 
найдено: Россия, Санкт-Петербург, Петродворцовый район, посёлок Стрельна, улица Новые Заводы, 4