Интеграция Spiderfier JS в markerClusterer V3 для взрыва мультимаркеров с одинаковыми long / lat - PullRequest
24 голосов
/ 15 марта 2012

Я использую markerCLusterer V3 в файле базы данных из Filemaker для создания (полуживой) карты текущих мест доставки, основанной на адресах. Захватывая лат / лонг из Google и заполняя эти поля не проблема. Создание карты с помощью markerClusterer не является проблемой. Я даже размещаю JS локально, чтобы я мог изменить переменную maxZoom, чтобы разбить кластеры выше максимального увеличения, чтобы я мог видеть несколько маркеров. Однако, с маркерами на одном и том же широте / долготе, я вижу только последний введенный. Я хотел бы интегрировать OverlappingMarkerSpiderfier в этот JS, чтобы после увеличения масштаба за maxZoom маркеры «падали» друг от друга, чтобы увидеть маркеры (например, несколько единиц оборудования доставляются по одному и тому же адресу). Я не могу найти здесь никакой информации о том, как это сделать. Либо это так просто, и я скучаю по нему, либо это еще не сделано. Заранее спасибо за любую помощь!

Ответы [ 5 ]

13 голосов
/ 23 июля 2012

Я использую: MarkerClustererPlus-2.0.14 и OverlappingMarkerSpiderfier-версия - ??

Сначала работает только кластеризация, щелчок по кластеру увеличивает, но 2 или более маркеров на одной и той же точке все еще остаются кластером, даже если масштаб увеличен до максимума. К сожалению, паук не появился :-(.

Но потом заметил метод setMaxZoom () для markerClusterPlus. При настройке этого тоже ваш соответствующий уровень масштабирования (15 для меня) spiderfier выходит за рамки уровня масштабирования. Похоже, markerClusters говорит, что это больше не мое дело, теперь дело до паука :-).

9 голосов
/ 24 июля 2012

Установка максимального увеличения решит проблему:

minClusterZoom = 14;
markerCluster.setMaxZoom(minClusterZoom);

, но для целей просмотра вы можете захотеть создать слушатель кластерного клика, чтобы он не приближался очень близко к кластеру точек в одном месте(щелкнув кластер, установите границы карты, чтобы покрыть точки в кластере; если все точки находятся в одном и том же месте, он будет увеличиваться во всех направлениях, что обычно выглядит плохо):

google.maps.event.addListener(markerCluster, 'clusterclick', function(cluster) {
    map.fitBounds(cluster.getBounds()); // Fit the bounds of the cluster clicked on
    if( map.getZoom() > minClusterZoom+1 ) // If zoomed in past 15 (first level without clustering), zoom out to 15
        map.setZoom(minClusterZoom+1);
});
6 голосов
/ 02 июня 2016

Интеграция Spiderfier JS в markerClusterer

  • Загрузите файл oms.min.js из здесь
  • Загрузите markerClusterer.js и image папка из здесь

Чтобы заставить оба работать вместе, вам нужно всего лишь добавить maxZoom в объект clusterMarker

 new MarkerClusterer(map, clusterMarker, {imagePath: 'images/m', maxZoom: 15}); 

(Zoomlevel 0 - полная земля, а 20 довольно близко к земле).Это означает, что если вы увеличите масштаб карты до уровня 15 (например, если щелкнуть кластер), кластеры больше не будут отображаться.Если вы теперь нажмете на маркеры, которые находятся в одном и том же месте (или близко друг к другу), сработает Spiderfier JS.

Теперь следует минимальный рабочий пример.Я сделал несколько комментариев в коде, так что я думаю, что он не требует пояснений, но вот некоторые вещи, на которые стоит обратить внимание:

  • Замените YOUR_API_KEY на ваш ключ API
  • Убедитесь, что загружен oms.min.js после загрузки Google Maps API

