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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler