Google Maps и большое количество маркеров

20 мая 2009, 0:01 Павел Марковнин JavaScript рейтинг +28-

Google Maps API, большое количество маркеровВсем привет!

Сегодня мы продолжим разговор о маркерах, начатый в прошлой статье, и каснемся вопроса вывода большого числа маркеров на карту google maps.

Как вы понимаете, с ростом числа маркеров растет и нагрузка на браузер (особенно на IE), что приводит к «тормозам» и прочим неудобствам для рядовых пользователей. На нашей карте точек Wi-Fi это проблема была особенно актуальна для карты Москвы, где на момент запуска проекта было около 700 точек. Сначала я пробовал выводить точки не все скопом, а по несколько штук с определенным временным интервалом — получалось красиво, но проблему тормозов не решало. Тогда я начал искать наиболее простые и удобные решения для кластеризации точек (англ. clusterer), которые позволяют группировать рядом стоящие точки на определенных уровнях увеличения карты и по мере приближения открывать их.

Среди прочего на сайте карточного апи есть и маркер менеджер, но мне его настройка и работа показалась очень сложной (может быть, это и не так) и я продолжил поиски, найдя в итоге Кластерер. Вот его работу мы и рассмотрим в этой статье.

Объявление и добавление маркеров

Итак, как всегда нам нужно подключить файлик кластерера — думаю, тут все знают что и как. Далее, нам нужно объявить объект кластерера и уже в него добавлять маркеры:

clusterer = new Clusterer(map); // объект кластерера
...
clusterer.AddMarker(marker, title); // добавляем маркер в кластере

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

Настройка работы

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

// эта функция до этого отвечала за открытие окна при клике на иконку кластерера
Clusterer.PopUp = function ( cluster ) {
var clusterer = cluster.clusterer;
var showMarker = Math.round(cluster.markers.length / 2);
var curZoom = map.getZoom() + 1;
map.panTo(cluster.markers[showMarker].getPoint());
map.setZoom(curZoom);
};

Мой вариант вы так же можете использовать.

Потом мне захотелось поменять иконку. Это можно сделать либо как написано на странице скрипта:

clusterer.SetIcon(icon)

либо поменять строчки в самом файле (создается как обычная иконка маркера):

Clusterer.defaultIcon = new GIcon();
Clusterer.defaultIcon.image = 'http://wifi4free.ru/files/images/hotarea.png';
Clusterer.defaultIcon.iconSize = new GSize( 40, 40 );
Clusterer.defaultIcon.iconAnchor = new GPoint( 20, 20 );
Clusterer.defaultIcon.infoWindowAnchor = new GPoint( 20, 20 )

Потом я еще повозился с цифрами для минимального количества маркеров в кластере и остальными настройками (они для каждого свои):

clusterer.SetMaxVisibleMarkers(n) // максимальное количество видимых маркеров
clusterer.SetMinMarkersPerCluster(n) // сколько минимум маркеров в кластерере
clusterer.SetMaxLinesPerInfoBox(n) // количество строчек в инфоокне кластерера (мне было не нужно)

В итоге я оптимизировал и ускорил работу карты, которую вы можете видеть на страницах нашей карты точек Wi-Fi.

В общем, в следующей статье я расскажу про инфоокна, которые позволят вам делать подсказки на ваш вкус. Если же у вас есть какие-то вопросы или пожелания по поводу статей о Google Maps API, пишите в комментариях.

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

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