Пример:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <script     src="https://maps.googleapis.com/maps/apijs?key=YOUR_API_KEY">
  </script>
  <script src="oms.min.js"></script>
  <script src="markerclusterer.js"></script>
  <script>
    window.onload = function() {
      // cluster marker
      var clusterMarker = [];

      var map = new google.maps.Map(document.getElementById('map'), {
        center: new google.maps.LatLng( 50, 3),
        zoom: 6,
        mapTypeId: 'terrain'
      });

      // Create infowindow
      var infoWindow = new google.maps.InfoWindow();

      // Create OverlappingMarkerSpiderfier instsance
      var oms = new OverlappingMarkerSpiderfier(map,
        {markersWontMove: true, markersWontHide: true});

      // This is necessary to make the Spiderfy work
      oms.addListener('click', function(marker) {
        infoWindow.setContent(marker.desc);
        infoWindow.open(map, marker);
      });

      // Some sample data
      var sampleData = [{lat:50, lng:3}, {lat:50, lng:3}, {lat:50, lng:7}];


      for (var i = 0; i < sampleData.length; i ++) {

        var point = sampleData[i];
        var location = new google.maps.LatLng(point.lat, point.lng);

        // create marker at location
        var marker = new google.maps.Marker({
          position: location,
          map: map
        });

        // text to appear in window
        marker.desc = "Number "+i;

        // needed to make Spiderfy work
        oms.addMarker(marker);

        // needed to cluster marker
        clusterMarker.push(marker);
      }

      new MarkerClusterer(map, clusterMarker, {imagePath: 'images/m', maxZoom: 15});
    }
  </script>
</head>
<body><div id="map" style='width:400px;height:400px;'></div></body></html>

Рекомендация

Если вы начинаете с нуляЯ бы рекомендовал использовать JS Libary Leaflet .Потому что эта библиотека предоставляет вам плагин LeafletMarkerCluster , который в основном является markercluster со встроенным Spiderfier, и множество других интересных вещей.

Преимущество:

  • Кластер выглядит очень красиво
  • Листовка действительно проста в использовании и выглядит красиво
  • Вам не нужно настраивать код, потому что Spiderfier и markerCluster уже интегрированы
  • Некоторыедругие интересные вещи: например, отображение границы при наведении на область, где расположен маркер.
  • Вы можете свободно выбирать провайдера map-tile и больше не ограничены гугл картами ( возможных провайдеров здесь )

Даунсайты:

  • Возможно, вам придется потратить 30 минут на изучение и использование Leaflet API вместо Google API
  • Если вы хотитечтобы использовать Google Map Tiles, вам нужно использовать этот плагин , потому что вы можете использовать Google Tiles только при использовании Google API.Этот плагин является оболочкой для Google API.

Вот пример кода:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7/leaflet.css" />
  <script src="http://cdn.leafletjs.com/leaflet-0.7/leaflet.js"></script>
  <link rel="stylesheet" href="leaflet/dist/MarkerCluster.css" />
  <link rel="stylesheet" href="leaflet/dist/MarkerCluster.Default.css" />
  <script src="leaflet/dist/leaflet.markercluster-src.js"></script>
  <script>
    $(document).ready(function(){

    var tiles = L.tileLayer(***);//Depending on your tile provider

    var map = new L.Map('map', {center: latlng, zoom: 1, layers: [tiles]});

    var markers = new L.MarkerClusterGroup({
      removeOutsideVisibleBounds: true,
      spiderfyDistanceMultiplier: 2,
      maxClusterRadius: 20
    });
    var markersList = [];

    var sampleData = [{lat:50, lng:3}, {lat:50, lng:3}, {lat:50, lng:7}];

    for (var i = 0; i < sampleData.length; i ++) {

      var point = sampleData[i];
      var location = new L.LatLng(point.lat, point.lng);

      // create marker at location

      var m = new L.Marker(location);
      m.bindPopup("Number" +i); //Text to appear in window
      markersList.push(m);
      markers.addLayer(m);
    }

    var bounds = markers.getBounds();
    map.fitBounds(bounds)
    map.addLayer(markers);
}    
</head>
<body><div id="map" style='width:400px;height:400px;'></div></body></html>
2 голосов
/ 30 марта 2012

Я наткнулся на это сообщение, потому что искал точно такую ​​же вещь, но, к счастью для меня, я заставил ее работать!

Честно говоря, я ничего особенного не делал, я следовал руководству по интеграции для MarkerClusterer, а затем следовал руководству по интеграции для OverlappingMarkerSpiderfier, и они работают безупречно вместе.

Когда я нажимаю / увеличиваю кластер свойств, которые находятся по одному и тому же адресу, изначально он просто показывает «верхний» маркер, но когда я нажимаю на него, они отображаются как Spiderfy так, как вы этого хотите.тоже!

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

0 голосов
/ 09 августа 2015
 var markerClusterer = new MarkerClusterer(map, myMarkers, {
 maxZoom: 15,
 zoomOnClick: false
   });
//zoom 0 corresponds to a map of the Earth fully zoomed out, 20 is closeup
//markerCluster goes away after zoom 
//turn off zoom on click or spiderfy won't work 
...