Google Maps и инфоокна

Google Maps и инфоокна

Привет!

Сегодня мы опять вернемся к рассмотрению Google Maps API. В этом уроке я покажу вам, как использовать встроенные и внешние скрипты для управления инфоокнами на картах Гугла.

Когда я делал сайт карты точек Wi-Fi, то хотел использовать свои собственные окна, а не те, что предлагает Гугл по умолчанию. В общем я нашел скрипт, который умеет это делать, прикрутил его, настроил внешний вид — вроде бы все круто. Но буквально за несколько часов до запланированного старта мой друг прислал мне скрин из Оперы, в которой эти самые окна выглядели, мягко говоря, довольно хреново. Сначала я подумал, что это мой косяк, но, покапавшись в скрипте и на сайте разработчиков понял, что лажанули создатели. Я начал искать решение и нашел его где-то в закрамах их SVN репозитариев — совершенно случайно. Его не было в публичной версии, про баг не было даже упоминанию, но решение я все-таки нашел. Так что сегодня я расскажу как делать нормальные кроссбраузерные кастомизируемые инфоокна для Google Maps.

Стандартные инфоокна

Стандартные инфоокна выглядят не очень красиво, но, они функциональные и удобные. Как же их использовать? А вот так:

  • метод openInfoWindow() позволяет выводить окошки только с текстовым содержанием;
  • метод openInfoWindowHtml() может показывать практически любой html.

Обе функции работают одинаково и отличаются только типом второго аргумента. Вызывать их можно вот так:

// создаем карту 
var map = new GMap2(document.getElementById("map_canvas"));
// центрируем ее
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
// открывает инфоокно
map.openInfoWindow(map.getCenter(), document.createTextNode("Здравствуй, мир!"));

Первый же аргумент — точка, на которую указывает «нога» окошка, в данном случае это центр карты.

Если же вы хотите выводить окошко для маркера (при клике на нем), то сделать можно вот так:

<script type="text/javascript">
...
GEvent.addListener(marker, "click", function() {
map.openInfoWindowHtml(coords, 'Я — инфоокно!'); // делаем открытие окна при клике на маркер
});
...
</script>

Все это дает вот такой результат. Теперь посмотрим на настраиваемые окна.

Настраиваемые инфоокна

Я остановился на ExtInfoWindow — стабильная (после правки) библиотека для инфоокон, внешний вид которых настраивается через CSS.

Чтож, рассмотрим использование. Для начала вызов:

<script type="text/javascript">
// объявление переменных
var map = null; // карта

// инициализация карты
function initialize() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map_canvas")); // делаем карту в таком диве
map.setCenter(new GLatLng(59.94, 30.3), 13); // устанавливаем центр карты и приближение
var marker = new GMarker(new GLatLng(59.94, 30.3));
map.addOverlay(marker); // и добавляем его на карту
marker.openExtinfowindows(
map,
'estetic_window',
'Настраиваемое инфоокно',
{
beakOffset: 3
}
);
geocoder = new GClientGeocoder(); // создаем объект геокодера
}
}
</script>

Заметьте, окошко можно привязать только к маркеру, а не к конкретной точке. Но это вполне удобно и не умаляет достоинства библиотеки. Кстати, переменная, которая идет после карты в функции вызова окна, отвечает за префикс класса стилей для этого окна, что позволяет вам делать множество различных стилей для окон в пределах одной карты.

Теперь перейдем к визуальной настройке. Для моего окошка я использовал вот такие картинки:

Картинки для инфоокон Google Maps

Необходимы стили выглядят вот так:

<style>
#estetic_window {
width: 250px;
display: table;
}

#estetic_window_contents {
background: #FFF ;
width: 224px;
}

#estetic_window_beak{
width: 33px;
height: 34px;
background: url(beak.png) top left no-repeat transparent;
margin-left: -2px;
}

* html #estetic_window_beak{
/* Alpha transparencies hack for IE */
background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/beak.png', sizingMethod='crop');
}

