2017-07-27 3 views
0

Ich habe eine Google Map in meinem MVC 5-Projekt mit Herkunftsort und Zielort. Ich brauche den Ursprungsort, der zu einer gesetzten Adresse geändert werden sollte und ändere nie, anstatt die Adresse jedes Mal einzugeben, wenn ich es verwenden muss.Ändern des Ursprungsstandorts zum aktuellen Standort

Seine zwei Textfelder mit Herkunftsort und Zielort. Der Ursprungsort soll nur auf eine physikalische Adresse gesetzt werden.

folgende ist mein Code:

<!DOCTYPE html> 
 
<html> 
 
<head > 
 
    <title>Place Autocomplete</title> 
 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
 
    <meta charset="utf-8"> 
 
    <style> 
 
     /* Always set the map height explicitly to define the size of the div 
 
     * element that contains the map. */ 
 
     #map { 
 
     height: 10%; 
 
     width:100%; 
 
     padding-top: 800px; 
 
     } 
 
     /* Optional: Makes the sample page fill the window. */ 
 
     html, body { 
 
     height: 10%; 
 
     width:100%; 
 
     
 
    
 
     } 
 
     .controls { 
 
      
 
     margin-top: 10px; 
 
     border: 1px solid transparent; 
 
     border-radius: 2px 0 0 2px; 
 
     box-sizing: border-box; 
 
     -moz-box-sizing: border-box; 
 
     height: 32px; 
 
     outline: none; 
 
     box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); 
 
     } 
 

 
     #origin-input, 
 
     #destination-input { 
 
     
 
     background-color: #fff; 
 
     font-family: Roboto; 
 
     font-size: 15px; 
 
     font-weight: 300; 
 
     margin-left: 12px; 
 
     padding: 0 11px 0 13px; 
 
     text-overflow: ellipsis; 
 
     width: 200px; 
 
     } 
 

 
     #origin-input:focus, 
 
     #destination-input:focus { 
 
     border-color: #4d90fe; 
 
     } 
 

 
     #mode-selector { 
 
     color: #fff; 
 
     background-color: #4d90fe; 
 
     margin-left: 12px; 
 
     padding: 5px 11px 0px 11px; 
 
     } 
 

 
     #mode-selector label { 
 
     font-family: Roboto; 
 
     font-size: 13px; 
 
     font-weight: 300; 
 
     } 
 

 
    </style> 
 

 
</head> 
 
