Google Maps API Javascript:从“地点”搜索框中激活标记上的信息窗口

Google Maps API Javascript: Activating infowindows on markers from Places search box

本文关键字:激活 窗口 信息窗 信息 搜索 Javascript API Maps 地点 Google      更新时间:2023-09-26

我通过严格遵循Google开发人员文档来实现了一个Places搜索框。标记将根据特定的搜索词(例如"餐厅"(显示在地图上。当然,我想在用户单击标记时显示一个信息窗口,以实际为用户提供有关该地点的一些信息。我遵循了Google开发人员的文档来激活信息窗口,但没有任何成功(我在代码中所做的更改由注释1,2和3说明(。

这里早期的帖子也没有帮助我。任何帮助将不胜感激。

<script>
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -33.8688, lng: 151.2195},
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

var input = document.getElementById('pac-input');
var searchBox = new google.maps.places.SearchBox(input);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);

map.addListener('bounds_changed', function() {
    searchBox.setBounds(map.getBounds());
});

// 1: Variables infowindow and service:
var infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(map);
var markers = [];
searchBox.addListener('places_changed', function() {
   var places = searchBox.getPlaces(); 
    if (places.length == 0) {
      return;
    }
    markers.forEach(function(marker) {
      marker.setMap(null);
    });
    markers = [];
    var bounds = new google.maps.LatLngBounds();
  places.forEach(function(place) {
      var icon = {
        url: place.icon,
        size: new google.maps.Size(71, 71),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(17, 34),
        scaledSize: new google.maps.Size(25, 25)
      };
      markers.push(new google.maps.Marker({
        map: map,
        icon: icon,
        title: place.name,
        position: place.geometry.location
      }));
      if (place.geometry.viewport) {
        bounds.union(place.geometry.viewport);
      } else {
        bounds.extend(place.geometry.location);
      }
  });
// 2: getDetails, referring to the "places" (var places = searchBox.getPlaces();) already on the map
// 3: addlistener on the markers, to show an infowindow upon a clickevent   
  service.getDetails(places, function(place, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      google.maps.event.addListener(markers, 'click', function() {
        infowindow.setContent('<div><strong>' + place.name + '</strong><br>' +
          'Place ID: ' + place.place_id + '<br>' +
          place.formatted_address + '</div>');
        infowindow.open(map, this);
      });
    }
  });

  map.fitBounds(bounds);
});

}
 </script>
您需要在

单击标记时执行详细信息请求(如果在创建标记时运行所有详细信息请求,则会遇到查询限制(。

然后在响应返回时打开标记上的信息窗口。

代码片段:

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: -33.8688,
      lng: 151.2195
    },
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });
  var input = document.getElementById('pac-input');
  var searchBox = new google.maps.places.SearchBox(input);
  map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
  map.addListener('bounds_changed', function() {
    searchBox.setBounds(map.getBounds());
  });
  // 1: Variables infowindow and service:
  var infowindow = new google.maps.InfoWindow();
  var service = new google.maps.places.PlacesService(map);
  var markers = [];
  searchBox.addListener('places_changed', function() {
    var places = searchBox.getPlaces();
    if (places.length == 0) {
      return;
    }
    markers.forEach(function(marker) {
      marker.setMap(null);
    });
    markers = [];
    var bounds = new google.maps.LatLngBounds();
    places.forEach(function(place) {
        var icon = {
          url: place.icon,
          size: new google.maps.Size(71, 71),
          origin: new google.maps.Point(0, 0),
          anchor: new google.maps.Point(17, 34),
          scaledSize: new google.maps.Size(25, 25)
        };
        var marker = new google.maps.Marker({
          map: map,
          icon: icon,
          title: place.name,
          position: place.geometry.location,
          placeId: place.place_id
        });
        markers.push(marker);
        google.maps.event.addListener(marker, 'click', function(evt) {
          // 2: getDetails, referring to the "places" (var places = searchBox.getPlaces();) already on the map
          // 3: addlistener on the markers, to show an infowindow upon a clickevent   
          service.getDetails({
            placeId: this.placeId
          }, (function(marker) {
            return function(place, status) {
              if (status === google.maps.places.PlacesServiceStatus.OK) {
                infowindow.setContent('<div><strong>' + place.name + '</strong><br>' +
                  'Place ID: ' + place.place_id + '<br>' +
                  place.formatted_address + '</div>');
                infowindow.open(map, marker);
              }
            }
          }(marker)));
        });
        if (place.geometry.location) {
          bounds.extend(place.geometry.location);
        }
      })
      // map.fitBounds(bounds);
  });
}
google.maps.event.addDomListener(window, "load", initMap);
html,
body,
#map {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
<input id="pac-input" type="text" />
<div id="map"></div>