How to display additional information in Google Maps autocomplete suggestions?

后端 未结 1 875
隐瞒了意图╮
隐瞒了意图╮ 2021-01-16 19:21

I am using Google Places autocomplete to select cities by name. Currently it displays only the city name and the country it belongs to, in the suggestions drop down.

相关标签:
1条回答
  • 2021-01-16 19:50

    As I commented already, you can do that by using the Autocomplete and Places services and the getPlacePredictions method, but I would not recommend this approach as it will make a high number of requests to the API (one for each result, each time a user types something in the address field).

    View the snippet in full screen mode as it won't fit hereunder or check it on JSFiddle.

    In this example I have added the place latitude and longitude in the autocomplete results.

    var autocompleteService, placesService, results, map;
    
    function initialize() {
    
      results = document.getElementById('results');
    
      var mapOptions = {
        zoom: 5,
        center: new google.maps.LatLng(50, 50)
      };
    
      map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
    
      // Bind listener for address search
      google.maps.event.addDomListener(document.getElementById('address'), 'input', function() {
    
        results.style.display = 'block';
        getPlacePredictions(document.getElementById('address').value);
      });
    
      // Show results when address field is focused (if not empty)
      google.maps.event.addDomListener(document.getElementById('address'), 'focus', function() {
    
        if (document.getElementById('address').value !== '') {
    
          results.style.display = 'block';
          getPlacePredictions(document.getElementById('address').value);
        }
      });
    
      // Hide results when click occurs out of the results and inputs
      google.maps.event.addDomListener(document, 'click', function(e) {
    
        if ((e.target.parentElement.className !== 'pac-container') && (e.target.parentElement.className !== 'pac-item') && (e.target.tagName !== 'INPUT')) {
    
          results.style.display = 'none';
        }
      });
    
      autocompleteService = new google.maps.places.AutocompleteService();
      placesService = new google.maps.places.PlacesService(map);
    }
    
    // Get place predictions
    function getPlacePredictions(search) {
    
      autocompleteService.getPlacePredictions({
        input: search,
        types: ['geocode']
      }, callback);
    }
    
    // Place search callback
    function callback(predictions, status) {
    
      // Empty results container
      results.innerHTML = '';
    
      // Place service status error
      if (status != google.maps.places.PlacesServiceStatus.OK) {
        results.innerHTML = '<div class="pac-item pac-item-error">Your search returned no result. Status: ' + status + '</div>';
        return;
      }
    
      // Build output for each prediction
      for (var i = 0, prediction; prediction = predictions[i]; i++) {
    
        // Get place details to inject more details in autocomplete results
        placesService.getDetails({
          placeId: prediction.place_id
        }, function(place, serviceStatus) {
    
          if (serviceStatus === google.maps.places.PlacesServiceStatus.OK) {
    
            // Create a new result element
            var div = document.createElement('div');
    
            // Insert inner HTML
            div.innerHTML += '<span class="pac-icon pac-icon-marker"></span>' + place.adr_address + '<div class="pac-item-details">Lat: ' + place.geometry.location.lat().toFixed(3) + ', Lng: ' + place.geometry.location.lng().toFixed(3) + '</div>';
    
            div.className = 'pac-item';
    
            // Bind a click event
            div.onclick = function() {
    
              var center = place.geometry.location;
              var marker = new google.maps.Marker({
                position: center,
                map: map
              });
    
              map.setCenter(center);
            }
    
            // Append new element to results
            results.appendChild(div);
          }
        });
      }
    }
    
    google.maps.event.addDomListener(window, 'load', initialize);
    body,
    html {
      font-family: Arial, sans-serif;
      padding: 0;
      margin: 0;
      height: 100%;
    }
    
    #map-canvas {
      height: 150px;
      margin-bottom: 5px;
    }
    
    table {
      border-collapse: collapse;
      margin-left: 20px;
    }
    
    table td {
      padding: 3px 5px;
    }
    
    label {
      display: inline-block;
      width: 160px;
      font-size: 11px;
      color: #777;
    }
    
    input {
      border: 1px solid #ccc;
      width: 170px;
      padding: 3px 5px;
      box-sizing: border-box;
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      box-shadow: 0 2px 6px rgba(0, 0, 0, .1);
    }
    
    .pac-container {
      background-color: #fff;
      z-index: 1000;
      border-radius: 2px;
      font-size: 11px;
      box-shadow: 0 2px 6px rgba(0, 0, 0, .3);
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      overflow: hidden;
      width: 350px;
    }
    
    .pac-icon {
      width: 15px;
      height: 20px;
      margin-right: 7px;
      margin-top: 6px;
      display: inline-block;
      vertical-align: top;
      background-image: url(https://maps.gstatic.com/mapfiles/api-3/images/autocomplete-icons.png);
      background-size: 34px;
    }
    
    .pac-icon-marker {
      background-position: -1px -161px;
    }
    
    .pac-item {
      cursor: pointer;
      padding: 0 4px;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
      line-height: 30px;
      vertical-align: middle;
      text-align: left;
      border-top: 1px solid #e6e6e6;
      color: #999;
    }
    
    .pac-item:hover {
      background-color: #efefef;
    }
    
    .pac-item-details {
      color: lightblue;
      padding-left: 22px;
    }
    
    .pac-item-error,
    .pac-item-error:hover {
      color: #aaa;
      padding: 0 5px;
      cursor: default;
      background-color: #fff;
    }
    <div id="map-canvas"></div>
    <table>
      <tr>
        <td>
          <label for="address">Address:</label>
        </td>
      </tr>
      <tr>
        <td>
          <input id="address" placeholder="Enter address" type="text" tabindex="1" />
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <div id="results" class="pac-container"></div>
        </td>
      </tr>
    </table>
    
    
    <script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>

    0 讨论(0)
提交回复
热议问题