Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Вывод нескольких маркеров на карте и кластеризация (https://javascript.ru/forum/css-html/63028-vyvod-neskolkikh-markerov-na-karte-i-klasterizaciya.html)

sergofedor06 13.05.2016 11:26

Вывод нескольких маркеров на карте и кластеризация
 
Приветствую!
Есть такой код, в данном примере он выводит 4 маркера на карте
все работает исправно, но есть проблема если таких маркеров я добавлю много то будет смотреться
плохо.

Для этого мне нужна кластеризация этих маркеров, помогите примером кто сталкивался с этим
я в курсе что нужна библиотека
markerclusterer.js
и возможно
jquery.min.js

нужна такая кластерезация маркеров как тут




<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2"></script>
<body onload="showMap();" onunload="GUnload()">


<script type="text/javascript">

function showMap()
{
if (GBrowserIsCompatible()) {
var map = new GMap(document.getElementById("map_canvas"));  
map.addControl(new GLargeMapControl());	  
map.addControl(new GMapTypeControl());          
map.setCenter(new GLatLng(41.881576,12.495232), 6);  
var icon = new GIcon();
icon.image = "http://mapszoom.com/temp/map/img/location.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 6);
icon.infoWindowAnchor = new GPoint(1, 1);




function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(description, icon);
});
return marker;
}

map.addOverlay(createMarker(new GLatLng(41.888014,12.482378), "Описание 1 - маркера", icon)); 




function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(description, icon);
});
return marker;
}
  
map.addOverlay(createMarker(new GLatLng(41.89616,12.484159), "Описание 2 - маркера", icon));




function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(description, icon);
});
return marker;
}
     
map.addOverlay(createMarker(new GLatLng(41.893445,12.483258), "Описание 3 - маркера", icon));




function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(description, icon);
});
return marker;
}
        
map.addOverlay(createMarker(new GLatLng(41.911132,12.48741), "Описание 4 - маркера", icon)); 


}
}

</script>

<div id="map_canvas" style="width: 800px; height: 500px;"></div>

Dilettante_Pro 13.05.2016 12:33

sergofedor06,
Пример использования
http://www.sitedev.by/blog/google-ma...kerclustererjs
http://webmap-blog.ru/google-maps/kl...-kartax-google
jquery не нужен - чистый js

Dilettante_Pro 13.05.2016 12:38

sergofedor06,
А зачем у вас 4 раза повторяется описание одной и той же функции createMarker?
Достаточно и одного описания - и используй сколько хочешь раз

sergofedor06 13.05.2016 13:12

А зачем у вас 4 раза повторяется описание одной и той же функции createMarker?
Достаточно и одного описания - и используй сколько хочешь раз


если можно приведите пример как избавится от этих повторений кода

function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(description, icon);
});
return marker;
}

Dilettante_Pro 13.05.2016 13:19

sergofedor06,
Просто удалить 2, 3, 4 дубли - оставить только первый

sergofedor06 13.05.2016 13:27

отлично все вышло

<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2"></script>
<body onload="showMap();" onunload="GUnload()">


<script type="text/javascript">

function showMap()
{
if (GBrowserIsCompatible()) {
var map = new GMap(document.getElementById("map_canvas"));  
map.addControl(new GLargeMapControl());	  
map.addControl(new GMapTypeControl());          
map.setCenter(new GLatLng(41.881576,12.495232), 6);  
var icon = new GIcon();
icon.image = "http://mapszoom.com/temp/map/img/location.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 6);
icon.infoWindowAnchor = new GPoint(1, 1);

function createMarker(point, description, icon) {
var marker = new GMarker(point, icon);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(description, icon);
});
return marker;
}

map.addOverlay(createMarker(new GLatLng(41.888014,12.482378), "Описание 1 - маркера", icon)); 
map.addOverlay(createMarker(new GLatLng(41.89616,12.484159), "Описание 2 - маркера", icon));
map.addOverlay(createMarker(new GLatLng(41.893445,12.483258), "Описание 3 - маркера", icon));
map.addOverlay(createMarker(new GLatLng(41.911132,12.48741), "Описание 4 - маркера", icon)); 

}
}

</script>

<div id="map_canvas" style="width: 800px; height: 500px;"></div>




если можно сделайте правку в этом коде, что бы выводило маркеры с кластеризацией!

Dilettante_Pro 13.05.2016 17:48

sergofedor06,
что-то никак не могу найти библиотеку для MarkerClusterer - все, что раньше подключал, недоступно...

Попутно переделал ваш вариант под API V3

<script src="https://maps.google.com/maps/api/js?sensor=false"> </script>
    <script>

        var mark = [{ LatLang: { lat: 41.888014, lng: 12.482378 }, description: "Описание 1 - маркера" },
    { LatLang: { lat: 41.89616, lng: 12.484159 }, description: "Описание 2 - маркера" },
    { LatLang: { lat: 41.893445, lng: 12.483258 }, description: "Описание 3 - маркера" },
    { LatLang: { lat: 41.911132, lng: 12.48741 }, description: "Описание 4 - маркера" }
        ];

        function e() {
            var centerLatLng = { lat: 41.881576, lng: 12.495232 };
            var e = document.getElementById("map"),
            t = {
                center: centerLatLng,
                zoom: 10,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var gmap = new google.maps.Map(e, t);
            var marker = [], infowindow=[];
            for (i = 0; i < 4; i++) {
                marker[i] = new google.maps.Marker({
                    position: mark[i].LatLang,
                    map: gmap,
                    title: mark[i].description
                });
                marker[i].setMap(gmap);

                infowindow[i] = new google.maps.InfoWindow({
                         content: mark[i].description
                });
                marker[i].id = i;
                marker[i].addListener('click', function () {
                    infowindow[this.id].open(gmap, this);
                });


            }
        //    var markerClusterer = new MarkerClusterer(_this.map, marker,
        //         {
        //          maxZoom: 13,
        //          gridSize: 50,
        //          styles: null
        //     });

        };
        google.maps.event.addDomListener(window, 'load', e);


    </script>
</head>
<body>
    <div id="map" style="width: 800px; height: 500px;">
    </div>
</body>

Dilettante_Pro 13.05.2016 18:10

sergofedor06,
Скачал дистрибутив библиотеки из
https://github.com/googlemaps/js-marker-clusterer
Разместил markerclusterer.js в scripts в корне сайта,
картинки - в images в корне сайта.
В файле markerclusterer.js строки
190 MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ =
191 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' +
192 'images/m';
- удалил строку 191 ( а то обращается по полному пути и не находит. Раньше там же лежали и библиотеки, а теперь ничего не лежит - надо скачивать)

Добавил в код моего примера строку
<script src="scripts/markerclusterer.js"></script>
Раскомментировал в примере строки 38-43

Все работает:victory:

sergofedor06 15.05.2016 13:47

Спасибо конечно, но если честно я ничего не понял!
где этот markerclusterer.js так и не нашел в корне сайта нет папки (scripts)

я взял markerclusterer.js отсюда - https://code.google.com/p/google-map...terer.js?r=360


положил в папку с моим скриптом то что вы правили
добавил
<script src="markerclusterer.js"></script>


то не работает кластеризация вообще!
может я не так делаю, если вы сделали и у вас работает, можете скинуть архив?

sergofedor06 15.05.2016 13:52

также подключал и эту библиотеку https://github.com/googlemaps/js-mar...erclusterer.js

но толку нет!

Dilettante_Pro 16.05.2016 10:43

sergofedor06,
Цитата:

Сообщение от sergofedor06
где этот markerclusterer.js так и не нашел в корне сайта нет папки (scripts)

markerclusterer.js на github лежит в папке src
В папку scripts я положил его на своем сайте, поэтому и добавил загрузку
<script src="scripts/markerclusterer.js"></script>
Цитата:

Сообщение от sergofedor06
положил в папку с моим скриптом то что вы правили

Вы использовали мой вариант скрипта? В том числе и подключение библиотеки Google maps api? (В вашем варианте загрузки библиотеки указано v=2 - несовместимо с markerclusterer v3)
Картинки для markerclusterer разместили на своем сайте в корневой папке в папке image?
Цитата:

Сообщение от sergofedor06
также подключал и эту библиотеку https://github.com/googlemaps/js-mar...erclusterer.js

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

Посмотрите сообщения в консоли браузера.

Dilettante_Pro 16.05.2016 16:06

В том, что работает, можете убедиться
http://dilettante.usite.pro/index/maps/0-5

sergofedor06 17.05.2016 10:58

Спасибо большое!
С примером все гуд, есть только не ясность

именно с директорией с картинками кластеров!
путь к директории должен быть абсолютным в виде ссылки как у вас там ссылка прописана до папки с фото 5 кластеров?

я прописал относительный путь, вида
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'images';

и сложил 5 картинок в папку (images)

но в таком варианте картинки кластеров не подгружает че-то!
в чем проблема не в курсе, или только нужно указывать прямую ссылку на парку с кластерами

sergofedor06 17.05.2016 11:07

Опачки, у меня по ссылке не подгружает картинки кластеров
скачал с гитхаба картинки 5 шт, с именами

m1.png
m2.png
m3.png
m4.png
m5.png

положил в директорию (images)

путь прописал
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'http://moidomen.ru/images';

что не так?

возможно картинки должны иметь другое название?

скиньте пожалуйста содержимое
http://dilettante.usite.pro/images/m

Dilettante_Pro 17.05.2016 11:15

sergofedor06,
я же вам писал:
190 MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ =
191 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' +
192 'images/m';
- удалить строку 191

В результате получается:

MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'images/m';

т.е. папка images, в ней лежат перечисленные вами файлы картинок

m используется библиотекой как начало имени файла картинки

sergofedor06 17.05.2016 11:41

вы наверное не поняли, на этот раз я взял ваш скрипт и библиотеку
http://dilettante.usite.pro/scripts/markerclusterer.js

у вас вроде все удалено и работает

я взял код из вашего примера

http://dilettante.usite.pro/index/maps/0-5

все работает, только если я подменяю
ваше
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'http://dilettante.usite.pro/images/m';
на мое
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'http://moidomen.ru/images';

то не работает, 5 картинок я скачал и положил в папку
http://moidomen.ru/images

вот суть вопроса в чем, те грабли что были раньше я уже прошел, в чем причина и почему не подгружает картинки кластеров вот в этом у меня вопрос?

sergofedor06 17.05.2016 11:44

все с таким путем к картинкам работает
images/m

спасибо!

Dilettante_Pro 17.05.2016 11:46

sergofedor06,
Повторяю еще раз:
Вместо
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'http://moidomen.ru/images';
нужно
MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PAT H_ = 'http://moidomen.ru/images/m';

m используется библиотекой как начало имени файла картинки - к нему программно добавляется номер файла и расширение

sergofedor06 17.05.2016 11:48

да, я прочитал и понял что вы имели ввиду, сразу не мог понять почему не работает, скажите такой вариант способен вывести к примеру 1000 меток на карте?

Dilettante_Pro 17.05.2016 11:57

sergofedor06,
Пример с 1000 маркеров
http://dilettante.usite.pro/index/maps/0-5

andrey3681 30.06.2016 15:15

sergofedor06,
Вы разобрались с кластеризацией? А то у меня тоже ничего не получается:(

andrey3681 30.06.2016 15:34

<script type='text/javascript'><!--
				var map;
				function initialize() {
					var center = new google.maps.LatLng($coordinates);
					var myOptions = {
					zoom: $ZoomHeaderMap,
					center: center,
					mapTypeId: google.maps.MapTypeId.ROADMAP,
					maxZoom: 50,
					scrollwheel: false
					};
					var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
				";
				//Вывод информации из БД
				$query= mysql_query("SELECT * FROM $TableNameGoogleMaps ORDER BY id");
				while ($row=mysql_fetch_array($query))
				{
					$idMarker = $row['id'];
					$transliterate_title_map = $row['transliterate_title'];
					$address = $row['address'];
					$img = $row['img'];
					$title = $row['title'];
					$info = $row['info'];
					
					$result = mysql_query("SELECT * FROM images WHERE id='$img' ORDER BY id");
					while ($myrow=mysql_fetch_array($result))
					{
						$ImgName = $myrow['name'];
					}
					$coordinates = $row['coordinates'];
					$info = "<div id='infoContent'><img src='images/$ImgName' title='$address' alt='$title' width='179' height='119'><br><a href='$link_appartment$transliterate_title_map.html'>$title</a><br>$address</div>";
					$result = explode(",", $coordinates);
					echo "
					
						var contentString$idMarker = \"$info\";
						var infowindow$idMarker = new google.maps.InfoWindow({
							content: contentString$idMarker
						});
						var marker$idMarker = new google.maps.Marker({
							position: {lat: $result[0], lng: $result[1]},
							map: map,
							title: '$title',
							animation: google.maps.Animation.DROP,
							visible: true,
							icon: \"images/beachflag.png\"
						});
						google.maps.event.addListener(marker$idMarker, \"click\", function() {
							infowindow$idMarker.open(map,marker$idMarker);
						});
					";
				}
				echo "
				}
			</script>

";
Подскажите, куда что добавить чтобы работала кластеризация?

рони 30.06.2016 17:42

andrey3681,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

sergofedor06 26.07.2016 12:27

Привет!
как в ява скрипте сменить иконку самого маркера на свою собственную,
сейчас по всем координатам отображает красный гугловский маркер, как мне его сменить на мою картинку маркера?
помогите пожалуйста!

рони 26.07.2016 12:31

sergofedor06,
пример
https://developers.google.com/maps/d...-symbol-custom

читать доку
https://developers.google.com/maps/d...script/markers

sergofedor06 26.07.2016 13:27

спасибо, сам разобрался!


Часовой пояс GMT +3, время: 09:19.