Ну что, в прошлой статье Яндекс.Картмы рассмотрели как можно загружать карты в свои проекты с помощью 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 передаем координаты. Ну и скажу еще, что все запросы осуществляются по адресу:
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('' ,coord)+length('')-2);
Delete(coord,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-запросы для получения данных, это уже кому как удобно!!!
Исходник можно скачать тут
Бывает такое, что дверь заклинила и остается только вскрыть замок и открыть дверь. Что бы самому не долбить замки и не придумывать, как открыть существую специализированные фирмы, которые помогут вскрыть замок.
Метки: Static API, Static API Яндекс.Карт, Геокодирование, Яндекс.Карты, Яндекс.Карты в Delphi
Респект, очень полезная информация, жду продолжения.
Спасибо, рад стараться
Пытаюсь разобраться с данной темой, запустил приведенный пример, один раз карта открылась, а потом пишет HTTP/1.1 400 Bad Request
Как Вы пишите в TEdit запросы, если Вы пишите улицу, то надо указывать вот так
город Москва, улица Тверская, дом 61
У меня все отлично работает, то есть необходимо указывать через запятые все, и на всякий случай зарегистрируйте свой API-ключ
Спасибо, так работает, вводил Ростов-на-Дону, 9-я ул. 150, ключ использовал свой.
Понял еще одну ошибку пытался указать размер карты 600х600, максимально допустимый 650х450.
Ну вот, видите, скоро продолжу цикл новостей
Здравствуйте, интересует возможность геокодирования в Экселе если возможность сделать что то подобное ? Что бы введя Улицу дом, и город, можно было получить их точные координаты?
Здравствуйте, пожалуйста, в экселе имеется встроенных язык программирования VB, через него я думаю можно отправить запрос на сервер и получить ответ, все по данному принципу
Отличный пример, не ожидал найти подобное на Delphi. Спасибо!
Всегда рад стараться, не за что!