javascript - MarkerClustererPlus 如何为聚类图像设置不同的尺寸?

标签 javascript google-maps maps markerclusterer

我正在尝试制作一个聚类图,根据聚类大小调整图标的大小。 我正在使用 masterclusterplus 库,并且我已经进行了一些调整,以便能够在同一张 map 上拥有多个组。 我已经关注了这个问题:MarkerClustererPlus: set icon color/url independent of size 组中的每个圆都有相同的半径,我不知道如何更改它。

代码:

function loadMapData() {

    var me = this;

    var map = document.getElementById("map");

    var lat = 50;
    var long = 12;
    var type = google.maps.MapTypeId["ROADMAP"];
    var zoom = 4;

    var center = new google.maps.LatLng(lat, long);

    var options = {
        'zoom': zoom,
        'center': center,
        'mapTypeId': type
    };

    var map = new google.maps.Map(map, options);
    var markers = [];

    var maxLat = 70;
    var minLat = 37;
    var maxLong = 50;
    var minLong = -8;


    for (var j = 0; j < 300; j++) {

        var marker = new google.maps.Marker({
            position: new google.maps.LatLng(me.getRandom(minLat, maxLat),
                                             me.getRandom(minLong, maxLong)),
        });
        markers.push(marker);
    }


    var mcOptions = {
        enableRetinaIcons: true,
        styles: [{
            textColor: 'black',
            url: '/mapapp/themes/4.svg',
            "height": 80,
            "width": 80
        }]
    };

    var mc = new MarkerClusterer(map, markers, mcOptions);


    var sizes = [];
    for (var j = 0; j < 300; j++) {

        var marker = new google.maps.Marker({
            position: new google.maps.LatLng(me.getRandom(minLat, maxLat),
                                             me.getRandom(minLong, maxLong)),
        });

        markers.push(marker);

        var r = j + 30;
        sizes.push(r);
    }

    var mcOptions = {
        enableRetinaIcons: true,
        imageSizes: [20,30,40,50,60,70],
         styles: [{
            textColor: 'black',
            url: '/mapapp/themes/3.svg',
             width: 40,
             height: 40
        }]
    };
    var mc = new MarkerClusterer(map, markers, mcOptions);

}



function getRandom(min, max) {
    return Math.random() * (max - min + 1) + min;
}

map cluster

最佳答案

如果不修改库,这是不可能的,因为库需要一组预定义的样式。

通过 CSS 而不是图像创建圆圈的可能方法:

重写createCss方法来为集群应用动态大小:

ClusterIcon.prototype.createCss = function(pos) {
  var size = Math.min(this.cluster_.getMarkers().length + 10,
      100 //possible max-size of a cluster-icon
    ),

    style = ['border-radius : 50%',
      'line-height   : ' + size + 'px',
      'cursor        : pointer',
      'position      : absolute',
      'top           : ' + pos.y + 'px',
      'left          : ' + pos.x + 'px',
      'width         : ' + size + 'px',
      'height        : ' + size + 'px'
    ];
  return style.join(";") + ';';
};

function randPos() {
  return new google.maps.LatLng(((Math.random() * 16000 - 8000) / 100), ((Math.random() * 34000 - 17000) / 100));
}

function initialize() {
  var center = new google.maps.LatLng(37.4419, -122.1419);

  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 1,
    center: center,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  var groups = {
    a: {
      markers: [],
      mc: null,
      color: 'red'
    },
    b: {
      markers: [],
      mc: null,
      color: 'gold'
    },
    c: {
      markers: [],
      mc: null,
      color: 'purple'
    }
  };
  for (var k in groups) {
    for (var i = 0; i < 300; ++i) {
      groups[k].markers.push(new google.maps.Marker({
        map: map,
        position: randPos()
      }));
    }
    groups[k].mc = new MarkerClusterer(map,
      groups[k].markers, {
        enableRetinaIcons: true,
        clusterClass: 'cluster cluster_' + groups[k].color
      });
  }


}
google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#map {
  height: 100%;
  padding: 0;
  margin: 0;
}
.cluster {
  display: table;
  box-shadow: 0px 0px 1px 1px rgba(0, 0, 0, 0.5);
}
.cluster img {
  display: none
}
.cluster div {
  color: inherit !important;
  display: table-cell;
  vertical-align: middle;
  width: 100% !important;
  height: 100% !important;
  line-height: inherit !important;
}
/*custom cluster-styles*/

.cluster_red {
  background: red;
}
.cluster_gold {
  background: gold;
}
.cluster_purple {
  background: purple;
  color: #fff !important
}
<script src="http://maps.googleapis.com/maps/api/js?v=3"></script>
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/src/markerclusterer.js"></script>
<div id="map"></div>

使用背景图像的示例(通过 svg 的星星,仅更改了 CSS)

