Ну что, в прошлой статье Яндекс.Картмы рассмотрели как можно загружать карты в свои проекты с помощью Static API, при этом необходимо было указывать координаты по долготе и широте — следовательно в пределах данных координат часть карты мы и получали в свой проект. Но так как тут не все астрономы и не каждый знает в градусах где расположена та, или иная улица, или объект, то в данной статье мы рассмотрим геокодирование Яндекс.Карт. Немного подробнее о геокодировании. С помощью геокодирования мы сможем получать координаты объекта по его названию (например: город Санкт-Петербург), после этого если запрос наш был составлен правильно, то мы получаем координаты данного города в градусах. То же самое можно сделать и наоборот, то есть задать координаты и получить название объекта.
Мы сможем обращаться к геокодеру Яндекс.Карт с помощью JavaScript или по HTTP-запросу. Как Вы уже поняли, мы будем это делать с помощью HTTP-запроса.
Когда мы будем обращаться по HTTP-запросу, то у нас есть выбор получения данных: JSON или XML. Я, наверное выберу 2-е, то есть XML.
Я не буду через какие-то библиотеки разбирать XML-документ, а так как он небольшой, то мы его просто своим методом пропарсим и получим нужные нам данные.
Теперь давайте пройдемся по параметрам, которые должны присутствовать в нашем запросе. Мы будем осуществлять 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-запросы для получения данных, это уже кому как удобно!!!