根据其中的标记设置标记簇图标
set marker cluster icon depending on markers inside it
我制作了一张带有集群的地图。 idea 是簇的颜色应该取决于内部标记的颜色:如果有红色标记,则簇为红色;没有红色,但有黄色标记,簇为黄色;没有红色和黄色标记,簇是蓝色的。
这仅在特定缩放级别下按预期工作。完全缩小它显示蓝色集群,但是那里有红色标记,所以我希望是红色集群。当我开始放大并且地图显示多个集群时,大多数看起来是正确的,但在某些情况下这种违规行为会重复出现,它会将 red/yellow/blue 标记分组为蓝色集群,我希望是红色。与黄色 + 蓝色标记相同,应该形成黄色簇,而不是蓝色。
根据 this setCalculator 函数分别为每个集群运行,因此我期待一致的行为,但结果却是混合的。
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(51, 4),
zoom:6,
mapTypeControlOptions:"roadmap"
});
var markers = [];
// make random red, yellow, blue markers
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/green.png',
label: i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(),4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/yellow.png',
label: i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(),4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/red.png',
label: i,
map: map
});
markers.push(marker);
}
// match cluster icon to markers
var calc = function(markers, numStyles) {
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
return {text: markers.length, index: 3}; // index of red
}else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
return {text: markers.length, index: 2}; // index of yellow
}else if (markers[i].getIcon().indexOf("green.png") > -1) {
return {text: markers.length, index: 1};// index of blue
}
}
}
// define cluster icons
var mcOptions = {gridSize: 50, maxZoom: 15, styles: [{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m1.png",
width: 50
},
{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m2.png",
width: 50
},
{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m3.png",
width: 50
}]
};
var markerCluster = new MarkerClusterer(map, markers, mcOptions);
markerCluster.setCalculator(calc);
}
#map {
height: 80%;
}
/* Optional: Makes the sample page fill the window. */
html, body {
height: 100%;
margin: 0;
padding: 0;
}
<script defer src="https://maps.googleapis.com/maps/api/js?v=3.42&key=AIzaSyA4PP1O36qWCzer8K3VFyjf0uxRs4WVNFo&callback=initMap"></script>
<script src="https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/markerclusterer.js"></script>
<div id="map"></div>
更新:更改了标记图标,使其与集群图标更容易区分。
您的问题之一是您的计算器功能。如果集群中有任何红色标记,您希望它为 return "red",如果有任何黄色标记但没有红色标记,则为黄色,否则为蓝色。编写代码来做到这一点:
// match cluster icon to markers
var calc = function(markers, numStyles) {
// default to blue
var highestPriorityColor = 1;
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
// if any markers are red, will be red, can return result
return {text: markers.length, index: 3}; // index of red
} else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
// if any markers are yellow, update it to yellow if it is blue
if (highestPriorityColor < 2)
highestPriorityColor = 2; // index of yellow
} /* else if (markers[i].getIcon().indexOf("green.png") > -1) {
// ignore green markers (leave it whatever color it is, defaults to blue)
} */
}
// return result once complete processing all the markers
return {text: markers.length, index: highestPriorityColor}; // index of chosen cluster
}
缩小
放大
放大红色“17”簇
代码片段:
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(51, 4),
zoom: 6,
mapTypeControlOptions: "roadmap"
});
var markers = [];
// make random red, yellow, blue markers
for (var i = 0; i < 50; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/green.png',
label: "" + i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/yellow.png',
label: "" + i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 5; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/red.png',
label: "" + i,
map: map
});
markers.push(marker);
}
// match cluster icon to markers
var calc = function(markers, numStyles) {
// default to blue
var highestPriorityColor = 1;
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
// if any markers are red, will be red, can return result
return {
text: markers.length,
index: 3
}; // index of red
} else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
// if any markers are yellow, update it to yellow if it is blue
if (highestPriorityColor < 2)
highestPriorityColor = 2; // index of yellow
}
/* else if (markers[i].getIcon().indexOf("green.png") > -1) {
// ignore green markers (leave it whatever color it is, defaults to blue)
} */
}
// return result once complete processing all the markers
return {
text: markers.length,
index: highestPriorityColor
}; // index of chosen cluster
}
// define cluster icons
var mcOptions = {
gridSize: 50,
maxZoom: 15,
styles: [{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m1.png",
width: 50
},
{
height: 60,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m2.png",
width: 60
},
{
height: 70,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m3.png",
width: 70
}
]
};
var markerCluster = new MarkerClusterer(map, markers, mcOptions);
markerCluster.setCalculator(calc);
}
#map {
height: 80%;
}
/* Optional: Makes the sample page fill the window. */
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
<script defer src="https://maps.googleapis.com/maps/api/js?v=3.42&key=AIzaSyA4PP1O36qWCzer8K3VFyjf0uxRs4WVNFo&callback=initMap"></script>
<script src="https://unpkg.com/@google/markerclustererplus@4.0.1/dist/markerclustererplus.min.js"></script>
<div id="map"></div>
我制作了一张带有集群的地图。 idea 是簇的颜色应该取决于内部标记的颜色:如果有红色标记,则簇为红色;没有红色,但有黄色标记,簇为黄色;没有红色和黄色标记,簇是蓝色的。
这仅在特定缩放级别下按预期工作。完全缩小它显示蓝色集群,但是那里有红色标记,所以我希望是红色集群。当我开始放大并且地图显示多个集群时,大多数看起来是正确的,但在某些情况下这种违规行为会重复出现,它会将 red/yellow/blue 标记分组为蓝色集群,我希望是红色。与黄色 + 蓝色标记相同,应该形成黄色簇,而不是蓝色。
根据 this setCalculator 函数分别为每个集群运行,因此我期待一致的行为,但结果却是混合的。
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(51, 4),
zoom:6,
mapTypeControlOptions:"roadmap"
});
var markers = [];
// make random red, yellow, blue markers
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/green.png',
label: i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(),4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/yellow.png',
label: i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(),4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/red.png',
label: i,
map: map
});
markers.push(marker);
}
// match cluster icon to markers
var calc = function(markers, numStyles) {
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
return {text: markers.length, index: 3}; // index of red
}else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
return {text: markers.length, index: 2}; // index of yellow
}else if (markers[i].getIcon().indexOf("green.png") > -1) {
return {text: markers.length, index: 1};// index of blue
}
}
}
// define cluster icons
var mcOptions = {gridSize: 50, maxZoom: 15, styles: [{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m1.png",
width: 50
},
{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m2.png",
width: 50
},
{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m3.png",
width: 50
}]
};
var markerCluster = new MarkerClusterer(map, markers, mcOptions);
markerCluster.setCalculator(calc);
}
#map {
height: 80%;
}
/* Optional: Makes the sample page fill the window. */
html, body {
height: 100%;
margin: 0;
padding: 0;
}
<script defer src="https://maps.googleapis.com/maps/api/js?v=3.42&key=AIzaSyA4PP1O36qWCzer8K3VFyjf0uxRs4WVNFo&callback=initMap"></script>
<script src="https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/markerclusterer.js"></script>
<div id="map"></div>
更新:更改了标记图标,使其与集群图标更容易区分。
您的问题之一是您的计算器功能。如果集群中有任何红色标记,您希望它为 return "red",如果有任何黄色标记但没有红色标记,则为黄色,否则为蓝色。编写代码来做到这一点:
// match cluster icon to markers
var calc = function(markers, numStyles) {
// default to blue
var highestPriorityColor = 1;
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
// if any markers are red, will be red, can return result
return {text: markers.length, index: 3}; // index of red
} else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
// if any markers are yellow, update it to yellow if it is blue
if (highestPriorityColor < 2)
highestPriorityColor = 2; // index of yellow
} /* else if (markers[i].getIcon().indexOf("green.png") > -1) {
// ignore green markers (leave it whatever color it is, defaults to blue)
} */
}
// return result once complete processing all the markers
return {text: markers.length, index: highestPriorityColor}; // index of chosen cluster
}
缩小
放大
放大红色“17”簇
代码片段:
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(51, 4),
zoom: 6,
mapTypeControlOptions: "roadmap"
});
var markers = [];
// make random red, yellow, blue markers
for (var i = 0; i < 50; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/green.png',
label: "" + i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 20; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/yellow.png',
label: "" + i,
map: map
});
markers.push(marker);
}
for (var i = 0; i < 5; i++) {
var latLng = new google.maps.LatLng(51.11 - Math.random(), 4.11 - Math.random());
var marker = new google.maps.Marker({
position: latLng,
icon: 'http://maps.google.com/mapfiles/ms/micons/red.png',
label: "" + i,
map: map
});
markers.push(marker);
}
// match cluster icon to markers
var calc = function(markers, numStyles) {
// default to blue
var highestPriorityColor = 1;
for (var i = 0; i < markers.length; i++) {
if (markers[i].getIcon().indexOf("red.png") > -1) {
// if any markers are red, will be red, can return result
return {
text: markers.length,
index: 3
}; // index of red
} else if (markers[i].getIcon().indexOf("yellow.png") > -1) {
// if any markers are yellow, update it to yellow if it is blue
if (highestPriorityColor < 2)
highestPriorityColor = 2; // index of yellow
}
/* else if (markers[i].getIcon().indexOf("green.png") > -1) {
// ignore green markers (leave it whatever color it is, defaults to blue)
} */
}
// return result once complete processing all the markers
return {
text: markers.length,
index: highestPriorityColor
}; // index of chosen cluster
}
// define cluster icons
var mcOptions = {
gridSize: 50,
maxZoom: 15,
styles: [{
height: 50,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m1.png",
width: 50
},
{
height: 60,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m2.png",
width: 60
},
{
height: 70,
url: "https://raw.githubusercontent.com/googlearchive/js-marker-clusterer/gh-pages/images/m3.png",
width: 70
}
]
};
var markerCluster = new MarkerClusterer(map, markers, mcOptions);
markerCluster.setCalculator(calc);
}
#map {
height: 80%;
}
/* Optional: Makes the sample page fill the window. */
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
<script defer src="https://maps.googleapis.com/maps/api/js?v=3.42&key=AIzaSyA4PP1O36qWCzer8K3VFyjf0uxRs4WVNFo&callback=initMap"></script>
<script src="https://unpkg.com/@google/markerclustererplus@4.0.1/dist/markerclustererplus.min.js"></script>
<div id="map"></div>