13

マップ上にクラスター化されるマーカーのセットがあります。別のマーカーのセットが個別に表示されますが、クラスターの上に表示する必要があります。クラスタオプションオブジェクトでzIndexを設定しようとしましたが、2番目のマーカーセットよりも低く設定しましたが、役に立ちませんでした。これについてどうやって行くのか考えていますか?

4

4 に答える 4

5

それは可能ですが、そこにたどり着くまではかなりでこぼこした方法です... Rickが言うように、問題は、MarkerClustererが通常のマーカーとして高いペインにクラスターアイコンを持つ独自のOverlayViewを追加することです。クラスターの上にマーカーを追加する唯一の方法は、クラスターを自分の武器で打ち負かし、独自のOverlayViewを追加して、マーカーアイコンマークアップをさらに高いペインに追加することです(ペインについてはこちらをご覧ください)。私はそれが本当に好きではありませんが、それが私が見つけた唯一の方法です。

これを行うには、google.maps.OverlayView(参照)を実装するカスタムオーバーレイを作成する必要があります。良い例がここにあります(説明付きで、そこから少しコードを使用しました)。

これが大まかな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を記述できることです。悪い点は、Maps 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');

これがあなたのために働くことを願っています。

于 2012-10-05T18:01:46.250 に答える
4

同じ問題が発生しましたが、新しいオーバーレイを処理したくありませんでした。

特定のオーバーレイを作成しなくても、オーバーレイの親コンテナのz-indexを切り替えることができます。

これは、次の関数を使用して実現できます。

_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;
    }
};

それが役に立てば幸い。

于 2013-01-29T10:22:59.330 に答える
2

私の知る限り、これはできません。クラスターは、マーカー画像よりも高いペインにあります。

https://developers.google.com/maps/documentation/javascript/reference#MapPanes

于 2012-04-20T14:57:19.600 に答える
0

CSSで上書きできます。

CSS

.gm-style-pbc + div > div > div:first-child{ z-index: 108 !important; }

SCSS

.gm-style-pbc{
   + div{
     > div{
       >div{
         &:first-child{
            z-index: 108 !important;
         }
       }
     }
   }
}
于 2020-04-12T07:11:14.700 に答える