Ну что, в прошлой статье Яндекс.Картмы рассмотрели как можно загружать карты в свои проекты с помощью Static API, при этом необходимо было указывать координаты по долготе и широте — следовательно в пределах данных координат часть карты мы и получали в свой проект. Но так как тут не все астрономы и не каждый знает в градусах где расположена та, или иная улица, или объект, то в данной статье мы рассмотрим геокодированиеЯндекс.Карт. Немного подробнее о геокодировании. С помощью геокодирования мы сможем получать координаты объекта по его названию (например: город Санкт-Петербург), после этого если запрос наш был составлен правильно, то мы получаем координаты данного города в градусах. То же самое можно сделать и наоборот, то есть задать координаты и получить название объекта.

Мы сможем обращаться к геокодеру Яндекс.Карт с помощью JavaScript или по HTTP-запросу. Как Вы уже поняли, мы будем это делать с помощью HTTP-запроса.

Когда мы будем обращаться по HTTP-запросу, то у нас есть выбор получения данных: JSON или XML. Я, наверное выберу 2-е, то есть XML.

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

Не забывайте!!! Что при отправке HTTP-запроса API-ключ должен присутствовать обязательно, иначе Вас Яндекс не авторитизиурует и соответственно не выдаст Вам нужную информацию

Теперь давайте пройдемся по параметрам, которые должны присутствовать в нашем запросе. Мы будем осуществлять GET-запрос, хотя Вы можете и с помощью POST-запроса получить необходимые Вам данные.

Обязательные параметры:

  • geocode - объект, для которого необходимо получить координаты (Например город Санкт-Петербург.) Если необходимо получить улицу в каком-то городе, то необходимо в параметр записывать следующим образом данные : geocode=Москва, Тверская улица, дом номер дома.
  • key - API-ключ, для того, чтобы Яндекс Вас смог распознать и выдать Вам необходимую информацию

Необязательные параметры:

  • format - формат выдачи данных, либо XML, либо JSON, по умолчанию XML.
  • callback - имя JavaScript функции, в которую будет передаваться результат
  • ll,spn — область, примерно в которой находится Ваш искомый объект
  • rspn - позволяет ограничивать поиск объектов областью, заданной с помощью параметров ll и spn
  • result - максимальное количество выводимых результатов. То есть, если Вы вводите название Москва, то ведь Москва может быть и город может быть и река, вот этих объектов координаты Вам и выдаст сервис геокодирования. По умолчанию 10
  • skip - количество результатов, которое необходимо пропустить
  • plng - предпочтительный результат ответа: ru - русский, uk - украинский, be - белорусский.

Хочу еще сказать, что в наш прошлый проект я добавил TEdit, в который мы и будем формировать наш запрос. Да и еще,  если мы посылаем запрос с пробелами, как Вы знаете Яндекс заменяет пробел символом — %20, то вначале мы напишем небольшую вставочку, которое это и будет делать. Также у меня в Delphi 7 возникли проблемы с кодировкой и пришлось использовать функцию AnsiToUTF8. Так как нас интересует только получение координат, то процесс обратный — по координатам получить название объекта я рассматривать не буду. Все тоже самое, только в geocode передаем координаты. Ну и скажу еще, что все запросы осуществляются по адресу:

http://geocode-maps.yandex.ru/1.x/?

На событие OnClick нашей кнопки прошлого проекта я дописал следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 png:TPNGObject;
 st:TStringStream;
 coord:WideString;
 texts:String;
begin
   texts:=EditObject.Text;
   while (pos(' ',texts)<>0) do
    begin
     Insert('%20',texts,pos(' ',texts));
     Delete(texts,pos(' ',texts),1);
    end;
   coord:=IdHTTP1.Get('http://geocode-maps.yandex.ru/1.x/?geocode='+
   AnsiToUtf8(texts)+'&key=AHhaek0BAAAAeIQxKAIAug5TEqsNtod3IPpUfBs_AoQUM3MAAAAAAAAAAADlrrinFsYwcNyXnEMhXLtTb-KPew==');
   Delete(coord,1,pos('<pos>',coord)+length('</pos>')-2);
   Delete(coord,pos('</pos>',coord),length(coord));
   coord[pos(' ',coord)]:=',';
   png:=TPNGObject.Create;
   st:=TStringStream.Create(IdHTTP1.Get('http://static-maps.yandex.ru/1.x/?'
   +'ll='+coord+'&spn=0.3,0.3&size=300,300&l=map&pt='+coord+',pmrdl99&key=AHhaek0BAAAA'
   +'eIQxKAIAug5TEqsNtod3IPpUfBs_AoQUM3MAAAAAAAAAAADlrrinFsYwcNyXnEMhXLtTb-'
   +'KPew=='));
   png.LoadFromStream(st);
   Image1.Picture.Assign(png);
   FreeAndNil(png);
   FreeAndNil(st);
end;

Ну и напоследок, вот что у меня получилось:

То есть, подгружается та часть карты, которая соответствует запросу в TEdit, не плохо правда? Исходник я как всегда прилагаю, а следующая серия статей Яндекс.Картпойдет об интерактивных картах и как их можно использовать в своих проектах.

Ах и да, не забывайте, что Вы можете отправлять POST-запросы для получения данных, это уже кому как удобно!!!

Исходник можно скачать тут


Бывает такое, что дверь заклинила и остается только вскрыть замок и открыть дверь. Что бы самому не долбить замки и не придумывать, как открыть существую специализированные фирмы, которые помогут вскрыть замок.


Метки: , , , ,




К записи “Геокодирование Яндекс.Карт” оставлено комментариев: 11.

  1. Андрей:

    Респект, очень полезная информация, жду продолжения.

  2. Андрей:

    Пытаюсь разобраться с данной темой, запустил приведенный пример, один раз карта открылась, а потом пишет HTTP/1.1 400 Bad Request

    • Andrey53:

      Как Вы пишите в TEdit запросы, если Вы пишите улицу, то надо указывать вот так
      город Москва, улица Тверская, дом 61

      У меня все отлично работает, то есть необходимо указывать через запятые все, и на всякий случай зарегистрируйте свой API-ключ

  3. Андрей:

    Спасибо, так работает, вводил Ростов-на-Дону, 9-я ул. 150, ключ использовал свой.

  4. Андрей:

    Понял еще одну ошибку пытался указать размер карты 600х600, максимально допустимый 650х450.

  5. Денис:

    Здравствуйте, интересует возможность геокодирования в Экселе если возможность сделать что то подобное ? Что бы введя Улицу дом, и город, можно было получить их точные координаты?

    • Andrey53:

      Здравствуйте, пожалуйста, в экселе имеется встроенных язык программирования VB, через него я думаю можно отправить запрос на сервер и получить ответ, все по данному принципу

  6. vit:

    Отличный пример, не ожидал найти подобное на Delphi. Спасибо!

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*