2013-12-10 2 views
0

У меня есть некоторые проблемы с Google maps api v3. Мне удалось создать карту, где отображаются новые маркеры, когда пользователь перетаскивает карту. Однако он не удаляет прошлые маркеры. Я прочитал много учебников и ниток (особенно этот: Google Maps V3: Updating Markers Periodically) без успеха.Карты Google V3: Обновление маркеров

Вот моя главная страница:

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
<title>Développez avec les API Google Maps</title> 
<style type="text/css"> 
html { 
    height: 100%; 
} 
body { 
    height: 100%; 
    margin: 0px; 
    padding: 0px; 
} 
#map_canvas { 
    height: 100%; 
} 
</style> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 

function createXmlHttpRequest() { 
    try { 
     if (typeof ActiveXObject != 'undefined') { 
      return new ActiveXObject('Microsoft.XMLHTTP'); 
     } else if (window["XMLHttpRequest"]) { 
      return new XMLHttpRequest(); 
     } 
    } catch (e) { 
     changeStatus(e); 
    } 
    return null; 
}; 

function downloadUrl(url, callback) { 
    var status = -1; 
    var request = createXmlHttpRequest(); 
    if (!request) { 
     return false; 
    } 

    request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      try { 
       status = request.status; 
      } catch (e) { 
      } 
      if (status == 200) { 
       callback(request.responseText, request.status); 
       request.onreadystatechange = function() {}; 
      } 
     } 
    } 
    request.open('GET', url, true); 
    try { 
     request.send(null); 
    } catch (e) { 
     changeStatus(e); 
    } 
}; 

function xmlParse(str) { 
    if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') { 
    var doc = new ActiveXObject('Microsoft.XMLDOM'); 
    doc.loadXML(str); 
    return doc; 
    } 

    if (typeof DOMParser != 'undefined') { 
    return (new DOMParser()).parseFromString(str, 'text/xml'); 
    } 

    return createElement('div', null); 
} 

var map; 

function initialize() { 
    var latlng = new google.maps.LatLng(46.7, 2.5); 
    var myOptions = { 
    zoom: 6, 
    center: latlng, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); 

    downloadUrl("getPoi2.php", function(data) { 

    var xml = xmlParse(data); 
    var markers = xml.documentElement.getElementsByTagName("marker"); 
    for (var i = 0; i < markers.length; i++) { 
    createMarker(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute('titre')); 
    } 
    }); 

     /* Ici, on ajoute l'écouteur d'événement suite à un glisser/déposer */ 
     google.maps.event.addListener(map, 'dragend', function() { 
     var bds = map.getBounds(); 
     var South_Lat = bds.getSouthWest().lat(); 
     var South_Lng = bds.getSouthWest().lng(); 
     var North_Lat = bds.getNorthEast().lat(); 
     var North_Lng = bds.getNorthEast().lng(); 
      downloadUrl("getPoi.php?maxlat="+North_Lat+"&minlat="+South_Lat+"&minlong="+South_Lng+"&maxlong="+North_Lng, function(data) { 
      var xml = xmlParse(data); 
      var markers = xml.documentElement.getElementsByTagName("marker"); 

      for (var i = 0; i < markers.length; i++) { 
       createMarker(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute('titre')); 
      } 
      }); 
     }); 
} 

function createMarker(lat, lng, titre){ 
    var latlng = new google.maps.LatLng(lat, lng); 
    var marker = new google.maps.Marker({ 
    position: latlng, 
    map: map, 
    title: titre 
    }); 

} 

</script> 
</head> 
<body onload="initialize()"> 
<div id="map_canvas" style="width: 100%; height: 100%;"></div> 

</body> 
</html> 

И мой getPoin.php:

<?php 
$user = "root"; 
$password = ""; 
$host = "localhost"; 
$bdd = "citiesinvaders"; 
mysql_connect($host,$user,$password); 
mysql_select_db($bdd) or die("erreur de connexion à la base 
de données"); 
$sql = "SELECT * FROM location order by city desc limit 1"; 
$res = mysql_query($sql) or die(mysql_error()); 
$dom = new DomDocument('1.0', 'utf-8'); 
$node = $dom->createElement("markers"); 
$parnode = $dom->appendChild($node); 
while ($result = mysql_fetch_array($res)){ 
$node = $dom->createElement("marker"); 
$newnode = $parnode->appendChild($node); 
$newnode->setAttribute("city", $result["city"]); 
$newnode->setAttribute("lat", $result["latitude"]); 
$newnode->setAttribute("lng", $result["longitude"]); 
} 
$xmlfile = $dom->saveXML(); 
echo $xmlfile; 
?> 

Спасибо за вашу помощь!

+0

Чтобы уточнить ... Когда карта перемещена, маркеры помещаются поверх старых маркеров? А.К.А. Они «удваиваются» на перетаскивании карты? – ryan0319

ответ

0

Отслеживать созданные объекты google.maps.Marker, удалять их перед созданием новых.

var map; 
var gmarkers = []; 


/* Ici, on ajoute l'écouteur d'événement suite à un glisser/déposer */ 
google.maps.event.addListener(map, 'dragend', function() { 
    var bds = map.getBounds(); 
    var South_Lat = bds.getSouthWest().lat(); 
    var South_Lng = bds.getSouthWest().lng(); 
    var North_Lat = bds.getNorthEast().lat(); 
    var North_Lng = bds.getNorthEast().lng(); 
    downloadUrl("getPoi.php?maxlat="+North_Lat+"&minlat="+South_Lat+"&minlong="+South_Lng+"&maxlong="+North_Lng, function(data) { 
    var xml = xmlParse(data); 
    var markers = xml.documentElement.getElementsByTagName("marker"); 

    // hide and delete the existing markers 
    for (var i=0; i<gmarkers.length; i++) { 
     gmarkers[i].setMap(null); 
    } 
    gmarkers = []; 

    for (var i = 0; i < markers.length; i++) { 
     createMarker(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute('titre')); 
    } 
    }); 
}); 

function createMarker(lat, lng, titre){ 
    var latlng = new google.maps.LatLng(lat, lng); 
    var marker = new google.maps.Marker({ 
    position: latlng, 
    map: map, 
    title: titre 
    }); 
    // keep a reference to created markers so you can remove them 
    gmarkers.push(marker); 
} 
+0

Это замечательно! Огромное спасибо. – user3087480

0

Это основано на моем понимании вашего вопроса ... Чтобы уточнить ... Когда карта перемещена, маркеры помещаются поверх старых маркеров? А.К.А. Они «удваиваются» на перетаскивании карты?

Создайте массив для хранения маркеров.

var markers = []; 

Затем добавьте маркеры в массив в функции createMarker(). Кроме того, проверьте, не был ли маркер уже создан, и если да, не воссоздавайте.

function createMarker(lat, lng, titre) { 
    for(marker in markers) { 
     var coord = marker.getgetPosition(); 
     if(coord.lat() == lat && coord.lng() == lng) 
      return; 
    } 
    var latlng = new google.maps.LatLng(lat, lng); 
    markers.push(new google.maps.Marker({ 
    position: latlng, 
    map: map, 
    title: titre 
    })); 
} 
+0

Фактически, вы ответили на его часть. Но моя цель состояла бы в том, чтобы удалить каждый маркер, который был создан ранее. Даже те, которые больше не отображаются на экране. Я пытался что-то вроде того, что вы сказали, но на самом деле не получилось. – user3087480

Смежные вопросы