<body> 
 
    <input id="origin-input" class="controls" type="text" 
 
      value ="8 Parsia Lane, Tongaat, South Africa" > 
 

 
    <input id="destination-input" class="controls" type="text" 
 
      placeholder="Enter a destination location"> 
 

 
    <div id="mode-selector" class="controls"> 
 
     <input type="radio" name="type" id="changemode-walking" checked="checked"> 
 
     <label for="changemode-walking">Walking</label> 
 

 
     <input type="radio" name="type" id="changemode-transit"> 
 
     <label for="changemode-transit">Transit</label> 
 

 
     <input type="radio" name="type" id="changemode-driving"> 
 
     <label for="changemode-driving">Driving</label> 
 
    </div> 
 

 
    <div id="map"></div> 
 

 
    <script> 
 
     // This example requires the Places library. Include the libraries=places 
 
     // parameter when you first load the API. For example: 
 
     
 

 
     function initMap() { 
 
     var map = new google.maps.Map(document.getElementById('map'), { 
 
      mapTypeControl: false, 
 
      center: {lat: -33.8688, lng: 151.2195}, 
 
      zoom: 13 
 
     }); 
 

 
     new AutocompleteDirectionsHandler(map); 
 
     } 
 

 
    // 
 
      
 
     
 
     function AutocompleteDirectionsHandler(map) { 
 
     this.map = map; 
 
     this.originPlaceId = null; 
 
     this.destinationPlaceId = null; 
 
     this.travelMode = 'WALKING'; 
 
     var originInput = document.getElementById('origin-input'); 
 
     var destinationInput = document.getElementById('destination-input'); 
 
     var modeSelector = document.getElementById('mode-selector'); 
 
     this.directionsService = new google.maps.DirectionsService; 
 
     this.directionsDisplay = new google.maps.DirectionsRenderer; 
 
     this.directionsDisplay.setMap(map); 
 

 
     var originAutocomplete = new google.maps.places.Autocomplete(
 
      originInput, {placeIdOnly: true}); 
 
     var destinationAutocomplete = new google.maps.places.Autocomplete(
 
      destinationInput, {placeIdOnly: true}); 
 

 
     this.setupClickListener('changemode-walking', 'WALKING'); 
 
     this.setupClickListener('changemode-transit', 'TRANSIT'); 
 
     this.setupClickListener('changemode-driving', 'DRIVING'); 
 

 
     this.setupPlaceChangedListener(originAutocomplete, 'ORIG'); 
 
     this.setupPlaceChangedListener(destinationAutocomplete, 'DEST'); 
 

 
     this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(originInput); 
 
     this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(destinationInput); 
 
     this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(modeSelector); 
 
     } 
 

 
     // Sets a listener on a radio button to change the filter type on Places 
 
     // Autocomplete. 
 
     AutocompleteDirectionsHandler.prototype.setupClickListener = function(id, mode) { 
 
     var radioButton = document.getElementById(id); 
 
     var me = this; 
 
     radioButton.addEventListener('click', function() { 
 
      me.travelMode = mode; 
 
      me.route(); 
 
     }); 
 
     }; 
 

 
     AutocompleteDirectionsHandler.prototype.setupPlaceChangedListener = function(autocomplete, mode) { 
 
     var me = this; 
 
     autocomplete.bindTo('bounds', this.map); 
 
     autocomplete.addListener('place_changed', function() { 
 
      var place = autocomplete.getPlace(); 
 
      if (!place.place_id) { 
 
      window.alert("Please select an option from the dropdown list."); 
 
      return; 
 
      } 
 
      if (mode === 'ORIG') { 
 
      me.originPlaceId = place.place_id; 
 
      } else { 
 
      me.destinationPlaceId = place.place_id; 
 
      } 
 
      me.route(); 
 
     }); 
 

 
     }; 
 

 
     AutocompleteDirectionsHandler.prototype.route = function() { 
 
     if (!this.originPlaceId || !this.destinationPlaceId) { 
 
      return; 
 
     } 
 
     var me = this; 
 

 
     this.directionsService.route({ 
 
      origin: {'placeId': this.originPlaceId}, 
 
      destination: {'placeId': this.destinationPlaceId}, 
 
      travelMode: this.travelMode 
 
     }, function(response, status) { 
 
      if (status === 'OK') { 
 
      me.directionsDisplay.setDirections(response); 
 
      } else { 
 
      window.alert('Directions request failed due to ' + status); 
 
      } 
 
     }); 
 
     }; 
 

 
    </script> 
 
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAcXA5KHYBhOQPuV3ygleDCPu8w2BHq4OY&libraries=places&callback=initMap" 
 
      async defer></script> 
 
</body> 
 
</html>

+0

Sie nicht haben den Ursprung auf ein Adresse? 'Wert =" 8 Parsia Lane, Tongaat, Südafrika "' –

+0

Ich tue aber es wählt nur diesen Wert, wenn ich auf die Autovervollständigung klicke –

Antwort

0

Aktualisieren Sie Ihren Code wie hier:

<!DOCTYPE html> 
<html> 
<head > 
<title>Place Autocomplete</title> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
<meta charset="utf-8"> 
<style> 
    /* Always set the map height explicitly to define the size of the div 
    * element that contains the map. */ 
    #map { 
    height: 80%; 
    } 
    /* Optional: Makes the sample page fill the window. */ 
    html, body { 
    height: 100%; 
    margin: 0; 
    padding: 0; 
    } 
    /* #map { 
    height: 100%; 
    width:100%; 
    padding-top: 800px; 
    } 

    html, body { 
    height: 10%; 
    width:100%; 
    top: 0; 
    bottom: 0; 
    } */ 
    .controls {   
    margin-top: 10px; 
    border: 1px solid transparent; 
    border-radius: 2px 0 0 2px; 
    box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    height: 32px; 
    outline: none; 
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); 
    } 

    #origin-input, 
    #destination-input { 

    background-color: #fff; 
    font-family: Roboto; 
    font-size: 15px; 
    font-weight: 300; 
    margin-left: 12px; 
    padding: 0 11px 0 13px; 
    text-overflow: ellipsis; 
    width: 200px; 
    } 

    #origin-input:focus, 
    #destination-input:focus { 
    border-color: #4d90fe; 
    } 

    #mode-selector { 
    color: #fff; 
    background-color: #4d90fe; 
    margin-left: 12px; 
    padding: 5px 11px 0px 11px; 
    } 

    #mode-selector label { 
    font-family: Roboto; 
    font-size: 13px; 
    font-weight: 300; 
    } 

</style> 

</head> 
<body> 
<header> 
    <h2>This is my header</h2> 
</header> 
<input id="origin-input" class="controls" type="text" 
     value ="Sydney, Australia" > 

<input id="destination-input" class="controls" type="text" 
     placeholder="Enter a destination location"> 

