wxYahooMaps – Библиотека для работы с Yahoo! Maps Image API

Странная вещь получается. А ведь нету нормальных библиотек для С++, работающих с online-сервисами карт. Все популярные сервисы предоставляют API для .NET, а С++, как мне кажется, незаслуженно обделяют своим вниманием.
И вот пару дней назад решил восполнить этот пробел. Выбор пал на сервис Yahoo! Maps, а если быть точным, то Yahoo! Map Image API, которое позволяет получить изображение карты, сформировав определенным образом REST (Representational State Transfer) запрос.
Ознакомиться с механизмом работы сервиса можно здесь. Сильно подробно описывать не буду, скажу только что смысл заключается в формировании URL, открыв который мы получим XML-файл с адресом изображения карты.
Необходимым условием для работы с Yahoo! Map Image API является наличие у приложения уникального идентификатора (Application ID), получить который можно здесь (кстати, я уже писал ранее что Maps API для Google Android тоже требует Application ID).
Итак, wxYahooMaps. Что это такое и как это работает: это wxWidgets-based библиотека, которая позволяет по указанным координатам (широта + долгота) или названию местности (улица/город/штат/почтовый код) получить изображение карты, в центре которого будет искомая точка. Библиотека загружает карты асинхронно и поддерживает многопоточную загрузку, что иногда бывает очень удобным.
Для того чтобы начать пользоваться wxYahooMaps достаточно выполнить несколько простых действий:
Создать объект класса wxYahooMap (желательно чтобы это был член класса формы или приложения, т.е. был доступен на протяжении всей работы программы):
wxYahooMap * m_YahooMap; ... m_YahooMap = new wxYahooMap(this);
К форме, которая должна получать уведомления о состоянии процесса загрузки карт добавить обработчик события EVT_YAHOO_MAP_STATUS:
BEGIN_EVENT_TABLE( wxYahooMapsTestMainFrame, wxFrame ) ... EVT_YAHOO_MAP_STATUS(wxID_ANY, wxYahooMapsTestMainFrame::OnYahooMapStatus) END_EVENT_TABLE() void wxYahooMapsTestMainFrame::OnYahooMapStatus(wxYahooMapStatusEvent & event) { if(event.GetInt() == 0) { wxBitmap * bmp = event.GetBitmap(); if(bmp) { // Здесь работаем с изображением карты // После этого изображение надо удалить wxDELETE(bmp); } } else { // Обработать ошибку } }
Теперь для того чтобы загрузить изображение карты необходимо указать необходимые параметры поиска и вызвать метод wxYahooMap::StartDownload()
void wxYahooMapsTestMainFrame::OnGOBUTTONClick( wxCommandEvent & event ) { TransferDataFromWindow(); m_YahooMap->SetApplicationID(m_AppID); m_YahooMap->SetUsePosition(m_UsePosition); m_YahooMap->SetPosition(wxRealPoint(m_Longitude, m_Latitude)); m_YahooMap->SetStreet(m_Street); m_YahooMap->SetCity(m_City); m_YahooMap->SetState(m_State); m_YahooMap->SetZIPCode(m_ZIPCode); m_YahooMap->SetImageType(wxYahooMap::IntToYahooMapImageType(m_ImageType)); m_YahooMap->SetImageSize(wxSize(m_ImageWidth, m_ImageHeight)); m_YahooMap->SetZoomLevel(m_ZoomLevel); m_YahooMap->StartDownloading(); }
После окончания загрузки карты будет вызван обработчик события wxEVT_YAHOO_MAP_STATUS, в котором можно произвести необходимые действия с изображением карты. После этого обязательно необходимо очистить память, занятую объектом изображения.
В результате у нас должно получиться что-то вроде этого:
На данный момент библиотека wxYahooMaps оттестирована под:
- Windows Vista
- Windows XP
- Windows Mobile 2003 (PPC)
- Windows Mobile 6.0
Проводится тестирование под Mac OS и Linux.
Исходный код можно загрузить из SVN-репозитория на Google Code. Там же можно загрузить исполняемый файл примера для Windows XP/Vista.
PS: Если кто-либо из читателей блога желает помочь в развитии проекта, можно оставлять свои контакты в комментариях. На данный момент требуется помощь в реализации работы с геокодером Yahoo!.
Еще интересные посты о программировании для мобильных устройств:
1 Comment
Make A CommentComments RSS Feed TrackBack URL
November 20th, 2008 at 19:45
[...] всякими online-сервисами. Вон было недавно о Google Translate и Yahoo! Maps, а сегодня буду рассказывать о том как работать с [...]