2015-12-21 76 views
-1

我正在開發一個Web項目,該項目提供從設置地址(在jscode中設置座標)到用戶使用文本搜索框設置的地址(在另一個div)。我已設法設置搜索框將地址提供給地圖上的標記,但我無法獲取從「家」到標記的指示。Google Maps JavaScript API,用於在地圖上顯示路線的搜索框

你能幫助新手嗎? 謝謝:)

var geocoder; 
 
var map; 
 
function initMap() { 
 
\t var directionsService = new google.maps.DirectionsService; 
 
    \t var directionsDisplay = new google.maps.DirectionsRenderer; 
 
\t directionsDisplay.setMap(map); 
 

 
    geocoder = new google.maps.Geocoder(); 
 
    var latlng = new google.maps.LatLng(60.124639, 19.948736); 
 
    var mapOptions = { 
 
    zoom: 14, 
 
    center: latlng 
 
    } 
 
    map = new google.maps.Map(document.getElementById('map'), mapOptions); 
 
    var input = /** @type {HTMLInputElement} */(
 
     document.getElementById('address')); 
 

 
    var types = document.getElementById('type-selector'); 
 

 
    map.controls[google.maps.ControlPosition.TOP_LEFT].push(types); 
 

 
    var autocomplete = new google.maps.places.Autocomplete(input); 
 
    autocomplete.bindTo('bounds', map); 
 

 
    var infowindow = new google.maps.InfoWindow(); 
 
    var marker = new google.maps.Marker({ 
 
    map: map 
 
    }); 
 

 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 
 
    
 

 
    infowindow.close(); 
 
    marker.setVisible(false); 
 
    var place = autocomplete.getPlace(); 
 
    if (!place.geometry) { 
 
     return; 
 
    } 
 

 
    // If the place has a geometry, then present it on a map. 
 
    if (place.geometry.viewport) { 
 
     map.fitBounds(place.geometry.viewport); 
 
    } else { 
 
     map.setCenter(place.geometry.location); 
 
     map.setZoom(15); 
 
    } 
 
    marker.setIcon(/** @type {google.maps.Icon} */({ 
 
     url: place.icon, 
 
     size: new google.maps.Size(71, 71), 
 
     origin: new google.maps.Point(0, 0), 
 
     anchor: new google.maps.Point(17, 34), 
 
     scaledSize: new google.maps.Size(35, 35) 
 
    })); 
 
    marker.setPosition(place.geometry.location); 
 
    marker.setVisible(true); 
 

 
    var address = ''; 
 
    if (place.address_components) { 
 
     address = [ 
 
     (place.address_components[0] && place.address_components[0].short_name || ''), 
 
     (place.address_components[1] && place.address_components[1].short_name || ''), 
 
     (place.address_components[2] && place.address_components[2].short_name || '') 
 
     ].join(' '); 
 
    } 
 

 
    infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address); 
 
    infowindow.open(map, marker); 
 
    }); 
 

 
    // Sets a listener on a radio button to change the filter type on Places 
 
    // Autocomplete. 
 
    function setupClickListener(id, types) { 
 
    var radioButton = document.getElementById(id); 
 
    google.maps.event.addDomListener(radioButton, 'click', function() { 
 
     autocomplete.setTypes(types); 
 
    }); 
 
    } 
 

 
    setupClickListener('changetype-all', []); 
 
    setupClickListener('changetype-establishment', ['establishment']); 
 
    setupClickListener('changetype-geocode', ['geocode']); 
 
} 
 

 
function codeAddress() { 
 

 
    var address = document.getElementById('address').value; 
 
    geocoder.geocode({ 'address': address}, function(results, status) { 
 
    if (status == google.maps.GeocoderStatus.OK) { 
 
     map.setCenter(results[0].geometry.location); 
 
     map.setZoom(10); 
 
     calculateAndDisplayRoute(directionsService, directionsDisplay); 
 
     
 
    } else { 
 
     alert('Geocode was not successful for the following reason: ' + status); 
 
    } 
 
    }); 
 
} 
 

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

 
    //<![CDATA[ 
 
var pinColor1 = "FE7569"; 
 
var pinColor2 = "0000FF"; 
 
    
 

 
    function load() { 
 
      var infoWindow = new google.maps.InfoWindow; 
 

 
     // Change this depending on the name of your PHP file 
 
     downloadUrl("phpsqlajax_genxml.php", function(data) { 
 
     var xml = data.responseXML; 
 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
 
     for (var i = 0; i < markers.length; i++) { 
 
      var name = markers[i].getAttribute("name"); 
 
      var address = markers[i].getAttribute("address"); 
 
      var type = markers[i].getAttribute("type"); 
 
      var point = new google.maps.LatLng(
 
       parseFloat(markers[i].getAttribute("lat")), 
 
       parseFloat(markers[i].getAttribute("lng"))); 
 
      var html = "<b>" + name + "</b> <br/>" + address; 
 
      var icon = customIcons[type] || {}; 
 
      var marker = new google.maps.Marker({ 
 
      map: map, 
 
      position: point, 
 
      icon: icon 
 
      }); 
 
      bindInfoWindow(marker, map, infoWindow, html); 
 
     } 
 
     }); 
 
    } 
 
