标记簇传单:动态修改图标
Marker cluster leaflet : dynamically modify icon
我正在使用 Leaflet 和标记集群插件,我想动态修改 child 所在集群的图标。
首先我创建了我的 clusterGroups,然后我添加了一些标记。
我创建了两个组,但我只显示第一个 "cluster",如果他的 children 中的一个也属于组 "ClusterBatterieFaible",我想编辑此图标。
我的代码有效,但不符合我的要求:在函数 iconCreateFunction 中,我想计算 "ClusterBatterieFaible" 的标记,但我不知道如何将其作为参数发送。
有什么建议吗?
var ClusterBatterieFaible = L.markerClusterGroup({ });
var cluster = L.markerClusterGroup({
iconCreateFunction: function (cluster) {
var childCount = cluster.getChildCount();
if (childCount > 1){
var c = ' marker-cluster-large';
}
else {
var c = ' marker-cluster-small';
}
return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
}
});
For loop
if batteryOk :
L.marker(latlng, {icon: mainIconE}).bindPopup("blabla");} }).addTo(cluster)
if batteryNotOk :
L.marker(latlng, {icon: mainIconE}).bindPopup("blabla");} }).addTo(ClusterBatterieFaible).addTo(cluster)
Bienvenue sur SO !
避免将您的标记添加到多个 MarkerClusterGroups (MCG)。这将打破他们的集群,因为他们将 "confused" 关于标记属于哪个集群。
相反,您可以简单地使用一个标记数组,或一个 L.LayerGroup,您可以在其中添加您的标记(但不要将其添加到地图中!),用于您要测试的组("batteryNotOk" 如果我的理解是正确的话)。并仅将剩余的 MCG 添加到地图中。
要测试给定的标记是否包含在数组中,只需使用 myArray.indexOf(marker) >= 0
。
要测试给定标记是否已添加到图层组中,只需使用 myLayerGroup.hasLayer(marker)
所以你的 iconCreateFunction
会是这样的:
function (cluster) {
var markers = clusters.getAllChildMarkers(),
iconClass = "allBatteriesOk";
for (var i = 0; i < markers.length; i += 1) {
if (myArray.indexOf(markers[i]) >= 0) {
iconClass = "atLeastOneBatteryNotOk";
break;
}
}
return L.divIcon({
html: '<div><span>' + childCount + '</span></div>',
className: iconClass,
iconSize: new L.Point(40, 40)
});
}
好的,感谢您的回答,使用数组是个好主意!
我不得不对其进行一些自定义,因为我使用 geoJson 来创建我的标记。
我不是 javascript 专家,但我的代码可以正常工作。
这是我的完整代码,供任何需要的人使用。
var lowBatt = [];
var cluster = L.markerClusterGroup({
iconCreateFunction: function (cluster) {
var iconClass = "marker-cluster marker-cluster-small";
var markers = cluster.getAllChildMarkers();
for (var i = 0; i < markers.length; i += 1) {
if (lowBatt.indexOf(markers[i]) >= 0) {
iconClass = "marker-cluster marker-cluster-large";
break;
}
}
return new L.DivIcon({ html: '<div><span>' + cluster.getChildCount() + '</span></div>',
className: iconClass,
iconSize: new L.Point(40, 40) });
}
});
For 循环:
coords = geojsonFeature.geometry.coordinates;
var temp = coords[1];
coords[1]=coords[0];
coords[0]=temp;
var m = L.marker(coords, {icon: lowBattIconE});
L.geoJson(geojsonFeature, {
pointToLayer: function (feature, latlng) {
return m.bindPopup("blabla");}
}).addTo(cluster).addTo(group);
lowBatt.push(m);
我正在使用 Leaflet 和标记集群插件,我想动态修改 child 所在集群的图标。
首先我创建了我的 clusterGroups,然后我添加了一些标记。 我创建了两个组,但我只显示第一个 "cluster",如果他的 children 中的一个也属于组 "ClusterBatterieFaible",我想编辑此图标。
我的代码有效,但不符合我的要求:在函数 iconCreateFunction 中,我想计算 "ClusterBatterieFaible" 的标记,但我不知道如何将其作为参数发送。 有什么建议吗?
var ClusterBatterieFaible = L.markerClusterGroup({ });
var cluster = L.markerClusterGroup({
iconCreateFunction: function (cluster) {
var childCount = cluster.getChildCount();
if (childCount > 1){
var c = ' marker-cluster-large';
}
else {
var c = ' marker-cluster-small';
}
return new L.DivIcon({ html: '<div><span>' + childCount + '</span></div>', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
}
});
For loop
if batteryOk :
L.marker(latlng, {icon: mainIconE}).bindPopup("blabla");} }).addTo(cluster)
if batteryNotOk :
L.marker(latlng, {icon: mainIconE}).bindPopup("blabla");} }).addTo(ClusterBatterieFaible).addTo(cluster)
Bienvenue sur SO !
避免将您的标记添加到多个 MarkerClusterGroups (MCG)。这将打破他们的集群,因为他们将 "confused" 关于标记属于哪个集群。
相反,您可以简单地使用一个标记数组,或一个 L.LayerGroup,您可以在其中添加您的标记(但不要将其添加到地图中!),用于您要测试的组("batteryNotOk" 如果我的理解是正确的话)。并仅将剩余的 MCG 添加到地图中。
要测试给定的标记是否包含在数组中,只需使用 myArray.indexOf(marker) >= 0
。
要测试给定标记是否已添加到图层组中,只需使用 myLayerGroup.hasLayer(marker)
所以你的 iconCreateFunction
会是这样的:
function (cluster) {
var markers = clusters.getAllChildMarkers(),
iconClass = "allBatteriesOk";
for (var i = 0; i < markers.length; i += 1) {
if (myArray.indexOf(markers[i]) >= 0) {
iconClass = "atLeastOneBatteryNotOk";
break;
}
}
return L.divIcon({
html: '<div><span>' + childCount + '</span></div>',
className: iconClass,
iconSize: new L.Point(40, 40)
});
}
好的,感谢您的回答,使用数组是个好主意! 我不得不对其进行一些自定义,因为我使用 geoJson 来创建我的标记。
我不是 javascript 专家,但我的代码可以正常工作。 这是我的完整代码,供任何需要的人使用。
var lowBatt = [];
var cluster = L.markerClusterGroup({
iconCreateFunction: function (cluster) {
var iconClass = "marker-cluster marker-cluster-small";
var markers = cluster.getAllChildMarkers();
for (var i = 0; i < markers.length; i += 1) {
if (lowBatt.indexOf(markers[i]) >= 0) {
iconClass = "marker-cluster marker-cluster-large";
break;
}
}
return new L.DivIcon({ html: '<div><span>' + cluster.getChildCount() + '</span></div>',
className: iconClass,
iconSize: new L.Point(40, 40) });
}
});
For 循环:
coords = geojsonFeature.geometry.coordinates;
var temp = coords[1];
coords[1]=coords[0];
coords[0]=temp;
var m = L.marker(coords, {icon: lowBattIconE});
L.geoJson(geojsonFeature, {
pointToLayer: function (feature, latlng) {
return m.bindPopup("blabla");}
}).addTo(cluster).addTo(group);
lowBatt.push(m);