<div id="mode-selector" class="controls"> 
    <input type="radio" name="type" id="changemode-walking" checked="checked"> 
    <label for="changemode-walking">Walking</label> 

    <input type="radio" name="type" id="changemode-transit"> 
    <label for="changemode-transit">Transit</label> 

    <input type="radio" name="type" id="changemode-driving"> 
    <label for="changemode-driving">Driving</label> 
</div> 

<div id="map"></div> 

<script> 
    // This example requires the Places library. Include the libraries=places 
    // parameter when you first load the API. For example: 


    function initMap() { 
    var map = new google.maps.Map(document.getElementById('map'), { 
     mapTypeControl: false, 
     center: {lat: -33.8688, lng: 151.2195}, 
     zoom: 13 
    }); 

    new AutocompleteDirectionsHandler(map); 
    } 

// 


    function AutocompleteDirectionsHandler(map) { 
    this.map = map; 
    this.originPlaceId = null; 
    this.destinationPlaceId = null; 
    this.travelMode = 'WALKING'; 
    var originInput = document.getElementById('origin-input'); 
    var destinationInput = document.getElementById('destination-input'); 
    var modeSelector = document.getElementById('mode-selector'); 
    this.directionsService = new google.maps.DirectionsService; 
    this.directionsDisplay = new google.maps.DirectionsRenderer; 
    this.directionsDisplay.setMap(map); 

    // var originAutocomplete = new google.maps.places.Autocomplete(
    //  originInput, {placeIdOnly: true}); 
    var destinationAutocomplete = new google.maps.places.Autocomplete(
     destinationInput, {placeIdOnly: true}); 

    this.setupClickListener('changemode-walking', 'WALKING'); 
    this.setupClickListener('changemode-transit', 'TRANSIT'); 
    this.setupClickListener('changemode-driving', 'DRIVING'); 

    // this.setupPlaceChangedListener(originAutocomplete, 'ORIG'); 
    this.setupPlaceChangedListener(destinationAutocomplete, 'DEST'); 

    this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(originInput); 
    this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(destinationInput); 
    this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(modeSelector); 
    } 

    // Sets a listener on a radio button to change the filter type on Places 
    // Autocomplete. 
    AutocompleteDirectionsHandler.prototype.setupClickListener = function(id, mode) { 
    var radioButton = document.getElementById(id); 
    var me = this; 
    radioButton.addEventListener('click', function() { 
     me.travelMode = mode; 
     me.route(); 
    }); 
    }; 

    AutocompleteDirectionsHandler.prototype.setupPlaceChangedListener = function(autocomplete, mode) { 
    var me = this; 
    autocomplete.bindTo('bounds', this.map); 
    autocomplete.addListener('place_changed', function() { 
     var place = autocomplete.getPlace(); 
     if (!place.place_id) { 
     window.alert("Please select an option from the dropdown list."); 
     return; 
     } 
     if (mode === 'ORIG') { 
     me.originPlaceId = place.place_id; 
     } else { 
     me.destinationPlaceId = place.place_id; 
     } 
     me.route(); 
    }); 

    }; 

    AutocompleteDirectionsHandler.prototype.route = function() { 
    //if (!this.originPlaceId || !this.destinationPlaceId) { 
    if (!this.destinationPlaceId) { 
     return; 
    } 
    var me = this; 

    this.directionsService.route({ 
     origin: document.getElementById('origin-input').value, 
     destination: {'placeId': this.destinationPlaceId}, 
     travelMode: this.travelMode 
    }, function(response, status) { 
     if (status === 'OK') { 
     me.directionsDisplay.setDirections(response); 
     } else { 
     window.alert('Directions request failed due to ' + status); 
     } 
    }); 
    }; 

</script> 
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAcXA5KHYBhOQPuV3ygleDCPu8w2BHq4OY&libraries=places&callback=initMap" 
     async defer></script> 

+0

Ich versuchte das, aber ich muss noch auf die Autovervollständigung klicken, um den Wert dann zu halten Ich muss die Zieladresse eingeben und dann funktioniert es nur –

+0

Sie können die automatische Vervollständigung auch deaktivieren. Sie möchten nur, dass der Wert der Ursprungseingabe rechts fixiert wird. Sie müssen also eine Zieladresse eingeben. Oder fehlt mir etwas? – eNVy

+0

Ich habe das Problem gefunden. Ihre Ursprungseingabe wird durch Autocomplete ausgelöst. Stattdessen müssen Sie nur den Wert von der Ursprungseingabe abrufen und in den Anweisungen Dienstanruf festlegen. Ich habe die Antwort aktualisiert. – eNVy

Verwandte Themen