function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
    directionsService.route({ 
 
    origin: latlng, 
 
    destination: geocoder.geocode, 
 
    travelMode: google.maps.TravelMode.DRIVING 
 
    }, function(response, status) { 
 
    if (status === google.maps.DirectionsStatus.OK) { 
 
     directionsDisplay.setDirections(response); 
 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
} 
 

 

 
map.mapTypes.set('map_style', custom_style); 
 
    map.setMapTypeId('map_style'); 
 

 
    function bindInfoWindow(marker, map, infoWindow, html) { 
 
     google.maps.event.addListener(marker, 'click', function() { 
 
     infoWindow.setContent(html); 
 
     infoWindow.open(map, marker); 
 
     }); 
 
    } 
 

 
    function downloadUrl(url, callback) { 
 
     var request = window.ActiveXObject ? 
 
      new ActiveXObject('Microsoft.XMLHTTP') : 
 
      new XMLHttpRequest; 
 

 
     request.onreadystatechange = function() { 
 
     if (request.readyState == 4) { 
 
      request.onreadystatechange = doNothing; 
 
      callback(request, request.status); 
 
     } 
 
     }; 
 

 
     request.open('GET', url, true); 
 
     request.send(null); 
 
    } 
 

 
    function doNothing() {} 
 

 
    //]]> 
 
google.maps.event.addDomListener(window, 'load', load);
html, body, .mapcontainer, #map { 
 
    width: 100%; 
 
    height: 100%; 
 
    }
<div> 
 
     <input type="text" class="input-field" placeholder="SÖK ADRESS" id="address" onchange="calcRoute();"/> 
 
</div> 
 
<div class="mapcontainer col s12 m6 l6"> 
 
    <div class="col s6" id="map"></div> 
 
</div> 
 
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&callback=initMap" async defer></script>

回答

0

你可以只嘗試這種在這裏,搜索框是谷歌地圖的自動搜索框,它會顯示給點之間的方向。

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <title> Directions</title> 
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places"></script> 
<script type="text/javascript"> 
    var source, destination; 
    var directionsDisplay; 
    var directionsService = new google.maps.DirectionsService(); 
    google.maps.event.addDomListener(window, 'load', function() { 
     debugger; 
     new google.maps.places.SearchBox(document.getElementById('txtSource')); 
     new google.maps.places.SearchBox(document.getElementById('txtDestination')); 
     directionsDisplay = new google.maps.DirectionsRenderer({ 'draggable': true }); 
    }); 

    function GetRoute() { 
     var mumbai = new google.maps.LatLng(18.9750, 72.8258); 
     var mapOptions = { 
      zoom: 7, 
      center: mumbai, 
      durationInTraffic: true 
     }; 
     map = new google.maps.Map(document.getElementById('dvMap'), mapOptions); 
     directionsDisplay.setMap(map); 
     directionsDisplay.setPanel(document.getElementById('dvPanel')); 

     //*********DIRECTIONS AND ROUTE**********************// 
     source = document.getElementById("txtSource").value; 
     destination = document.getElementById("txtDestination").value; 

     var request = { 
      origin: source, 
      destination: destination, 
      travelMode: google.maps.TravelMode.DRIVING 
     }; 
     directionsService.route(request, function (response, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       directionsDisplay.setDirections(response); 
      } 
     }); 

     //*********DISTANCE AND DURATION**********************// 
     var service = new google.maps.DistanceMatrixService(); 
     service.getDistanceMatrix({ 
      origins: [source], 
      destinations: [destination], 
      travelMode: google.maps.TravelMode.DRIVING, 
      unitSystem: google.maps.UnitSystem.METRIC, 
      avoidHighways: false, 
      avoidTolls: false 
     }, function (response, status) { 
      debugger; 
      if (status == google.maps.DistanceMatrixStatus.OK && response.rows[0].elements[0].status != "ZERO_RESULTS") { 
       var distance = response.rows[0].elements[0].distance.text; 
       var duration = response.rows[0].elements[0].duration.text; 
       var dvDistance = document.getElementById("dvDistance"); 
       dvDistance.innerHTML = ""; 
       dvDistance.innerHTML += "Distance: " + distance + "<br />"; 
       dvDistance.innerHTML += "Duration:" + duration; 

      } else { 
       alert("Unable to find the distance via road."); 
      } 
     }); 
    } 
</script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <table border="0" cellpadding="0" cellspacing="3"> 
<tr> 
    <td colspan="2"> 
     Source: 
     <input type="text" id="txtSource" value="Bandra, Mumbai, India" style="width: 200px" /> 
     &nbsp; Destination: 
     <input type="text" id="txtDestination" value="Andheri, Mumbai, India" style="width: 200px" /> 
     <br /> 
     <input type="button" value="Get Route" onclick="GetRoute()" /> 
     <hr /> 
    </td> 
</tr> 
<tr> 
    <td colspan="2"> 
     <div id="dvDistance"> 
     </div> 
    </td> 
</tr> 
<tr> 
    <td> 
     <div id="dvMap" style="width: 500px; height: 500px"> 
     </div> 
    </td> 
    <td> 
     <div id="dvPanel" style="width: 500px; height: 500px"> 
     </div> 
    </td> 
</tr> 
</table> 
    </div> 
    </form> 
</body> 
</html>