RSS
  • Аватарка
    20 мая 2009 в 11:27 ]]>Neutron]]>
    Эх... сижу разбираюсь с api от яндекс-карт и ничегошеньки не понимаю... к сожалению гугловской карты для моего города хорошей нет, а жаль, ваши руководства мне бы очень помогли...
  • Аватарка
    20 мая 2009 в 11:42 ]]>Grin]]>
    Neutron, возможно я скоро напишу какую-нибудь вводную статью по Яндекс.Картам
  • Аватарка
    20 мая 2009 в 13:12 ]]>Kotelnikov]]>
    А как на счет OpenStreetMap? Через http://openlayers.com/
  • Аватарка
    20 мая 2009 в 13:16 ]]>Neutron]]>
    Grin, ,буду очень ждать, а то самому не разобраться никак...
  • Аватарка
    20 мая 2009 в 13:17 ]]>Kotelnikov]]>
    Примерно как-то так: http://www.openlayers.org/dev/examples/sundials-spherical-mercator.html
  • Аватарка
    20 мая 2009 в 14:33 Likoo
    А почему отключили зумирование скроллом мышки?
  • Аватарка
    20 мая 2009 в 15:01 ]]>Grin]]>
    Likoo, мне это показалось не очень удобным, особенно на ноутах с тачпадом
  • Аватарка
    20 мая 2009 в 16:49 ]]>Сашко]]>
    Grin, можешь написать статью о базе данных (мускуле), точнее как хранить там точки и привязывать к карте? Разобрался тока с xml, там все просто оказалось. А вот чтобы из БД брал данные - это труднее, тем более думаю надо js+php+mysql задействовать
  • Аватарка
    20 мая 2009 в 16:53 ]]>Сашко]]>
    Сорри, нашел ответ на свой вопрос: http://code.google.com/support/bin/answer.py?answer=65622&topic=&ctx=sibling
  • Аватарка
    20 мая 2009 в 20:11 ]]>Dr.Death]]>
    http://googlegeodevelopers.blogspot.com/2009/04/markerclusterer-solution-to-too-many.html еще одно решение
  • Аватарка
    20 мая 2009 в 20:33 ]]>Grin]]>
    Dr.Death, спасибо, судя по дате поста, его не было, когда я делал наш проект
  • Аватарка
    29 мая 2009 в 12:33 ]]>noonv]]>
    Привет :) я так же реализовал сервис на основе карт от гугла :) однако недавно решил портировать этот севис на livestreet и столкнулся с неожиданной проблемой - маркеры прекрасно отображаются в FF, а в IE, Opera, Chrome - не отображаются :(
    http://livestreet.ru/blog/1695.html
    - не сталктвались с такими проблемами?
  • Аватарка
    12 июня 2009 в 10:31 ]]>БОШ]]>
    Вопрос немного не в тему. С помощью какого сервиса вы реализовывали смс-биллинг?
  • Аватарка
    12 июня 2009 в 10:38 ]]>Grin]]>
    БОШ, A1Agregator
  • Аватарка
    6 июля 2009 в 17:12 Евгений
    >> clusterer.AddMarker(marker, title);
    Как я понял в кластер можно добавлять маркеры произвольным образом.
    Как у вас реализована группировка по координатом? что бы в кластер попадали только рядом стоящие маркеры и как вычесляется координата где отображать сам кластер
  • Аватарка
    7 августа 2009 в 19:59 ]]>dr.death]]>
    что то он у меня ругается:
    GIcon is not defined
    [Break on this error] Clusterer.defaultIcon = new GIcon();rn
  • Аватарка
    26 января в 2:14 deadbead
    Заметил неприятную особенность на wifi4free.ru: при клике на кластер расположенный не по центру карты масштаб увеличивается, но карта не центрируется по кликнутому объекту... получается что интересующая область осталась за границей просмотра... Это сделано намерено или нет возможности использовать .setCenter в библиотеке?
  • Аватарка
    9 февраля в 0:33 ]]>Grin]]>
    deadbead, я раньше такого не замечал. И насколько помню, при разработке я как раз делал так, чтобы карта центрировалась по кликнутому объекту.
  • Аватарка
    17 марта в 16:54 Евгений
    Есть такое дело, легко подправить, В функции PopUp вместо двух последних строчек:
    map.panTo(cluster.markers[showMarker].getPoint());
    map.setZoom(curZoom);

    нужно написать
    map.setCenter(cluster.markers[showMarker].getPoint(), curZoom);

  • Аватарка
    27 марта в 21:18 ]]>Роман]]>
    Я еще не пользовался такой вещью, только Яндекс картами
  • Аватарка
    3 сентября в 13:35 ]]>Сергей]]>
    а не сталкивались со сдвигом иконок?
    т.е. если использую свои иконки то они сдвигаются на карте, устанавливаю стандартным маркером, а отображаю свои. Калибровал как мог все равно идет сдвиг при масштабировании.
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>