2016-02-26 84 views
0

當前,當您點擊某個標記時,可點擊的獲取路線鏈接隨標題和地址一起出現。我還希望獲取路線鏈接也出現在側欄上。Google Maps API路線 - 移動路線鏈接至側邊欄

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Google Maps JavaScript API v3 Example: Map Simple</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 
     html, body, #map_canvas { 
     margin: 0; 
     padding: 0; 
     height: 100%; 
     } 
    </style> 

<style type='text/css'> 
.text 
{ 
width:300px; 
height:600px; 
background-color:white; 
overflow:scroll; 
overflow-x: hidden; 
} 
</style> 

<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script> 
<script type="text/javascript">  

// Store Name[0],Address[1],Coordinates[2],Icon[3] 

var locations = [ 
    ["John Doe", "145 Rock Ridge Road, Chester, NY ", "41.314926,-74.270134", "http://maps.google.com/mapfiles/ms/icons/blue.png"], 
    ["Jim Smith", "12 Williams Rd, Montvale, NJ ", "41.041599,-74.019554", "http://maps.google.com/mapfiles/ms/icons/green.png"], 
    ["John Jones", "689 Fern St Township of Washington, NJ ", "40.997704,-74.050598", "http://maps.google.com/mapfiles/ms/icons/yellow.png"], 

]; 
// alert(locations.length); 

var geocoder = null; 
var map = null; 
var customerMarker = null; 
var gmarkers = []; 
var closest = []; 
var directionsDisplay = new google.maps.DirectionsRenderer();; 
var directionsService = new google.maps.DirectionsService(); 
var map; 

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    map = new google.maps.Map(document.getElementById('map'), 
     {  
      zoom: 9,  
      center: new google.maps.LatLng(52.6699927, -0.7274620),  
      mapTypeId: google.maps.MapTypeId.ROADMAP  
     });  
    var infowindow = new google.maps.InfoWindow();  
    var marker, i;  
    var bounds = new google.maps.LatLngBounds(); 
    document.getElementById('info').innerHTML = "found "+locations.length+" locations<br>"; 
    for (i = 0; i < locations.length; i++) {   
      var coordStr = locations[i][2]; 
     var coords = coordStr.split(","); 
     var pt = new google.maps.LatLng(parseFloat(coords[0]),parseFloat(coords[1])); 
      bounds.extend(pt); 
      marker = new google.maps.Marker({   
          position: pt,   
          map: map, 
       icon: locations[i][3], 
          address: locations[i][1], 
          title: locations[i][0], 
          **html: locations[i][0]+"<br>"+locations[i][1]+"<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;"+locations[i][1]+"&quot;);'>Get Directions</a>"** 
          });        
      gmarkers.push(marker); 
      google.maps.event.addListener(marker, 'click', (function(marker, i) {   return function() 
      {   infowindow.setContent(marker.html); 
         infowindow.open(map, marker);   
      }  
     }) 
     (marker, i));  
    } 
    map.fitBounds(bounds); 

} 

     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); 
     if (customerMarker) customerMarker.setMap(null); 
      customerMarker = new google.maps.Marker({ 
       map: map, 
       position: results[0].geometry.location 
      }); 
     closest = findClosestN(results[0].geometry.location,12); 
      // get driving distance 
      closest = closest.splice(0,12); 
      calculateDistances(results[0].geometry.location, closest,12); 
      } else { 
      alert('Geocode was not successful for the following reason: ' + status); 
      } 
     }); 
     } 

function findClosestN(pt,numberOfResults) { 
    var closest = []; 
    document.getElementById('info').innerHTML += "processing "+gmarkers.length+"<br>"; 
    for (var i=0; i<gmarkers.length;i++) { 
    gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt,gmarkers[i].getPosition()); 
    document.getElementById('info').innerHTML += "process "+i+":"+gmarkers[i].getPosition().toUrlValue(6)+":"+gmarkers[i].distance.toFixed(2)+"<br>"; 
    gmarkers[i].setMap(null); 
    closest.push(gmarkers[i]); 
    closest.sort(sortByDist); 
    } 

    return closest; 
} 

function sortByDist(a,b) { 
return (a.distance- b.distance) 

} 

function calculateDistances(pt,closest,numberOfResults) { 
    var service = new google.maps.DistanceMatrixService(); 
    var request = { 
     origins: [pt], 
     destinations: [], 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.IMPERIAL, 
     avoidHighways: false, 
     avoidTolls: false 
    }; 
    for (var i=0; i < closest.length; i++) { 
    request.destinations.push(closest[i].getPosition()); 
    } 
    service.getDistanceMatrix(request, function (response, status) { 
    if (status != google.maps.DistanceMatrixStatus.OK) { 
     alert('Error was: ' + status); 
    } else { 
     var origins = response.originAddresses; 
     var destinations = response.destinationAddresses; 
     var outputDiv = document.getElementById('side_bar'); 
     outputDiv.innerHTML = ''; 

    var results = response.rows[0].elements; 
     // save title and address in record for sorting 
     for (var i = 0; i < closest.length; i++) { 
     results[i].title = closest[i].title; 
     results[i].address = closest[i].address; 
     results[i].idx_closestMark = i; 
     } 
     results.sort(sortByDistDM); 
     for (var i = 0; 
     ((i < numberOfResults) && (i < closest.length)); i++) { 
     closest[i].setMap(map); 

     **outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;"+locations[i][1]+"&quot;);'>Get Directions</a><br><hr>"** 
     } 
    } 
    }); 
} 

