2012-10-24 13 views
0

我有下一个代码从xml文件中检索一些数据。问题是,当我想刷新标记时,我得到的响应是地图中的重复标记。我怎样才能更新点没有重复的标记?使用setinterval调用函数时重复的标记谷歌地图v3

问候

//<![CDATA[ 
    // this variable will collect the html which will eventually be placed in the  side_bar 
    var side_bar_html = ""; 

    // arrays to hold copies of the markers and html used by the side_bar 
    // because the function closure trick doesnt work there 
    var gmarkers = []; 

// global "map" variable 
    var map = null; 
    var markerclusterer = null; 

// A function to create the marker and set up the event window function 



function createMarker(latlng, imei, html, estado, alias, speed, timestamp) { 
if(estado == 1) 
    image = '/artworks/icons/truck_green3.png'; 
else 
    image = '/artworks/icons/truck_red.png'; 
var textoLabel= "this is the text" 
var contentString = html; 
var marker = new MarkerWithLabel({ 
    position: latlng, 
    icon: image, 
    // map: map, 
    labelContent: textoLabel, 
    labelAnchor: new google.maps.Point(40, 0), 
    labelClass: "labels", // the CSS class for the label 
    labelStyle: {opacity: 0.50}, 
    zIndex: Math.round(latlng.lat()*-100000)<<5 
    }); 


google.maps.event.addListener(marker, 'click', function() { 
    infowindow.setContent(contentString); 
    infowindow.open(map,marker); 
    }); 
// save the info we need to use later for the side_bar 
gmarkers.push(marker); 
// add a line to the side_bar html 
side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length-1) + ')">' + imei + '<\/a><br>'; 
} 

    // This function picks up the click and opens the corresponding info window 
function myclick(i) { 
    google.maps.event.trigger(gmarkers[i], "click"); 
} 



function initialize() { 
    // create the map 
    var myOptions = { 
    zoom: 12, 
    center: new google.maps.LatLng(37.169619,-3.756981), 
    mapTypeControl: true, 
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}, 
    navigationControl: true, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), 
          myOptions); 
} 
    function getMarkers() { 
    google.maps.event.addListener(map, 'click', function() { 
    infowindow.close(); 
    }); 
    // Read the data from example.xml 
    downloadUrl("vehiculos.asp", function(doc) { 
    var xmlDoc = xmlParse(doc); 
    var markers = xmlDoc.documentElement.getElementsByTagName("marker"); 
    for (var i = 0; i < markers.length; i++) { 
     // obtain the attribues of each marker 
     var lat = parseFloat(markers[i].getAttribute("lat")); 
     var lng = parseFloat(markers[i].getAttribute("lng")); 
     var point = new google.maps.LatLng(lat,lng); 
     var imei = markers[i].getAttribute("imei"); 
     var alias = markers[i].getAttribute("alias"); 
     var speed= markers[i].getAttribute("speed"); 
     var timestamp= markers[i].getAttribute("timestamp"); 
     var estado= markers[i].getAttribute("estado"); 
     var conectado= markers[i].getAttribute("conectado"); 
var html="<b>"+alias+"</b><br> a una velocidad de "+speed+" km/h <br/>  ultima posicion a las: "+timestamp; 

     // create the marker 
     var marker = createMarker(point,alias+" "+imei,html,estado, speed, timestamp); 
    } 

    markerCluster = new MarkerClusterer(map, gmarkers); 
    // put the assembled side_bar_html contents into the side_bar div 
    document.getElementById("side_bar").innerHTML = side_bar_html; 
    }); 
} 

var infowindow = new google.maps.InfoWindow(
    { 
    size: new google.maps.Size(150,50) 
}); 

    // Removes the overlays from the map, but keeps them in the array. 
    function clearOverlays() { 
    getMarkers(null); 
    } 

    // Deletes all markers in the array by removing references to them. 
    function deleteOverlays() { 
    clearOverlays(); 
    getMarkers = []; 
    } 
setInterval(clearOverlays, 3000); 
setInterval(deleteOverlays, 4000); 
setInterval(getMarkers, 5000);  

回答

0

给你标记的唯一ID(也许您现有的属性之一是已经是唯一的)。如果唯一标识已存在,请将该标记移动到新位置(或者不要再添加它),如果不存在,则创建一个新标记。

如果它们不移动,也可以通过检查新标记与所有现有标记之间的距离(如果它小于“相同标记”阈值(例如〜0.1米),避免重复再次添加它。

有一个问题,您提供clearOverlays方法(getMarkers(空)只是调用getMarkers):

// Removes the overlays from the map, but keeps them in the array. 
function clearOverlays() { 
    for (var i=0; i<gmarkers.length; i++) 
    { 
    gmarkers[i].setMap(null); 
    } 
} 
+0

我该怎么办?对不起,但我有点新。关于setInterval我输入那样,因为我想看看他们是否正常工作。我会每隔五秒清除它们,同时。 –

+0

要回答您需要提供更多详细信息,请执行以下操作:1.您的标记是否已具有唯一的ID?他们移动吗?来自“简明英汉词典”请从你的发布代码中删除任何无关的东西,它会让事情变得混乱 – geocodezip

+0

所有标记都有自己的编号(imei编号)。他们之所以移动,是因为卡车一直在移动。 –