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.

proof of concept fiddle

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

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -