【问题标题】:how to hide other markers after display direction on google map如何在谷歌地图上显示方向后隐藏其他标记
【发布时间】:2018-06-11 01:44:16
【问题描述】:

此谷歌地图用于获取到由客户坐标指定的位置作为目的地的路线。

为了从选择中的数据中获取它,我将其设为google.maps.LatLng 对象,并将坐标作为字符串保存在值中,然后解析出纬度和经度以创建LatLng 对象。

步骤是:

1-保存选项值中的坐标:

for (var i = 0; i < data.length; i++) {
  displayLocation(data[i]);
  addOption(selectBox, data[i]['CodeClient'], data[i].Latitude + "," + data[i].Longitude);
}

2-解析这些坐标并在路线请求中创建一个google.maps.LatLng 对象:

function calculateRoute() {

  var start = document.getElementById('start').value;
  var destination = document.getElementById('destination').value;
  console.log("selected option value=" + destination);
  var destPt = destination.split(",");
  var destination = new google.maps.LatLng(destPt[0], destPt[1]);
  if (start == '') {
    start = center;
  }
  // ....

以上都可以正常工作

--这是我卡住的地方:--

即使显示到指定标记的方向,问题是所有标记仍在地图中, 对我来说,我尝试让我的函数只显示方向和我选择的代码客户端的标记两件事,而所有其他标记都将隐藏。

这是我在代码中添加的注释,

**1--***一旦我添加了这个函数来将所有标记推送到一个变量中*

    makeRequest('https://gist.githubusercontent.com/abdelhakimsalama/3cce25789f00c1b84ccb5b231ec455b7/raw/393220f08a02b962e3e764d2b497b318353828db/gistfile1.txt', function(data) {

    for (var i = 0; i < data.length; i++) {

      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(data[i].Latitude, data[i].Longitude),
        title: data[i].CodeClient,
        map: map
        });

        gmarkers.push(marker);
    }

  }); 

**2--***我添加了这个函数来隐藏其他标记*

 function toggleMarkers() {
  for (i = 0; i < gmarkers.length; i++) {
    if (gmarkers[i].getMap() != null) gmarkers[i].setMap(null);
    else gmarkers[i].setMap(map);
  }
}

这个问题我已经面临好几天了,似乎无法解决,即使我已经尝试在这里和 Google Maps API 文档中查看各种各样的代码块,但仍然无法弄清楚如何隐藏其他标记。

任何建议、想法和帮助将不胜感激!

这是截图:

------------------------------------------ -------------------------------------------------- ------------------------------------

这是我更新后的代码

根据您的建议,这是我的代码的更新。

效果很好,当我点击按钮(清除标记)后,所有标记都会删除。

现在我想知道如何制作函数 toggleMarkers() ,删除所有标记,但它会将标记保留在我选择的代码客户端中,

var gmarkers = [];

var map;
var directionsService;
var directionsDisplay;
var geocoder;
var infowindow;

						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
function init() {
  directionsService = new google.maps.DirectionsService();
  directionsDisplay = new google.maps.DirectionsRenderer();
  geocoder = new google.maps.Geocoder();
  infowindow = new google.maps.InfoWindow();
  
						/*++++++++++++++++++*/
						
  var mapOptions = {
    zoom: 6,
    center: center = new google.maps.LatLng(32, -6),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }

  						/*++++++++++++++++++*/

  map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

  directionsDisplay.setMap(map);
  directionsDisplay.setPanel(document.getElementById('directions_panel'));

  // Detect user location
  if (navigator.geolocation) {
	  
    navigator.geolocation.getCurrentPosition(function(position) {
      var userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
      geocoder.geocode({
        'latLng': userLocation
      }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          document.getElementById('start').value = results[0].formatted_address
        }
      });

    }, function() {
      alert('Geolocation is supported, but it failed');
    });
  }
  
						/*++++++++++++++++++*/

  makeRequest('https://gist.githubusercontent.com/abdelhakimsalama/3cce25789f00c1b84ccb5b231ec455b7/raw/393220f08a02b962e3e764d2b497b318353828db/gistfile1.txt', function(data) {

    var data = JSON.parse(data.responseText);
    var selectBox = document.getElementById('destination');

    for (var i = 0; i < data.length; i++) {
      displayLocation(data[i]);
      addOption(selectBox, data[i]['CodeClient'], data[i].Latitude + "," + data[i].Longitude);
    }

  }); 
  

}

						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
