javascript - google maps Autocomplete with building not working for routing -
here small application i'm writing check taxi fare in country. working well, including autocomplete. if type building/mall name, route not showing. if type road name, route showing.
road name example in city : "jalan salemba raya" , "jalan medan merdeka timur"
mall name example : "amaris hotel mangga dua square"
where problem ?
<html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> <title>distance calculator</title> <script type="text/javascript" src="http://maps.google.co.id/maps/api/js?v=3.exp&sensor=true&libraries=places"></script> <script type="text/javascript"> var directiondisplay; var directionsservice = new google.maps.directionsservice(); var map; function initialize() { directionsdisplay = new google.maps.directionsrenderer(); var city = new google.maps.latlng(-6.17503,106.826935); var myoptions = { zoom:17, maptypeid: google.maps.maptypeid.hybrid, center: city } map = new google.maps.map(document.getelementbyid("map_canvas"), myoptions); directionsdisplay.setmap(map); var autocomplete1 = new google.maps.places.autocomplete(document.getelementbyid('start')); var autocomplete2 = new google.maps.places.autocomplete(document.getelementbyid('end')); } function calcroute() { var start = document.getelementbyid("start").value; var end = document.getelementbyid("end").value; var distancedisplay = document.getelementbyid("distance"); var timedisplay = document.getelementbyid("time"); var tarifdisplay = document.getelementbyid("tarif"); var request = { origin:start, destination:end, avoidtolls:true, provideroutealternatives:true, region:'co.id', avoidhighways:true, optimizewaypoints: true, travelmode: google.maps.directionstravelmode.driving }; directionsservice.route(request, function(response, status) { if (status == google.maps.directionsstatus.ok) { directionsdisplay.setdirections(response); jarak = math.round((response.routes[0].legs[0].distance.value / 1000) * 100) /100; distancedisplay.value = jarak + ' km'; timedisplay.value = math.round((response.routes[0].legs[0].duration.value+1020) /60, 2) + ' menit'; tarifdisplay.value = 'rp '+ math.floor( (jarak*3240) + 3500) + ',-'; } }); } google.maps.event.adddomlistener(window, 'load', initialize); </script> </head> <body onload="initialize()"> <div> <p> <label for="start">start: </label> <input type="text" name="start" id="start" placeholder="masukkan alamat"/> <label for="end">end: </label> <input type="text" name="end" id="end" placeholder="masukkan alamat"/> <input type="submit" value="calculate route" onclick="calcroute()" /> </p> <p> <label for="distance">jarak: </label> <input type="text" name="distance" id="distance" readonly /> </p> <p> <label for="time">estimasi waktu: </label> <input type="text" name="time" id="time" readonly /> </p> <p> <label for="tarif">tarif: </label> <input type="text" name="tarif" id="tarif" readonly /> </p> </div> <div id="map_canvas" style="height:100%;width:100%"></div> </body> </html>
since need distance , route, should use coordinates provided autocomplete service. see documentation how access coordinates result when user selects suggestion:
var startcoord, endcoord; google.maps.event.addlistener(autocomplete1, 'place_changed', function() { var place = autocomplete1.getplace(); if (!place.geometry) { // inform user place not found , return. return; } // place coordinate startcoord = place.geometry.location }); google.maps.event.addlistener(autocomplete2, 'place_changed', function() { var place = autocomplete2.getplace(); if (!place.geometry) { // inform user place not found , return. return; } // place coordinate endcoord = place.geometry.location });
then use startcoord , endcoord in directions request.
code snippet:
var directiondisplay; var directionsservice = new google.maps.directionsservice(); var map; var startcoord, endcoord; function initialize() { directionsdisplay = new google.maps.directionsrenderer(); var city = new google.maps.latlng(-6.17503, 106.826935); var myoptions = { zoom: 17, maptypeid: google.maps.maptypeid.hybrid, center: city } map = new google.maps.map(document.getelementbyid("map_canvas"), myoptions); directionsdisplay.setmap(map); var autocomplete1 = new google.maps.places.autocomplete(document.getelementbyid('start')); var autocomplete2 = new google.maps.places.autocomplete(document.getelementbyid('end')); google.maps.event.addlistener(autocomplete1, 'place_changed', function() { var place = autocomplete1.getplace(); if (!place.geometry) { // inform user place not found , return. return; } // place coordinate startcoord = place.geometry.location }); google.maps.event.addlistener(autocomplete2, 'place_changed', function() { var place = autocomplete2.getplace(); if (!place.geometry) { // inform user place not found , return. return; } // place coordinate endcoord = place.geometry.location }); } function calcroute() { var start, end; if (!startcoord) { start = document.getelementbyid("start").value; } else { start = startcoord; } if (!endcoord) { end = document.getelementbyid("end").value; } else { end = endcoord; } var distancedisplay = document.getelementbyid("distance"); var timedisplay = document.getelementbyid("time"); var tarifdisplay = document.getelementbyid("tarif"); var request = { origin: start, destination: end, avoidtolls: true, provideroutealternatives: true, region: 'co.id', avoidhighways: true, optimizewaypoints: true, travelmode: google.maps.directionstravelmode.driving }; directionsservice.route(request, function(response, status) { if (status == google.maps.directionsstatus.ok) { directionsdisplay.setdirections(response); jarak = math.round((response.routes[0].legs[0].distance.value / 1000) * 100) / 100; distancedisplay.value = jarak + ' km'; timedisplay.value = math.round((response.routes[0].legs[0].duration.value + 1020) / 60, 2) + ' menit'; tarifdisplay.value = 'rp ' + math.floor((jarak * 3240) + 3500) + ',-'; } else { alert("directions request failed, status=" + status); } }); } google.maps.event.adddomlistener(window, 'load', initialize);
html, body, #map_canvas { height: 100%; width: 100%; margin: 0px; padding: 0px }
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script> <div> <p> <label for="start">start:</label> <input type="text" name="start" id="start" placeholder="masukkan alamat" value='museum taman prasasti, south petojo, special capital region of jakarta, indonesia' /> <label for="end">end:</label> <input type="text" name="end" id="end" placeholder="masukkan alamat" value='mangga dua square' /> <input type="submit" value="calculate route" onclick="calcroute()" /> </p> <p> <label for="distance">jarak:</label> <input type="text" name="distance" id="distance" readonly /> </p> <p> <label for="time">estimasi waktu:</label> <input type="text" name="time" id="time" readonly /> </p> <p> <label for="tarif">tarif:</label> <input type="text" name="tarif" id="tarif" readonly /> </p> </div> <div id="map_canvas"></div>
Comments
Post a Comment