#estetic_window_tl, #estetic_window_tr, #estetic_window_bl, #estetic_window_br,
#estetic_window_t,#estetic_window_l,#estetic_window_r,#estetic_window_b{
background-color: #F00;
height: 2px;
width: 2px;
}

#estetic_window_tl {
width: 13px;
height: 13px;
background: url(tl.png) top left no-repeat;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/tl.png', sizingMethod='crop');
}

#estetic_window_t {
background: url(t.png) top left repeat-x;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/t.png', sizingMethod='crop');
}

#estetic_window_tr {
background: url(tr.png) top right no-repeat;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/tr.png', sizingMethod='crop');
width: 13px;
height: 13px;
}

#estetic_window_bl {
width: 13px;
height: 13px;
background: url(bl.png) bottom left no-repeat;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/bl.png', sizingMethod='crop');
}

#estetic_window_b {
background: url(b.png) bottom left repeat-x;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/b.png', sizingMethod='crop');
}

#estetic_window_br {
background: url(br.png) bottom right no-repeat;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/br.png', sizingMethod='crop');
width: 13px;
height: 13px;
}

#estetic_window_l {
background: url(l.png) top left repeat-y;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/l.png', sizingMethod='crop');
width: 13px;
}

#estetic_window_r {
background: url(r.png) top right repeat-y;
_background: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/examples/google-maps-infowindows/r.png', sizingMethod='crop');
width: 13px;
}

#estetic_window_close {
background: url(close.png) bottom left no-repeat;
width: 20px;
height: 20px;
cursor: pointer;
}
</style>

Собираем все воедино и получаем вот такое классное окошко. И не забудьте взять мою версию библиотеки, она корректно работает во всех браузерах.

Вот такой сегодня урок. Вопросы? Может дополнения? Тогда замечания? Все в комменты, пока!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 28

Vanekru
Спасибо. Я бы конечно сделал акцент Яндексе, на мой взгляд их карты на постсоветском пространстве заполняются быстрее.
Евгений
Классно
#
Евгений
Бородатый
Спасибо за материал и скриптик. Кстати, wifi4free.ru - у меня одного там траблы с кодировкой?
Neutron
спасибо, интересно, но тоже очень интересны апи карт от Яндекса - моего города нет в гугле норального....
как-то давно кто-то обещал у вас выложить статью по Яндекс Картам...
TuTbaker
В Google Chrome 3 не работает...
#
TuTbaker
Devis
Хост wifi4free.ru некорректно настроен.
Родная кодировка содержимого utf-8, а сервер принудительно выдает контент в кодировке windows-1251
Потому у посетителей кракозябры вместо слов )))
Измените кодировку по умолчанию на utf-8 и все будет отлично.
andrbelt
хотелось бы обратить внимание на одну мелочь, которая например для меня является принципиальной.
в вашем варианте (в приведенном примере) после закрытия инфоокна, его невозможно обратно вернуть на карту. в варианте google повторное открытие инфоокна происходит просто при клике на маркер.
эту функцию можно добавить (точнее вернуть)???
Жо
Скажите пожалуйста, можно ли делать подобные инфоокна, используя яндекс-карты?
#
Жо
tRIFF
Привет) Спасибо за классные окошки)
Есть один вопрос:

Как можно точку привязки инфоокна опустить до самой картинки маркера?
#
tRIFF
Adward
Такой вопрос - а что делать если окна разного размера?
при клике на один маркер - выходит окошко 100х100 пикс, при клике на другой - окошко 500х500 пикс?
Grin
Adward, тогда надо писать несколько функций вызова окна и делать параметры для маркеров
Adward
Понятно.
второй вопрос по поводу окошка - создал своё окно, свои картинки использовал. Хотелось бы сделать так, чтобы нижний "хвостик" упирался прямо в marker. Тоесть как "опустить" #estetic_window на несколько пикселей вниз?
Adward
Получилось
Подвигал параметр {beakOffset:26} ну и немного пришлось поиграть с margin'ами для #estetic_window_beak :)

Спасибо.