function toggleMarkers() {
  for (i = 0; i < gmarkers.length; i++) {
    if (gmarkers[i].getMap() != null) gmarkers[i].setMap(null);
    else gmarkers[i].setMap(map);
  }
}	
						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

function addOption(selectBox, text, value) {
  var option = document.createElement("OPTION");
  option.text = text;
  option.value = value;
  selectBox.options.add(option);
}

						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

function calculateRoute() {
  var start = document.getElementById('start').value;
  var destination = document.getElementById('destination').value;
  var hakim = document.getElementById('destination');
  console.log("selected option value=" + destination);
  console.log(" value=" + hakim);
  var destPt = destination.split(",");
  var destination = new google.maps.LatLng(destPt[0], destPt[1]);
  if (start == '') {
    start = center;
  }

  var request = {
    origin: start,
    destination: destination,
    travelMode: google.maps.DirectionsTravelMode.DRIVING
  };
  console.log("origin:" + start);
  console.log("dest:" + destination.toUrlValue(12));
  directionsService.route(request, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      directionsDisplay.setDirections(response);
    }
  });
  alert("???");
  displayLocation(hakim);
}

						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

function makeRequest(url, callback) {
  var request;
  if (window.XMLHttpRequest) {
    request = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari
  } else {
    request = new ActiveXObject("Microsoft.XMLHTTP"); // IE6, IE5
  }
  request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status == 200) {
      callback(request);
    }
  }
  request.open("GET", url, true);
  request.send();
}

						/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


function displayLocation(rythmstu_innotec) {
  var content = '<div class="infoWindow"><strong> Code Client : ' + rythmstu_innotec.CodeClient + '</strong>' +
    '<br />Latitude : ' + rythmstu_innotec.Latitude +
    '<br />Longitude : ' + rythmstu_innotec.Longitude +
    '<br />Route : ' + rythmstu_innotec.Route +
    '<br />Secteur : ' + rythmstu_innotec.Secteur +
    '<br />Agence : ' + rythmstu_innotec.Agence +
    '<br />prenom de Client : ' + rythmstu_innotec.PrenomClient +
    '<br />Num Adresse : ' + rythmstu_innotec.NumAdresse +
    '<br />GeoAdresse : ' + rythmstu_innotec.GeoAdresse +
    '<br />Téléphone : ' + rythmstu_innotec.Tel +
    '<br />Whatsapp : ' + rythmstu_innotec.Whatsapp +
    '<br />Nbr Frigos : ' + rythmstu_innotec.NbrFrigo +
    '<br />Ouverture Matin : ' + rythmstu_innotec.OpenAm +
    '<br />Fermeture Matin : ' + rythmstu_innotec.CloseAm +
    '<br />Ouverture après-midi : ' + rythmstu_innotec.OpenPm +
    '<br />Fermeture Après-midi : ' + rythmstu_innotec.ClosePm + '</div>';

  if (parseInt(rythmstu_innotec.Latitude) == 0) {
    geocoder.geocode({
      'GeoAdresse': rythmstu_innotec.GeoAdresse
    }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({
          map: map,
          position: results[0].geometry.rythmstu_innotec,
          title: rythmstu_innotec.name
        });

        google.maps.event.addListener(marker, 'click', function() {
          infowindow.setContent(content);
          infowindow.open(map, marker);
        });
      }
    });
  } else {
    var position = new google.maps.LatLng(parseFloat(rythmstu_innotec.Latitude), parseFloat(rythmstu_innotec.Longitude));
    var marker = new google.maps.Marker({
      map: map,
      position: position,
      title: rythmstu_innotec.name
    });
	gmarkers.push(marker);

    google.maps.event.addListener(marker, 'click', function() {
      infowindow.setContent(content);
      infowindow.open(map, marker);
    });
  }
}
body {
  font: normal 14px Verdana;
}