function getDirections(origin, destination) { 
    var request = { 
     origin:origin, 
     destination:destination, 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
    }; 
    directionsService.route(request, function(response, status) { 
    if (status == google.maps.DirectionsStatus.OK) { 
     directionsDisplay.setMap(map); 
     directionsDisplay.setDirections(response); 
     directionsDisplay.setPanel(document.getElementById('side_bar')); 
    } 
    }); 
} 

function sortByDistDM(a, b) { 
    return (a.distance.value - b.distance.value) 
} 

google.maps.event.addDomListener(window, 'load', initialize); 
</script> 
    </head> 
    <body> 
    <table border="0"><tr><td> 
    <div id="map" style="height: 600px; width:800px;"></div> 
    </td><td> 
    <div id="side_bar" class = 'text'> </div> 
    </td></tr></table> 

<input id="address" type="text" value="Palo Alto, CA"></input> 
<input type="button" value="Search" onclick="codeAddress();"></input> 
<div id="info"></div> 

    </body> 
</html> 

我試圖從這裏移動:

html: locations[i][0]+"<br>"+locations[i][1]+"<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;"+locations[i][1]+"&quot;);'>Get Directions</a>" 

到這裏:

outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;"+locations[i][1]+"&quot;);'>Get Directions</a><br><hr>" 

我現在能夠有路線鏈接出現在側邊欄,但方向不匹配正確的標題和地址,就像他們在標記上做的一樣。有人知道怎麼修這個東西嗎?

+0

您需要使用地址的「排序」版本,而不是輸入中的版本。您的問題已關閉,因此我現在無法回答,但看起來應該很快就會重新打開。 – geocodezip

+0

[工作小提琴](http://jsfiddle.net/geocodezip/vj0cpv0c/2/) – geocodezip

+0

非常感謝,非常棒! –

回答

0

您需要使用地址的「排序」版本,而不是輸入中的版本。

// save title and address in record for sorting 
for (var i = 0; i < closest.length; i++) { 
    results[i].title = closest[i].title; 
    results[i].address = closest[i].address; 
    results[i].idx_closestMark = i; 
} 
results.sort(sortByDistDM); 
// use the stored values in the output to the sidebar 
for (var i = 0; 
    ((i < numberOfResults) && (i < closest.length)); i++) { 
    closest[i].setMap(map); 
    outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>" 
} 

排序功能:

function sortByDistDM(a, b) { 
    return (a.distance.value - b.distance.value) 
} 

proof of concept fiddle

代碼片段:

var locations = [ 
 
    ["John Doe", "145 Rock Ridge Road, Chester, NY ", "41.314926,-74.270134", "http://maps.google.com/mapfiles/ms/icons/blue.png"], 
 
    ["Jim Smith", "12 Williams Rd, Montvale, NJ ", "41.041599,-74.019554", "http://maps.google.com/mapfiles/ms/icons/green.png"], 
 
    ["John Jones", "689 Fern St Township of Washington, NJ ", "40.997704,-74.050598", "http://maps.google.com/mapfiles/ms/icons/yellow.png"], 
 

 
]; 
 
// alert(locations.length); 
 

 
var geocoder = null; 
 
var map = null; 
 
var customerMarker = null; 
 
var gmarkers = []; 
 
var closest = []; 
 
var directionsDisplay = new google.maps.DirectionsRenderer();; 
 
var directionsService = new google.maps.DirectionsService(); 
 
var map; 
 

 
function initialize() { 
 
    // alert("init"); 
 
    geocoder = new google.maps.Geocoder(); 
 
    map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 9, 
 
    center: new google.maps.LatLng(52.6699927, -0.7274620), 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }); 
 
    var infowindow = new google.maps.InfoWindow(); 
 
    var marker, i; 
 
    var bounds = new google.maps.LatLngBounds(); 
 
    document.getElementById('info').innerHTML = "found " + locations.length + " locations<br>"; 
 
    for (i = 0; i < locations.length; i++) { 
 
    var coordStr = locations[i][2]; 
 
    var coords = coordStr.split(","); 
 
    var pt = new google.maps.LatLng(parseFloat(coords[0]), parseFloat(coords[1])); 
 
    bounds.extend(pt); 
 
    marker = new google.maps.Marker({ 
 
     position: pt, 
 
     map: map, 
 
     icon: locations[i][3], 
 
     address: locations[i][1], 
 
     title: locations[i][0], 
 
     html: locations[i][0] + "<br>" + locations[i][1] + "<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + locations[i][1] + "&quot;);'>Get Directions</a>" 
 
    }); 
 
    gmarkers.push(marker); 
 
    google.maps.event.addListener(marker, 'click', (function(marker, i) { 
 
     return function() { 
 
      infowindow.setContent(marker.html); 
 
      infowindow.open(map, marker); 
 
     } 
 
     }) 
 
     (marker, i)); 
 
    } 
 
    map.fitBounds(bounds); 
 

 
} 
 

 
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); 
 
     if (customerMarker) customerMarker.setMap(null); 
 
     customerMarker = new google.maps.Marker({ 
 
     map: map, 
 
     position: results[0].geometry.location 
 
     }); 
 
     closest = findClosestN(results[0].geometry.location, 12); 
 
     // get driving distance 
 
     closest = closest.splice(0, 12); 
 
     calculateDistances(results[0].geometry.location, closest, 12); 
 
    } else { 
 
     alert('Geocode was not successful for the following reason: ' + status); 
 
    } 
 
    }); 
 
} 
 

 
function findClosestN(pt, numberOfResults) { 
 
    var closest = []; 
 
    document.getElementById('info').innerHTML += "processing " + gmarkers.length + "<br>"; 
 
    for (var i = 0; i < gmarkers.length; i++) { 
 
    gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt, gmarkers[i].getPosition()); 
 
    document.getElementById('info').innerHTML += "process " + i + ":" + gmarkers[i].getPosition().toUrlValue(6) + ":" + gmarkers[i].distance.toFixed(2) + "<br>"; 
 
    gmarkers[i].setMap(null); 
 
    closest.push(gmarkers[i]); 
 
    closest.sort(sortByDist); 
 
    } 
 

 
    return closest; 
 
} 
 

 
function sortByDist(a, b) { 
 
    return (a.distance - b.distance) 
 

 
} 
 

 
function calculateDistances(pt, closest, numberOfResults) { 
 
    var service = new google.maps.DistanceMatrixService(); 
 
    var request = { 
 
    origins: [pt], 
 
    destinations: [], 
 
    travelMode: google.maps.TravelMode.DRIVING, 
 
    unitSystem: google.maps.UnitSystem.IMPERIAL, 
 
    avoidHighways: false, 
 
    avoidTolls: false 
 
    }; 
 
    for (var i = 0; i < closest.length; i++) { 
 
    request.destinations.push(closest[i].getPosition()); 
 
    } 
 
    service.getDistanceMatrix(request, function(response, status) { 
 
    if (status != google.maps.DistanceMatrixStatus.OK) { 
 
     alert('Error was: ' + status); 
 
    } else { 
 
     var origins = response.originAddresses; 
 
     var destinations = response.destinationAddresses; 
 
     var outputDiv = document.getElementById('side_bar'); 
 
     outputDiv.innerHTML = ''; 
 

 
     var results = response.rows[0].elements; 
 
     // save title and address in record for sorting 
 
     for (var i = 0; i < closest.length; i++) { 
 
     results[i].title = closest[i].title; 
 
     results[i].address = closest[i].address; 
 
     results[i].idx_closestMark = i; 
 
     } 
 
     results.sort(sortByDistDM); 
 
     for (var i = 0; 
 
     ((i < numberOfResults) && (i < closest.length)); i++) { 
 
     closest[i].setMap(map); 
 

 
     outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>" 
 

 
     } 
 
    } 
 
    }); 
 
} 
 

 
function getDirections(origin, destination) { 
 
    var request = { 
 
    origin: origin, 
 
    destination: destination, 
 
    travelMode: google.maps.DirectionsTravelMode.DRIVING 
 
    }; 
 
    directionsService.route(request, function(response, status) { 
 
    if (status == google.maps.DirectionsStatus.OK) { 
 
     directionsDisplay.setMap(map); 
 
     directionsDisplay.setDirections(response); 
 
     directionsDisplay.setPanel(document.getElementById('side_bar')); 
 
    } 
 
    }); 
 
} 
 

 
function sortByDistDM(a, b) { 
 
    return (a.distance.value - b.distance.value) 
 
} 
 

 
google.maps.event.addDomListener(window, 'load', initialize);
html, 
 
body, 
 
#map_canvas { 
 
    margin: 0; 
 
    padding: 0; 
 
    height: 100%; 
 
} 
 
table,tr,td { 
 
    height: 100%; 
 
    } 
 

 

 
.text { 
 
    width: 300px; 
 
    height: 500px; 
 
    background-color: white; 
 
    overflow: scroll; 
 
    overflow-x: hidden; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry"></script> 
 
<table border="0"> 
 
    <tr> 
 
    <td> 
 
     <div id="map" style="height: 100%; width:400px;"></div> 
 
    </td> 
 
    <td> 
 
     <div id="side_bar" class='text'> </div> 
 
    </td> 
 
    </tr> 
 
</table> 
 

 
<input id="address" type="text" value="Paramus, NJ" /> 
 
<input type="button" value="Search" onclick="codeAddress();" /> 
 
<div id="info"></div>

相關問題