пятница, 6 июля 2007 г.

Google Mapplets: Отличие "настоящих" маплетов от стандартного Maps API

После того, как мы научились создавать картографические приложения с помощью Google Maps API (см. Google Mapplets: Концепция и примеры. Практикум) пришло время обсудить некоторые тонкости, необходимые для успешной работы.

Напомню, что в предыдущих статьях я не делал различия между кодом "настоящего" маплета и просто кодом управления картой на веб-странице, поскольку считаю их двумя представлениями одной технологии. Однако в определенных случаях следует использовать именно "настоящие" маплеты, а для того, чтобы четко определять эти случаи, необходимо знать их отличительные особенности.

Как уже упоминалось в предыдущих статьях, маплеты используют функции для управления картой из стандартного Maps API, потому код маплета является вполне обычным способом использования Maps API. Однако есть несколько существенных отличий, которые заключены как в коде, так и в самой концепции.

Замечу от себя, что Google как раз знаменит своими новаторскими решениями, которые обыденные вроде вещи открывают для нас с неожиданной стороны. Потому рекомендую очень внимательно прочитать те идеи, которые сделали один из множества способов использования Maps API полноценной новой технологией.

Простая инициализация
Загрузка Javascript библиотеки функций происходит автоматически при обработке тэга
<Require feature="sharedmap"/>

Использование ключа сайта (API key) не требуется вовсе. При создании объекта GMap2 не надо указывать имя соответствующего ему элемента страницы, потому что в любом случае конструктор объекта возвращает указатель на главную карту. С другой стороны, если имя все же указано, ошибки не будет, что обеспечивает использование кода с обычной веб-страницы без необходимости его доработки.

Не требуется проверка браузера на совместимость (методом GBrowserIsCompatible) в силу того, что, если пользователь уже загрузил Ваш маплет, то наверняка он использует совместимый браузер. Такой метод исключен из функциональности маплета за ненадобностью.

Дополнительные возможности исключены
Чтобы пользователи намеренно или случайно не искажали идею работы с картами Google, запрещено отключение функций перемещения, масштабирования и других. Сделано это для того, чтобы недобросовестные разработчики не усложняли пользователям жизнь. Google заботится о том, чтобы обеспечить единый стандарт работы с картографическими сервисами и разработчики маплетов должны следовать этому стандарту.

Асинхронная работа с картой
Обмен данными между маплетом и сервером карт Google Maps происходит асинхронно. В результате, часть методов работы с картой имеет более сложную внутреннюю реализацию. Обыкновенно операции, выполняющие модификацию отображаемой карты (в том числе setCenter() и addOverlay()) идентичны их реализации в стандартном Maps API. Однако получение информации с карты реализовано через функции обратного вызова. В маплетах добавлен постфикс "Async" к именам всех написанных таким образом вызовов методов Maps API, при этом их возвращаемое значение передается как аргумент функции обратного вызова.
Например, используя Maps API, мы напишем вот так:

var zoom = map.getZoom();
alert("Текущий масштабный множитель равен " + zoom);
alert("Это сообщение Вы увидите ПОСЛЕ сообщения о значении масштабного множителя");

Если же этот код вызывается в маплете, он будет представлен следующим образом:

map.getZoomAsync(function(zoom) {
alert("Текущий масштабный множитель равен " + zoom);
});
alert("Это сообщение Вы увидите ДО или ПОСЛЕ сообщения о значении масштабного множителя");


Вопросы безопасности и "обеззараживание" содержимого в окне информации
Маплет выполняется в элементе страницы iframe и "заперт" в нем, а потому не имеет возможности украсть файлы куки пользователя или нарушить выполнение основного Javascript кода Google Maps. В то же время, окно информации запускается в контексте домена Google Maps. Чтобы избежать возможной угрозы безопасности, проводится очистка отображаемого в окне информации содержимого от потенциально небезопасных элементов. Блокируется использование кода Javascript и удаляются все элементы HTML и CSS, не входящие в список разрешенных.
Более того, запрещено выполнение таких операций, как добавление новых элементов управления картой и новых типов карт, поскольку для них требуется выполнение постороннего кода Javascript в контексте карты.

