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가 만들어지고 지워지는지 궁금합니다. 마커를 지울 때 마커 배열을 지우지 않으면 설명 할 수 있습니다. – puckhead

+0

puckhead, 더 많은 코드로 원래 게시물을 업데이트했습니다. 고맙습니다. – arnoldbird

답변

2

내가 MarkerClusterer에 대해 잘 모르지만 어떤 일이 일어나고있는 것으로 보인다 addMarkers 함수를 호출 할 때마다 새 MarkerClusterer를 만들지 만 이전의 포인터는 파괴/제거되지 않으므로 확대/축소 변경시 생성 한 모든 인스턴스가 자신의 마커를 다시 그립니다. MarkerClusterer의 clearMarkers 또는 removerMarkers 메소드를 사용해보고 addMarkers를 호출 할 때마다 새 MarkerClusterer 인스턴스를 만드는 대신 MarkerClusterer 인스턴스 하나를 만들고 재사용하십시오.

+0

나는 당신이 올바른 길에 있다고 생각합니다. MarkerClusterer를 사용하지 않으면 문제가 해결됩니다. 클러스터를 더 잘 관리해야 할 필요가있는 것 같습니다. 실제로 clearMarkers 또는 removeMarkers를 호출하기위한 올바른 구문이 확실하지 않고 해당 함수를 호출하는 방법을 보여주는 코드 샘플을 찾을 수 없었습니다. 오브젝트 (OO) 구문과 프로토 타입 오브젝트의 사용은 조금 벗어날 수 있습니다. 문법을 추측하려는 시도는 어디에도 없습니다. 실제로 구문을 올바르게 구할 수 있지만 메서드가 예상대로 작동하지 않습니다. – arnoldbird

+0

마커 클러스터 변수 markerCluster의 선언을 다른 곳을 생성 한 곳으로 이동하십시오. initmapping에서 MarkerClusterer를 만들고지도 만 전달하십시오. 그런 다음 addMarkers에서 먼저 markerCluster.clearMarkers()를 호출 한 다음 markerCluster.addMarkers (markersArray)를 호출합니다. 어쨌든 당신이 clearOverlays 함수와 deleteOverlays 함수를 제거 할 수 있다고 생각합니다. 어쨌든 똑같은 일을합니다. – puckhead

+0

그게 다야! clearOverlays 및 deleteOverlays 호출이 여전히 필요하지만 그렇지 않은 경우 설명 된 것처럼 작동합니다. – arnoldbird

관련 문제