h1 {
  font-size: 24px;
}

h2 {
  font-size: 18px;
}

#sidebar {
  float: right;
  width: 30%;
}

#main {
  padding-right: 15px;
}

.infoWindow {
  width: 220px;
}
<title>MAP itinéraire </title>
<meta charset="utf-8">
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>

<body onload="init();">



  <form id="services">
    Location: <input type="text" id="start" value="Midar" /> Destination:
    <select id="destination" onchange="calculateRoute();"></select>
    <input type="button" value="clear map" onclick="toggleMarkers();" />
  </form>

  <section id="sidebar">
    <div id="directions_panel"></div>
  </section>

  <section id="main">
    <div id="map_canvas" style="width: 70%; height: 750px;"></div>
  </section>

</body>

【问题讨论】:

    标签: javascript php google-maps google-maps-api-3 xmlhttprequest


    【解决方案1】:

    您永远不会调用toggleMarkers 函数。

    1. 修改为hideMarkers:
    function hideMarkers() {
      for (i = 0; i < gmarkers.length; i++) {
        gmarkers[i].setMap(null);
      }
    }
    
    1. 然后在路线服务回调函数中调用成功:
    function calculateRoute() {
      var start = document.getElementById('start').value;
      var destination = document.getElementById('destination').value;
      var hakim = document.getElementById('destination');
      var destPt = destination.split(",");
      var destination = new google.maps.LatLng(destPt[0], destPt[1]);
      if (start == '') {
        start = center;
      }
    
      var request = {
        origin: start,
        destination: destination,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
      };
      directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          directionsDisplay.setDirections(response);
          hideMarkers();  // <========================= call it here
        }
      });
      displayLocation(hakim);
    }
    

    代码 sn-p:

    var gmarkers = [];
    
    var map;
    var directionsService;
    var directionsDisplay;
    var geocoder;
    var infowindow;
    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    function init() {
      directionsService = new google.maps.DirectionsService();
      directionsDisplay = new google.maps.DirectionsRenderer();
      geocoder = new google.maps.Geocoder();
      infowindow = new google.maps.InfoWindow();
    
      /*++++++++++++++++++*/
    
      var mapOptions = {
        zoom: 6,
        center: center = new google.maps.LatLng(32, -6),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      }
    
      /*++++++++++++++++++*/
    
      map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
    
      directionsDisplay.setMap(map);
      directionsDisplay.setPanel(document.getElementById('directions_panel'));
    
      // Detect user location
      if (navigator.geolocation) {
    
        navigator.geolocation.getCurrentPosition(function(position) {
          var userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
          geocoder.geocode({
            'latLng': userLocation
          }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
              document.getElementById('start').value = results[0].formatted_address
            }
          });
    
        }, function() {
          alert('Geolocation is supported, but it failed');
        });
      }
    
      /*++++++++++++++++++*/
    
      makeRequest('https://gist.githubusercontent.com/abdelhakimsalama/3cce25789f00c1b84ccb5b231ec455b7/raw/393220f08a02b962e3e764d2b497b318353828db/gistfile1.txt', function(data) {
    
        var data = JSON.parse(data.responseText);
        var selectBox = document.getElementById('destination');
    
        for (var i = 0; i < data.length; i++) {
          displayLocation(data[i]);
          addOption(selectBox, data[i]['CodeClient'], data[i].Latitude + "," + data[i].Longitude);
        }
      });
    }
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    function hideMarkers() {
      console.log("gmarkers.length=" + gmarkers.length);
      for (i = 0; i < gmarkers.length; i++) {
        gmarkers[i].setMap(null);
      }
    }
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    function addOption(selectBox, text, value) {
      var option = document.createElement("OPTION");
      option.text = text;
      option.value = value;
      selectBox.options.add(option);
    }
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    function calculateRoute() {
      var start = document.getElementById('start').value;
      var destination = document.getElementById('destination').value;
      var hakim = document.getElementById('destination');
      console.log("selected option value=" + destination);
      console.log(" value=" + hakim);
      var destPt = destination.split(",");
      var destination = new google.maps.LatLng(destPt[0], destPt[1]);
      if (start == '') {
        start = center;
      }
    
      var request = {
        origin: start,
        destination: destination,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
      };
      console.log("origin:" + start);
      console.log("dest:" + destination.toUrlValue(12));
      directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          directionsDisplay.setDirections(response);
          hideMarkers();
        }
      });
      displayLocation(hakim);
    }
    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    function makeRequest(url, callback) {
      var request;
      if (window.XMLHttpRequest) {
        request = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari
      } else {
        request = new ActiveXObject("Microsoft.XMLHTTP"); // IE6, IE5
      }
      request.onreadystatechange = function() {
        if (request.readyState == 4 && request.status == 200) {
          callback(request);
        }
      }
      request.open("GET", url, true);
      request.send();
    }
    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    
    function displayLocation(rythmstu_innotec) {
      var content = '<div class="infoWindow"><strong> Code Client : ' + rythmstu_innotec.CodeClient + '</strong>' +
        '<br />Latitude : ' + rythmstu_innotec.Latitude +
        '<br />Longitude : ' + rythmstu_innotec.Longitude +
        '<br />Route : ' + rythmstu_innotec.Route +
        '<br />Secteur : ' + rythmstu_innotec.Secteur +
        '<br />Agence : ' + rythmstu_innotec.Agence +
        '<br />prenom de Client : ' + rythmstu_innotec.PrenomClient +
        '<br />Num Adresse : ' + rythmstu_innotec.NumAdresse +
        '<br />GeoAdresse : ' + rythmstu_innotec.GeoAdresse +
        '<br />Téléphone : ' + rythmstu_innotec.Tel +
        '<br />Whatsapp : ' + rythmstu_innotec.Whatsapp +
        '<br />Nbr Frigos : ' + rythmstu_innotec.NbrFrigo +
        '<br />Ouverture Matin : ' + rythmstu_innotec.OpenAm +
        '<br />Fermeture Matin : ' + rythmstu_innotec.CloseAm +
        '<br />Ouverture après-midi : ' + rythmstu_innotec.OpenPm +
        '<br />Fermeture Après-midi : ' + rythmstu_innotec.ClosePm + '</div>';
    
      if (parseInt(rythmstu_innotec.Latitude) == 0) {
        geocoder.geocode({
          'GeoAdresse': rythmstu_innotec.GeoAdresse
        }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            var marker = new google.maps.Marker({
              map: map,
              position: results[0].geometry.rythmstu_innotec,
              title: rythmstu_innotec.name
            });
    
            google.maps.event.addListener(marker, 'click', function() {
              infowindow.setContent(content);
              infowindow.open(map, marker);
            });
          }
        });
      } else {
        var position = new google.maps.LatLng(parseFloat(rythmstu_innotec.Latitude), parseFloat(rythmstu_innotec.Longitude));
        var marker = new google.maps.Marker({
          map: map,
          position: position,
          title: rythmstu_innotec.name
        });
        gmarkers.push(marker);
    
        google.maps.event.addListener(marker, 'click', function() {
          infowindow.setContent(content);
          infowindow.open(map, marker);
        });
      }
    }
    body {
      font: normal 14px Verdana;
    }
    
    h1 {
      font-size: 24px;
    }
    
    h2 {
      font-size: 18px;
    }
    
    #sidebar {
      float: right;
      width: 30%;
    }
    
    #main {
      padding-right: 15px;
    }
    
    .infoWindow {
      width: 220px;
    }
    <title>MAP itinéraire </title>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js"></script>
    
    <body onload="init();">
    
      <form id="services">
        Location: <input type="text" id="start" value="Midar" /> Destination:
        <select id="destination" onchange="calculateRoute();"></select>
        <input type="button" value="clear map" onclick="toggleMarkers();" />
      </form>
    
      <section id="sidebar">
        <div id="directions_panel"></div>
      </section>
    
      <section id="main">
        <div id="map_canvas" style="width: 70%; height: 750px;"></div>
      </section>
    
    </body>

    【讨论】:

      【解决方案2】:

      Directions API 不需要使用 var marker = new google.maps.Marker。它们会自动添加到那里,并且在您请求新路线时也会自动消失。

      这是一个示例应用,它会在下拉菜单更改后呈现路线。您可以看到 Javascript 代码没有任何调用 markerinfowindow 对象的内容,但它们都存在于地图中。 marker 会自动添加到起点和终点。如果你点击这些标记,infowindow 会自动出现!

      function initMap() {
         var directionsService = new google.maps.DirectionsService();
         var chicago = new google.maps.LatLng(41.85, -87.65);
         var directionsDisplay = new google.maps.DirectionsRenderer();
         var map = new google.maps.Map(document.getElementById('distance-map'), {
            zoom: 5.2,
            center: chicago
         });
         directionsDisplay.setMap(map);
      
         var onChangeHandler = function() {
            calculateAndDisplayRoute(directionsService, directionsDisplay);
         };
         document.getElementById('start').addEventListener('change', onChangeHandler);
         document.getElementById('end').addEventListener('change', onChangeHandler);
      }
      
      function calculateAndDisplayRoute(directionsService, directionsDisplay) {
         directionsService.route({
            origin: document.getElementById('start').value,
            destination: document.getElementById('end').value,
            travelMode: 'DRIVING'
         }, function(response, status) {
            if (status === 'OK') {
               directionsDisplay.setDirections(response);
            } else {
               window.alert('Directions request failed due to ' + status);
            }
         });
      }
      #distance-map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #floating-panel {
        position: absolute;
        top: 10px;
        left: 25%;
        z-index: 5;
        background-color: #fff;
        padding: 5px;
        border: 1px solid #999;
        text-align: center;
        font-family: 'Roboto','sans-serif';
        line-height: 30px;
        padding-left: 10px;
      }
      #warnings-panel {
        width: 100%;
        height:10%;
        text-align: center;
      }
      <!DOCTYPE html>
      <html>
         <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width">
            <title>JS Bin</title>
         </head>
         <body>
         <br />
            <div id="distance-panel">
               Start:
               <select id="start">
                  <option value='41.878114,-87.629798'>Chicago</option>
                  <option value='42.331427,-83.045754'>Detroit</option>
                  <option value='39.099727,-94.578567'>Kansas City</option>
                  <option value='41.600545,-93.609106'>Des Molines</option>
               </select>
               End:
               <select id="end">
                  <option value='38.833882,-104.821363'>Colorado Springs</option>
                  <option value='36.162664,-86.781602'>Nashville</option>
                  <option value='39.768403,-86.158068'>Indianapolis</option>
                  <option value='36.162664,-86.781602'>Nashville</option>
               </select>
            </div>
            <br />
            <div id="distance-map"></div>
            <script async defer
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDLHKWYAEE2PDjvt6BaBH1SIs4Q93PMpQs&callback=initMap">
      </script>
         </body>
      </html>

      您也可以查看 jsbin 版本 here.

      希望这回答了你的问题。

      【讨论】:

      • 谢谢您,先生,我明白您向我解释的内容,但在我的情况下,我想让我的函数只显示两件事(如本例的起点和目的地)和标记我选择的代码客户端,所有其他标记都将隐藏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2017-08-09
      相关资源
      最近更新 更多