Запросы к удаленным данным проходят через сервера Google
Маплеты размещаются на сайте gmodules.com. Поскольку это сервер Google, метод GDownloadUrl (и часто используемый для обработки полученного XML содержимого метод GXml) не могут получить доступ к данным на Вашем сервере.
Вместо этого Google Gadgets API обеспечивает следующие вызовы для получения удаленных данных через прокси-сервер gmodules.com:

  • _IG_FetchContent(url, callback) - Возвращает текстовое содержимое указанного адреса. Функция используется для работы с документами HTML.

  • _IG_FetchXMLContent(url, callback) - Возвращает XML содержимое указанного адреса и оперирует с полученными данными XML как с объектом DOM.


Вы должны знать некоторые отличия между GDownloadUrl и GXml:

  • Метод _IG_FetchXXX может получить данные с любого вебсайта в интернет.

  • Метод _IG_FetchXMLContent более специализированный, чем GXml, и работает только с файлами XML следующего типа
    <?xml version="1.0" encoding="UTF-8"?>

  • Метод _IG_FetchXXX автоматически кэширует контент для уменьшения нагрузки на Ваши серверы. Для изменения интервала кэширования или полного отключения кэширования смотрите секцию Refreshing the Cache в документации на Gadgets API.



Вместо заключения
Думал сделать перевод, а получилось скорее даже "по мотивам". Более того, я изменил саму идею повествования - вместо того, чтобы рассказывать об отличиях "настоящего" маплета от простого маплета, я говорил... об их сходстве. Зато если Вы внимательно читали, то теперь Вы умеете работать с обеими технологиями и быстро адаптировать одну в другую. В оригинале я об этом не нашел информации, а меня самого этот вопрос очень интересовал - ведь раз есть уже много готовых примеров работы с маплетами, зачем делать все с самого начала, когда можно просто адаптировать готовый код. Или если мы увидим интересный "настоящий" маплет на сайте Google, почему бы не разместить такой же сервис на своем сайте, внеся необходимые нам усовершенствования. Если компания Google сочтет сказанное мной в чем-то отличным от истинного положения дел и намерений компании, я охотно внесу необходимые изменения. От себя скажу, что переводить очень нелегко, так как мышление русскоязычной аудитории весьма специфично, хотя бы тем, что "наш зритель" желает знать в подробностях лежащие в основе идеи, способы использования и вообще очень инициативен и подходит творчески, что требует более глубокого рассказа, чем это сделано в оригинальной документации. Насколько это мне удалось - судить Вам.

Цикл обзорных статей по теме "Google Mapplets" завершен, еще некоторое время я буду подчищать текст и вносить дополнения, ориентируясь на комментарии читателей. Переводить детальную документацию для разработчиков не вижу смысла, желающие могут все прочитать в оригинале, какого-то особенного знания английского языка для этого не требуется (зачастую все понятно при беглом взгляде, даже без чтения описания). Планирую продолжить повествование циклами "Формат KML" и "Google Earth". Скорее всего, подробно рассмотрю тему GPS-навигации, как минимум для отображения данных с удаленного GPS-терминала, передаваемых в формате NMEA, а возможно, коснусь и работы с локальными GPS-приемниками Garmin и Magellan (самые популярные марки навигаторов в нашей стране). Если удастся собрать отзывы о том, какие задачи хотят решать пользователи с помощью представленных технологий, тогда сделаю одну или несколько тематических подборок своих решений названных задач. О сроках реализации задуманного ничего заранее сказать не могу, все зависит от того, когда смогу найти свободное время.

P.S. Посмотрел на документацию еще раз, возникло несколько идей, так что в ближайшее время ждите руководство "Google Maps в примерах".

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru