Использование Google static maps
В статье рассмотрены основные возможности использования статических карт Google на основе собственного опыта автора.
Google предоставляет два варианта использования своих картографических сервисов.
- Google maps, базирующийся на JavaScript API, предоставляющий разнообразные возможности для отображения различной географической информации.
Имеется хорошо продуманная и структурированная библиотека классов, с документацией к которой можно ознакомится по следующим ссылкам:
English, Русский и поиграться в песочнице
- И второй вариант, предоставляет намного меньше функциональности, но иногда только им и возможно воспользоваться.
Это статические карты. В общих чертах, с использованием этого сервиса можно просто отобразить некоторую карту, причём максимальный размер получаемого изображения равен 512х512 пикселей, также, вместе с координатами, допустимо указывать уровень приближения (zoom) и добавлять дополнительные метки.
Оба варианта сервисов имеют свои преимущества и должны использоваться во вполне определённых областях. Но для того, чтобы грамотно определить когда какие карты использовать, нужно знать все возможности.
Данная статья написана о статических картах, о обычных можно будет рассказать в другой раз.
Static google maps
Для работы с API Google нужно пройти бесплатную регистрацию и получить API key, который затем используется в большинстве случаев.
Также, для разработчиков предоставляются полная информация по использованию Static Maps API, которая расположена по следующим адресам: English и Русский.
Бывают случаи, когда очень хочется динамически использовать карты в проекте, но возможности использовать обычные карты Google нет. В основном это обусловлено наличием поддержки JavaScript в целевой платформе.
Хороший пример, J2ME, весьма приличные возможности по сетевому взаимодействию, но нет абсолютно никаких возможностей использовать JavaScript. А посему, статические карты является одним из наилучших решений.
Рассмотрим гипотетический мобильный сервис: Пользователи могут свободно добавлять в базу данных свои бары, кафе и прочие предприятия общественного питания, после чего, на основе введённого адреса, вычисляются координаты места и затем на странице с его описанием можно сразу посмотреть карту.
Видно, что задача разбивается на две подзадачи:
- Получить координаты по адресу;
- Получить карту по координатам.
Также можно добавить ещё третью подзадачу, организовать навигацию по карте.
Получение координат по адресу
Эта процедура называется geocoding, также имеется reverse-geocoding, когда на основе координат выдаётся адрес, но её мы рассматривать не будем.
Подробная описание расположено по следующим адресам: English и Русский
Для успешного geocoding`a нужно всего две вещи адрес в формате, понятном Google и API key.
Если с первым всё просто, что термин понятности для Google требует уточнения. Дело в том, что для гарантированного удачного geocoding`a введённый адрес должен быть максимально полным и точным, ведь, к примеру, в той же Америке запросто можно найти и Москву и Париж. Также присутствует требование полноценности адреса, к примеру если улица называется “Красных Стрелков”, то на запрос “Кр. Стрелков” скорее всего ничего найдено не будет.
Далее всё просто, координаты предоставляются в виде пары значений, широты и долготы и нужно отослать интересующий адрес на гугловский сервис
http://maps.google.com/maps/geoуказав следующие параметры:
- q — Адрес подлежащий geocoding`у;
- key — Ваш API key;
- output — Требуемый формат ответа, тут возможны следующие значения: xml, kml, csv или json.
Пример получения случайного адреса в Москве:
http://maps.google.com/maps/geo?q=Russia%20Moscow%20Tverskaja%2011&output=json&key=abcdefg
UPD 1 Перенесу свой коментарий в статью, думаю тут ему самое место.
___________________
Есть ещё некоторые опциональные параметры, к примеру параметр format, чтобы получать изображение не в дефолтном GIF, а в JPG, или PNG (моём любимом).
Приведу уж и все остальные:
maptype — Тип запрашиваемой карты может быть кроме mobile ещё satellite, terrain, hybrid.
path — Можно указать отрисовку линии между двумя точками, и точек можно указать много. Но такой вариант подходит тоько если строить эти линии в ручную, так-как серьёзную карту руками не построишь, а автоматом он не учитывает улицы, реки и пр. просто рисует линию.
Хотя есть возможность получить путь от одной точки до другой с учётом всего этого, но только при использовании обычного JS API.
Координаты узловых точек разделены опять символом трубы "|".
Пример: path=rgba:0xff0000ff,weight:5|40.737102,-73.990318|40.749825,-73.987963|40.752946,-73.987384|40.755823,-73.986397
span — Параметр учитывается только если не указан zoom, так-как с помошью span можно указать размер отображаемой области. К примеру center=40.714728,-73.998672&span=20,20 отобразит центр Манхеттена и область вокруг размером 20х20 градусов.
frame — Если присутсвует, то вокруг карты будет показана голубая рамка шириной в 5 пикселей.
sensor — В текущей версии помечен как обязательный. Насколько я понял, его нужно указывать равным true, если приходят собственых координат с движущегося устройства.
Ну и последний, hl — Позволяет явно указать язык для отображения всех названий на карте. Понимает ограниченное количество названий локалей.
___________________
Думаю разобрать полученные данные не составит труда, тем более, что на разных языках программирования это делается по разному, а на этом я останавливаться не буду.
В итоге мы получили либо нули, если что-то пошло не так, либо координаты адреса которые нужно сохранить в базу данных, так-как каждый раз заниматься geocoding`ом весьма накладно.
Получение карты по координатам
Это вторая часть задачи возникает как только нам нужно отобразить карту. В принципе тут тоже всё просто, нужно воспользоваться вторым сервисом Google:
http://maps.google.com/staticmap
Он принимает следующие параметры:
- center — Координаты центра карты (формат 37.6095373,55.7606587);
- zoom — Уровень приближения карты, в общем случае число от 1 до 15;
- size — Размеры запрашиваемого изображения, передаются в виде WxH, к примеру 300х200, и максимальные значения определены как 512х512 пикселей;
key — Ваш API key; - maptype — Тип карты, тут возможно несколько вариантов, но в данном случае больше всего подходит значение mobile;
- markers — Используя маркеры можно добавить дополнительные метки на карту, к примеру показать окружающие кафе. Формат использования таков:
{широта},{долгота},{цвет}{буква} разделяются маркеры символом трубы "|"
Пример:
markers=40.702147,-74.015794,blues|40.711614,-74.012318,greeng
Тут создаются два маркера, первый синий с буквой S, второй зелёный с буквой G.
В результат запроса сформированного по этим правилам мы получаем обычное изображение, которое не составляет труда вывести на экран.
Остаётся ещё вопрос организации навигации, но это уже детали приложения, в простейшем случае, рядом с картой можно расположить линки для с соседними координатами и для увеличения/уменьшения (zoom+1,zoom-1) и каждый раз загружать новую карту, либо организовать нечто более сложное с асинхронными запросами и перерисовкой карты, в принципе на J2ME это не сильно сложно.
2009.06.12
Павел Осипов