1

ズームレベルが変更されると、最後のページが読み込まれてからいつでも地図上にあるすべてのマーカーが地図上に表示されます。これは、ズームレベルの変更がコード内のsetZoom()呼び出しによるものか、ズームスライダーの操作によるものかに関係なく当てはまります。ズームレベルを変更すると、すべてのマーカーがGoogleマップに再表示されます

マップコントロールウィジェットには、さまざまなカテゴリに対応するマーカーを追加するボタンがあります。グループのボタンをクリックすると、グループを表すマーカーがマップに表示されます。その後、[個人]ボタンをクリックすると、グループマーカーが消去され、削除され、個々のマーカーがマップに表示されます。その他のカテゴリでも同様です。しかし、ズームレベルを変更すると、ページが最後に更新されてからマップ上にあったマーカーが返されます。

私はMarkerClustererPlusを使用しています。私はこれがMarkerClustererPlusのバグか、Googleのコードか自分のコードかどうかはわかりません。うまくいけば、後者。 addMarkers関数を以下に紹介します。また

function addMarkers(map,flag) { 

    clearOverlays(); 
    deleteOverlays(); 

    if ('event' == flag) { 
    data = himaps_event_data; 
    } else if ('story' == flag) { 
    data = himaps_story_data; 
    } else if ('group' == flag) { 
    data = himaps_group_data; 
    } else { 
    data = himaps_user_data; 
    } 

    for (var k in data) { 
    var item = data[k]; 
    var latLng = new google.maps.LatLng(item.lat, item.lng); 
    var marker = new google.maps.Marker({'position': latLng}); 
    markersArray.push(marker); 
    } 

    var markerCluster = new MarkerClusterer(map, markersArray); 
} 

私が変更した場合、:I以来の両方をクリアして、新しいマーカーを追加する前にマーカーを削除し、私はズーム変更が帰国を誘発する理由以前のマーカーは用事、戻ってくるすることが可能だかわかりませんズームすると、マーカはもうクリアされません。カテゴリを変更するためにボタンをクリックするだけで、地図上に累積していきます。私がズームレベルを変更しないと、間違いなく起こりません。

function clearOverlays() { 
    if (markersArray) { 
    for (var i = 0; i < markersArray.length; i++) { 
     markersArray[i].setMap(null); 
    } 
    } 
} 

function deleteOverlays() { 
    if (markersArray) { 
    for (i in markersArray) { 
     markersArray[i].setMap(null); 
    } 
    markersArray.length = 0; 
    } 
} 

/* map controls */ 
(function($) { 
    Drupal.behaviors.himaps = { 
    attach: function(context, settings) { 
    $('.map-controls button').click(function() { 
     flag = this.id.replace('map-',''); 
     addMarkers(map,flag); 
    }); 
    } 
    } 
})(jQuery); 


/* homepage map */ 
function newMap(clat,clng) { 
    if (!clat) { 
    clat = 37.65; 
    } 
    if (!clng) { 
    clng = -97.43; 
    } 
    var myOptions = { 
    scrollwheel: false, 
    mapTypeControl: false, 
    mapTypeControlOptions: { 
     style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, 
     position: google.maps.ControlPosition.LEFT_CENTER 
    }, 
    panControl: false, 
    panControlOptions: { 
     position: google.maps.ControlPosition.LEFT_CENTER 
    }, 
    zoomControlOptions: { 
     style: google.maps.ZoomControlStyle.LARGE, 
     position: google.maps.ControlPosition.LEFT_CENTER 
    }, 
    draggable: true, 
    center: new google.maps.LatLng(clat, clng), 
    zoom: 4, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    return new google.maps.Map(document.getElementById("map-canvas"), myOptions); 

} 

var map; 
var markersArray = []; 
var geocoder; 
var marker; 
var listener; 

google.maps.event.addDomListener(window, 'load', initmapping); 

function initmapping() { //aka initialize() 
    map = newMap(); 
    addMarkers(map,'group'); 
    geocoder = new google.maps.Geocoder(); 
} 

なく、少なくとも最後に、ここでMarkerClustererPlusライブラリです:要求することで

は、ここでのコードの多くはでhttp://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclustererplus/2.0.9/src/

+0

リンクを提供できますか、少なくともコードを追加できますか?少なくともclearOverlays()関数とdeleteOverlays()関数はありますか?私はmarkersArrayが作成されクリアされているのだろうかと思います。マーカをクリアしたときにmarkersArrayをクリアしないと、それが説明されます。 – puckhead

+0

puckhead、元の投稿をより多くのコードで更新しました。ありがとうございました。 – arnoldbird

答えて

2

私はMarkerClustererについて多くを知らないが、何が起こっているように見えますaddMarkers関数を呼び出すたびに、新しいMarkerClustererを作成していますが、古いものは破壊/削除されないため、作成したすべてのインスタンスはズームインして、マーカーを再描画します。 MarkerClustererのclearMarkersメソッドまたはremoverMarkersメソッドを試し、addMarkersを呼び出すたびに新しいマーカーを作成するのではなく、MarkerClustererのインスタンスを1つ作成して再利用してください。

+0

あなたは正しい道にいると思います。 MarkerClustererを使用しないと、問題は解決しません。私はクラスタをよりよく管理する必要があるようです。私は実際にclearMarkersまたはremoveMarkersを呼び出すための正しい構文が不明で、これらの関数の呼び出し方法を示すコードサンプルを見つけることができませんでした。オブジェクト指向の構文とプロトタイプオブジェクトの使用は私を少し捨てているかもしれません。構文を推測しようとする私の試みは、私をどこにでも連れてこない。私は実際には時々文法を得ているかもしれませんが、メソッドは期待どおりに動作していません。 – arnoldbird

+0

マーカー・クラスタ変数markerClusterの宣言を他のものを作成する場所に移動します。 initmappingでは、MarkerClustererを作成しますが、マップに渡します。次に、addMarkersで、まずmarkerCluster.clearMarkers()を呼び出し、次にmarkerCluster.addMarkers(markersArray)を呼び出します。とにかく、あなたはあなたのclearOverlays関数とdeleteOverlays関数を削除することができます。これは、とにかく同じことをやっています。 – puckhead

+0

それだけです!私はまだclearOverlaysとdeleteOverlaysコールが必要ですが、そうでない場合は説明したように動作します。 – arnoldbird

関連する問題