ClusterIcon.prototype.createCss = function(pos) {
  var size = Math.min(this.cluster_.getMarkers().length + 20,
      100 //possible max-size of a cluster-icon
    ),

    style = ['border-radius : 50%',
      'line-height   : ' + size + 'px',
      'cursor        : pointer',
      'position      : absolute',
      'top           : ' + pos.y + 'px',
      'left          : ' + pos.x + 'px',
      'width         : ' + size + 'px',
      'height        : ' + size + 'px'
    ];
  return style.join(";") + ';';
};

function randPos() {
  return new google.maps.LatLng(((Math.random() * 16000 - 8000) / 100), ((Math.random() * 34000 - 17000) / 100));
}

function initialize() {
  var center = new google.maps.LatLng(37.4419, -122.1419);

  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 1,
    center: center,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  var groups = {
    a: {
      markers: [],
      mc: null,
      color: 'red'
    },
    b: {
      markers: [],
      mc: null,
      color: 'gold'
    },
    c: {
      markers: [],
      mc: null,
      color: 'purple'
    }
  };
  for (var k in groups) {
    for (var i = 0; i < 300; ++i) {
      groups[k].markers.push(new google.maps.Marker({
        map: map,
        position: randPos()
      }));
    }
    groups[k].mc = new MarkerClusterer(map,
      groups[k].markers, {
        enableRetinaIcons: true,
        clusterClass: 'cluster cluster_' + groups[k].color
      });
  }


}
google.maps.event.addDomListener(window, 'load', initialize);
      html,
      body,
      #map {
        height: 100%;
        padding: 0;
        margin: 0;
      }
      .cluster {
        display: table;
        background-size: cover;
      }
      .cluster img {
        display: none
      }
      .cluster div {
        color: inherit !important;
        display: table-cell;
        vertical-align: middle;
        width: 100% !important;
        height: 100% !important;
        line-height: inherit !important;
      }
      /*custom cluster-styles*/
      .cluster_red {
        background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludHM9IgoJMjU5LjIxNiwyOS45NDIgMzMwLjI3LDE3My45MTkgNDg5LjE2LDE5Ny4wMDcgMzc0LjE4NSwzMDkuMDggNDAxLjMzLDQ2Ny4zMSAyNTkuMjE2LDM5Mi42MTIgMTE3LjEwNCw0NjcuMzEgMTQ0LjI1LDMwOS4wOCAKCTI5LjI3NCwxOTcuMDA3IDE4OC4xNjUsMTczLjkxOSAiLz4KPC9zdmc+);
      }
      .cluster_gold {
        background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBvbHlnb24gZmlsbD0iZ29sZCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgcG9pbnRzPSIKCTI1OS4yMTYsMjkuOTQyIDMzMC4yNywxNzMuOTE5IDQ4OS4xNiwxOTcuMDA3IDM3NC4xODUsMzA5LjA4IDQwMS4zMyw0NjcuMzEgMjU5LjIxNiwzOTIuNjEyIDExNy4xMDQsNDY3LjMxIDE0NC4yNSwzMDkuMDggCgkyOS4yNzQsMTk3LjAwNyAxODguMTY1LDE3My45MTkgIi8+Cjwvc3ZnPg==);
      }
      .cluster_purple {
        background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBvbHlnb24gZmlsbD0icHVycGxlIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludHM9IgoJMjU5LjIxNiwyOS45NDIgMzMwLjI3LDE3My45MTkgNDg5LjE2LDE5Ny4wMDcgMzc0LjE4NSwzMDkuMDggNDAxLjMzLDQ2Ny4zMSAyNTkuMjE2LDM5Mi42MTIgMTE3LjEwNCw0NjcuMzEgMTQ0LjI1LDMwOS4wOCAKCTI5LjI3NCwxOTcuMDA3IDE4OC4xNjUsMTczLjkxOSAiLz4KPC9zdmc+);
        color: #fff !important
      }
<script src="http://maps.googleapis.com/maps/api/js?v=3"></script>
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/src/markerclusterer.js"></script>
<div id="map"></div>

关于javascript - MarkerClustererPlus 如何为聚类图像设置不同的尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29311945/

相关文章:

javascript - 如何使用 Leaflet 中的自定义控件切换可点击标记属性?

javascript - emscripten - 如何从 JavaScript (Chrome/Firefox) 读取 C 数组?

javascript - Angularjs 计算页面浏览量并显示

.net - 如何在网页上实现文件上传进度条?

javascript - gmaps.js 添加DrawingManager控件

android - 在 Android 中触摸位置的谷歌地图上添加标记

javascript - JQuery 和 Google map API 问题

javascript - jQuery:尝试绑定(bind)事件时对对象的错误引用

api - 在 Apple Watch 上显示可缩放、可滚动的图像

javascript - 加载纽约 map