Геокодирование Яндекс.Карт

4 минуты на чтение

Ну что, в прошлой статье Яндекс.Картмы рассмотрели как можно загружать карты в свои проекты с помощью 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 передаем координаты. Ну и скажу еще, что все запросы осуществляются по адресу:

https://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('https://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('https://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-запросы для получения данных, это уже кому как удобно!!!

Facebook Vk Ok Twitter LinkedIn Telegram

Похожие записи:

Ну что, продолжаем экспериментировать с различными API, на этот раз «перст» пал на Яндекс. Здесь мы рассмотрим как в своих проектах можно использовать Яндекс карты без программирования на JavaScript или динамической загрузки страницы.  Смысле Static API Яндекс...
Ну вот наконец-то мы добрались и до интерактивных карт Яндекс. Интерактивные карты Яндекс - это карты, по которым, грубо говоря, можно перемещаться. То есть, можно увеличивать масштаб, перемещаться карту курсором, вот это одно самое главное преимущество интера...
Всем доброго времени суток. В этой статье, мы возвращаемся к нашему проекту MapWindow GIS, и сегодня мы будем его рассматривать вместе с геокодированием Яндекс.Карт. Это, довольно, популярно сейчас, в свой проект, включать другие ГИС, которые обладают более то...