【问题标题】:Fetch Latitude & Longitude from Google Place Autocomplete and Directions script从 Google Place Autocomplete and Directions 脚本中获取纬度和经度
【发布时间】:2017-06-23 20:05:36
【问题描述】:

有人知道如何从这个 google Place Autocomplete and Directions 脚本中获取纬度和经度吗?

https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-directions

我想将纬度和经度值传递给如下隐藏字段:

<input type="hidden" id="latitude" name="latitude"  />
<input type="hidden" id="longitude" name="longitude"  />

【问题讨论】:

  • 你想得到哪个纬度和经度?你是如何试图让它不起作用的?将有一个用于起点,一个用于目的地。 (您只想选择最后一个吗?)
  • 抱歉忘了说:它完全来自 ORIGIN。我已经尝试了许多在这个论坛上看到的解决方案,但似乎没有一个适合放置自动完成和方向脚本......
  • 我在这里尝试了这个脚本的许多变体 [link]stackoverflow.com/questions/13478646/…

标签: jquery google-maps autocomplete


【解决方案1】:
  1. AutocompleteOptions 中删除{placeIdOnly: true}。通过该设置,place 对象仅包含该地点的nameplaceId

  2. place 对象中获取纬度和经度,如下所示:

  document.getElementById("latitude").value= place.geometry.location.lat();
  document.getElementById("longitude").value= place.geometry.location.lng();

proof of concept fiddle

代码 sn-p:

// This example requires the Places library. Include the libraries=places
// parameter when you first load the API. For example:
// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">

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);
}

/**
 * @constructor
 */
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;
      document.getElementById("orig_latitude").value = place.geometry.location.lat();
      document.getElementById("orig_longitude").value = place.geometry.location.lng();
    } else {
      me.destinationPlaceId = place.place_id;
      document.getElementById("dest_latitude").value = place.geometry.location.lat();
      document.getElementById("dest_longitude").value = place.geometry.location.lng();
    }
    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);
    }
  });
};
/* Always set the map height explicitly to define the size of the div
 * element that contains the map. */

#map {
  height: 100%;
}
/* Optional: Makes the sample page fill the window. */

html,
body {
  height: 100%;
  margin: 0;
  padding: 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;
}
<input type="text" id="orig_latitude" name="orig_latitude" />
<input type="text" id="orig_longitude" name="orig_longitude" />
<br>
<input type="text" id="dest_latitude" name="dest_latitude" />
<input type="text" id="dest_longitude" name="dest_longitude" />

<input id="origin-input" class="controls" type="text" placeholder="Enter an origin location">

<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>
<!-- Replace the value of the key parameter with your own API key. -->
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&callback=initMap&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk" async defer></script>

【讨论】:

    猜你喜欢
    • 2017-10-04
    • 2015-02-26
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2011-03-30
    • 2017-11-20
    相关资源
    最近更新 更多