API статичних карт Google, Різне, Програмування, статті

Автор: Максим Мазитов, Королівство Delphi


Уже тривалий час Google надає відмінне картографічне засіб – Google Maps. У нього відкритий API інтерфейс, багато чарівних можливостей, зручний інтерфейс користувача, покритий весь світ і що саме головне – використання карт умовно безкоштовне. Один мінус – все це щастя працює під Java машиною в браузерах. У мережі багато інфи по включенню гуглокарт до складу віндового програми через використання компонента TWebBrowser. Якщо ви знайомі з JavaScript і об’єктною моделлю Internet Explorer, то побудова такого додатка після танців з бубнами, копання в і-неті і коментування в коді ненормативної лексики – завдання цілком реалізована. Однак я хочу розглянути інший варіант отримання картографічної інформації від гугля – статичні карти.


Статичні карти Google представляють собою звичайний бітмап. Така карта не має жодних інтерактивних можливостей по взаємодії з користувачем. Позитивним моментом є те, що не потрібно використовувати TWebBrowser – джерело постійного пожирання оперативної пам’яті і роздування розміру програми.


Інформація щодо використання API статичних карт доступна російською мовою за цим посиланням code.google.com/intl/ru-RU/apis/maps/documentation/staticmaps/. Рекомендується до обов’язкового прочитання після статті.


Я побудую просте додаток, що відображає на карті задану по широті і довготі точку з необхідним масштабом.


Для отримання картинки з картою потрібно зробити наступні дії:



  1. Знати координати відображуваної точки і масштаб карти навколо точки. Для цього намалюємо найпростіший інтерфейс користувача.
  2. Передати http запит серверу в певному форматі, що містить параметри картинки і отримати відповідь від сервера у вигляді блоку бінарних даних.
  3. Перетворити дані в приймається Delphi графічний формат.
  4. Намалювати картинку на формі.

Дія 1 я розписувати не буду, викачуємо приклад (Delphi 7), відкриваємо і Фотаком в Delphi IDE.


Дія 2. Як випливає з інформації гугла (див. посилання), формат запиту має наступний вигляд: http://maps.google.com/staticmap?parameters, Де parameters – пари <параметр> = <значення>, розділені знаком “&”. Загалом, звичайний вид передачі параметрів в url. Для запиту нам знадобляться наступні параметри:



Тобто всі параметри, які надає гугль. Я не буду їх розписувати, за назвою параметрів зрозуміло, за що відповідає кожен параметр. Для докладного вивчення рекомендую першоджерело. Обмежуся рядком для функції Format з исходников:

http://maps.google.com/staticmap?center=%.6f,%.6f&zoom=%d&size=”&markers=%.6f,%.6f,blues&maptype=mobile&key=MAPS_API_KEY

Зверну увагу на три моменти:



  1. Координати приймаються у форматі “значення з плаваючою точкою” не більше 6-ти знаків після крапки. Значення задаються в десяткових частках градуса. Для перекладу з формату секунд згадуємо, скільки секунд в хвилинах.
  2. Google запевняє, що максимальний розмір картинки 512х512. Досвідченим шляхом обчислено, що максимальний розмір 640×640.
  3. З ключем карти ситуація не цілком ясна. Я не використовував ключ, одержуваний у Google, тому що ключ генерується для конкретного сайту, а карта відображається в додатку. Я взяв ключ з прикладу на сайті. Поки він працює, а що буде далі, я не знаю.

Отже, url сформований, і його потрібно заслати в Google. Для передачі http запиту і отримання відповіді я використовував злегка підправлений код з цього сайту. Так що на авторство не претендую :). Зацікавлені можуть пошукати по круглому столу по слову “GetInetFile”.


Дивимося код:

/ / Отримання карти із заданим центром, масштабом і з маркером в центрі
function GetMap(Latitude:Double;Longitude:Double;Scale:Integer):TOleGraphic;
var
FileOnNet: String;
Stream:TMemoryStream;
begin / / Створюємо потік
Stream:=TMemoryStream.Create;
try / / Формуємо url для запиту
FileOnNet:=”http://maps.google.com/staticmap?center=%.6f,%.6f&zoom=%d&size=640×640″
+”&markers=%.6f,%.6f,blues”
+”&maptype=mobile&key=MAPS_API_KEY”;
FileOnNet:=Format(FileOnNet,[Latitude,Longitude,Scale,Latitude,Longitude]); / / Отримання потоку з даними відповіді
if GetInetFile(FileOnNet,Stream) = True then begin / / Створюємо графічний об’єкт
Stream.Position:=0;
Result:=TOleGraphic.Create;
Result.LoadFromStream(Stream);
end else
Result:=nil;
finally
Stream.Free;
end;
end;

На виході маємо заповнений клас TOleGraphic в разі успішного з’єднання або порожній покажчик у разі відмови сервера або відсутності зв’язку з сервером.


Хочу пояснити мотиви використання TOleGraphic. При написанні програми я зберігав проміжні дані в файл Jpeg формату для перегляду результатів запиту. І файл проглядався з диска віндою без жодних проблем. Але при спробі відкрити його і загнати в Image на форму видавалося виняток Jpeg. Аналогічна ситуація відбувалася при спробі передачі потоку безпосередньо в Image. Рішення було знайдено у вигляді TOleGraphic, яким абсолютно паралельно, які дані лежать в прийнятому потоці (якщо я не правий, нехай мене поправлять). А дані то, виявляється, були в форматі Gif. Воістину, якщо у вас щось не виходить, прочитайте нарешті інструкцію!


На цьому дії 2 і 3 завершені. Бітмап у нас на руках, малюємо його на формі хто як вміє.


Власне все.


А всі питання – до гуглу, він знає ВСЕ!


І для тих, хто в танку – для правильної роботи прикладу необхідно активне робоче підключення до інтернет.


Результат виглядає так:


Карти Google

В якості епілогу цитата з баш.орга:


З форуму, гілка про Google Earth:
ххх: Привіт, учасники форуму! Не могли б ви дати координати Google Earth військових портів в США?
ууу: Зовсім ракетники зледащіли!

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*