И всё же, я боюсь, что сейчас у меня начнутся эксперименты по размеру контента Info-окна, то есть буду мучать html, отправляемый в ExtInfoWindow.

Если есть грабли - может поделитесь? ;)
Grin
Вам нужно, чтобы при клике на разные маркеры открывались разные по размеру окна?
Это же просто: при выводе макера просто вешаете на клик по маркеру вызов либо разных функций, либо одной и той же, то с разными параметрами.
Adward
Оно то понятно. Только в случае, если я вызываю диалог относительно вот так:

marker.openExtInfoWindow(
map,
"estetic_window",
'Я — настраиваемое инфоокно Я — настраиваемое инфоокно',
{beakOffset:26}
);

то всё - наступает хана. диалог ломается. Кстати, я заметил, что по вертикали окошко таки растёт при смене высоты контента, горизонтально таки - остаётся неизменным.
Хотелось бы спросить: у стандарного, гуглового окошка - такое же поведение? (я просто не экспериментировал).
Grin
Да, такое же.
Значит я тогда не понял суть задачи. Нужно для маркеров A делать окошко estetic_window, а для маркеров B — estetic_window1? Или как?
Adward
Нет, немного не так.
давайте уж тогда, чтобы далеко не ходить, объясню на примерах.
Кликните плиз в центр этой карты. В инфоокне мы видим картинку и достаточно подробное описалово, тоесть диалоговое окно где многабукв. Однако, для некоторых типов Заведений, на этом сайте, может получиться так, что отсутствует картинка, а из текста - в базе - только телефон. У других - не только телефон но и адрес например. Вот для такого типа окна нет желания громоздить большое инфоокно. Достаточно просто небольшого стикера.

Вот почему я задался вопросом динамического измения размера инфоокна.
Adward
Какого фига, что Ваш пример http://vremenno.net/examples/google-maps-infowindows/custom.html , что мои тесты стали выдавать ошибку?

Строка: 3
Ошибка: 'GOverlay' - определение отсутствует
Строка: 15
Ошибка: 'GMap2' - определение отсутствует
Grin
Adward, скорее всего обновили либу гугла
Adward
Ваше решение я использовал для создания сайта www.kartakazani.ru

но вот беда - окошки работают в IE но не работают в других браузерах.

если сталкивались - может подскажете, в чём тут может быть беда такая?
СергейВ
Отличная статья, но что то этот пример у меня глючит в сафари, но я все же склоняюсь к проблеме компьютера, а не бразуера.(
Andrew
Добрый день !
Скжите пожалуйста, а как можно сделать тоде самое только для зеленой стрелочки, а не для красного шарика ?
Т.е. по нажатию на зеленую стрелочку, я хочу получить info window и содержимое было бы в нем то, которое я хочу, а не стандартное ?
#
Andrew
Evgenij
2Andrew:

Внешний вид маркера не имеет никакого значения для данного скрипта.
Andrew
2 Evgenij
спасибо, но я не совсем понял. Как это ?
http://maps.google.com/maps?f=q&hl=en&ie=UTF8&z=10&iwloc=addr&om=1&q=53.902550,27.563101&geocode=
у меня по этому адресу показывается и красный шарик и зеленая стрелочка ? Как скрипт узнает, какой именно маркер необходимо править ?

#
Andrew
Evgenij
Andrew, зеленая стрелочка - это точка, которая найдена по координатам. Красным маркером обозначаются различные географические места.

Так или иначе, если вы хотите использовать данный скрипт, значит вы собираетесь встроить на свой сайт гугл-карты. Там вы можете настроить внешний вид всех маркеров и их свойства. Будут это стрелочки, точечки или что-либо еще - решать вам.
Andrew
спасибо !
Тогда такой вопрос, что я должен подключить в head моего html файла, чтобы я мог иметь доступ к
GMap2 классу ?
В вашем примере :
var map = new GMap2(document.getElementById("map_canvas"));
#
Andrew
Evgenij
С таким вопросом лучше обратиться к документации.
Там нету ничего сложного, описывать в комментарии не имеет смысла. Если понадобится, там есть много примеров.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku