市内地図には約 1000 個のマーカーがあります。それらは、markercluster でクラスター化されます。マップの下に (フィルターされた) リストがあります。リスト要素をクリックすると、マップが表示され、リスト要素のマーカーが強調表示されます。
質問は、markercluster レイヤーからマーカーを 1 つだけポップアウトするにはどうすればよいですか?
ここで、clearLayers() を使用してすべてのポイントを繰り返し処理し、強調表示されたものを除いてそれらを配列にプッシュします。これが addLayers() のリストになります。強調表示されたアイコンは、マップに直接追加されます。したがって、それはクラスター化されません。
showGroup = function (group, highlightId) {
var marker,
list = [],
points = poiDataBase[group],
highlightClass,
highlightIcon;
clusterGroup.clearLayers();
$('.grouplist > li').remove();
if(highlighted) {
map.removeLayer(highlighted);
}
$.each(points, function(k,v) {
if(v.id != highlightId) {
marker = L.marker([v.coord1, v.coord2], {id: v.id})
.bindPopup(v.popup)
.on('click', function() {
map.setView(L.latLng(v.coord1, v.coord2), map.getZoom(), {animate: true, duration: 0.5});
showGroup (group, v.id);
});
list.push(marker);
highlightClass = '';
} else {
highlightIcon = new L.Icon.Default({iconUrl: 'marker-icon-red.png'});
marker = L.marker([v.coord1, v.coord2], {id: v.id, icon: highlightIcon})
.bindPopup(v.popup)
.on('click', function() {
map.setView(L.latLng(v.coord1, v.coord2), map.getZoom(), {animate: true, duration: 0.5});
showGroup (group, v.id);
});
highlighted = marker.addTo(map);
highlighted.openPopup();
highlightClass = ' highlighted';
}
$('<li>')
.text(v.name)
.data({pinid: v.id, coord1: v.coord1, coord2: v.coord2})
.attr({class: 'listitem-' + v.id + highlightClass})
.on('click', function(){
map.setView(L.latLng($(this).data('coord1'), $(this).data('coord2')), map.getZoom(), {animate: true, duration: 0.5});
showGroup(group, $(this).data('pinid'));
})
.appendTo($('.grouplist'));
});
clusterGroup.addLayers(list);
};
うまくいきますが、反復には余分な時間がかかります。各ハイライト プロセスで 1000 ポイントに触れる以外の方法があることを願っています。