У меня есть набор маркеров, которые группируются на моей карте. Другой набор маркеров отображается индивидуально, и мне, возможно, нужно, чтобы они отображались над кластерами. Я попытался установить zIndex в объекте опций кластеров, ниже, чем у 2-го набора маркеров, но безрезультатно. Любая идея, как это сделать?
Карты Google: маркер Render выше markerclusterer
Ответ 1
Насколько я знаю, это невозможно. Кластеры находятся в более высокой области, чем изображение маркера.
https://developers.google.com/maps/documentation/javascript/reference#MapPanes
Ответ 2
У меня была такая же проблема, но я не хотел обрабатывать новый оверлей.
Без создания определенного Overlay вы можете просто переключить z-indexes родительских контейнеров наложения.
Это может быть достигнуто с помощью следующей функции:
_changeOverlayOrder = function(map) {
var panes = map.getPanes();
var markerOverlayDiv = panes.overlayImage.parentNode;
var clusterOverlayDiv = panes.overlayMouseTarget.parentNode;
// Make the clusters clickable.
if(!markerOverlayDiv.style.pointerEvents) {
markerOverlayDiv.style.cssText += ";pointer-events: none;";
}
// Switch z-indexes
if(markerOverlayDiv.style.zIndex < clusterOverlayDiv.style.zIndex) {
var tmp = markerOverlayDiv.style.zIndex;
markerOverlayDiv.style.zIndex = clusterOverlayDiv.style.zIndex;
clusterOverlayDiv.style.zIndex = tmp;
}
};
Надеюсь, что это поможет.
Ответ 3
Это можно сделать, но это довольно ухабистый путь, пока вы не доберетесь туда... Как говорит Рик, проблема в том, что MarkerClusterer добавляет собственный OverlayView с его иконками кластера на более высоком уровне в качестве обычных маркеров. Единственный способ добавить маркер над кластерами - побить кластер с собственным оружием и добавить собственный OverlayView и добавить разметку значка маркера на еще более высокую панель (читайте о панелях здесь). Мне это не очень нравится, но это единственный способ, которым я нашел.
Для этого вам нужно создать пользовательский оверлей, реализующий google.maps.OverlayView(reference), хороший пример можно найти здесь (с пояснениями я использовал немного кода из него).
Вот пример прототипа CustomOverlay:
// build custom overlay class which implements google.maps.OverlayView
function CustomOverlay(map, latlon, icon, title) {
this.latlon_ = latlon;
this.icon_ = icon;
this.title_ = title;
this.markerLayer = jQuery('<div />').addClass('overlay');
this.setMap(map);
};
CustomOverlay.prototype = new google.maps.OverlayView;
CustomOverlay.prototype.onAdd = function() {
var $pane = jQuery(this.getPanes().floatPane); // Pane 6, one higher than the marker clusterer
$pane.append(this.markerLayer);
};
CustomOverlay.prototype.onRemove = function(){
this.markerLayer.remove();
};
CustomOverlay.prototype.draw = function() {
var projection = this.getProjection();
var fragment = document.createDocumentFragment();
this.markerLayer.empty(); // Empty any previous rendered markers
var location = projection.fromLatLngToDivPixel(this.latlon_);
var $point = jQuery('<div class="map-point" title="'+this.title_+'" style="'
+'width:32px; height:32px; '
+'left:'+location.x+'px; top:'+location.y+'px; '
+'position:absolute; cursor:pointer; '
+'">'
+'<img src="'+this.icon_+'" style="position: absolute; top: -16px; left: -16px" />'
+'</div>');
fragment.appendChild($point.get(0));
this.markerLayer.append(fragment);
};
Этот оверлей получает карту, объект LatLng и URL-адрес значка. Хорошо, что вы можете написать свой собственный HTML-код для слоя, плохо то, что вы должны обрабатывать все, что API Карт делает для вас (например, обработчик привязки изображения маркера) самостоятельно. Пример работает только с изображениями 32x32px, где якорь находится посередине изображения, поэтому он все еще довольно грубый.
Чтобы использовать CustomOverlay, просто создайте его следующим образом:
// your map center / marker LatLng
var myLatlng = new google.maps.LatLng(24.247471, 89.920990);
// instantiate map
var map = new google.maps.Map(
document.getElementById("map-canvas"),
{zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP}
);
// create the clusterer, but of course with markers
//var markerClusterer = new MarkerClusterer(map, []);
// add custom overlay to map
var customCustomOverlay = new CustomOverlay(map, myLatlng, 'http://www.foo.bar/icon.png');
Я надеюсь, что это сработает для вас.