【问题标题】:Get placeId on google maps when POI is clicked单击 POI 时在谷歌地图上获取 placeId
【发布时间】:2016-03-09 03:24:29
【问题描述】:

我在我的网站上使用 Google Maps JS V3 API。当用户搜索地点时,我可以通过 placeId 使用 getDetails。当用户点击 POI 时,我也想做同样的事情。但是,当用户单击 POI 而不是使用搜索框时,我似乎无法找到获取此 placeId 的方法。

我已经研究了好几天,但没有找到任何接近的东西。

遇到这个功能请求,不知道是不是真的没有办法通过POI点击获取placeId:https://code.google.com/p/gmaps-api-issues/issues/detail?id=8113&q=poi&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal

感谢任何帮助,谢谢!

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 google-maps-markers


    【解决方案1】:

    从 2017 年 12 月开始,现在支持此功能。这是示例 https://developers.google.com/maps/documentation/javascript/examples/event-poi

    【讨论】:

      【解决方案2】:

      Google 没有提供任何记录在案的 API 方法来通过单击 POI 来获取地点 ID。但是,我能够使用反向地理编码获得地点 ID。

      首先,我们可以通过Stack-overflow answer中描述的方法获取POI的坐标

      其次,您可以使用 getPosition() 方法中的坐标调用 geocode 方法来检索地址组件和地点 ID。

      这是一个有效的JS Fiddle

      function initialize() {
        var mapOptions = {
          zoom: 14,
          center: new google.maps.LatLng(38.8862447, -77.02158380000003),
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById('map_canvas'),
          mapOptions);
      
        geocoder = new google.maps.Geocoder;
      
        //keep a reference to the original setPosition-function
        var fx = google.maps.InfoWindow.prototype.setPosition;
      
        //override the built-in setPosition-method
        google.maps.InfoWindow.prototype.setPosition = function() {
      
          //this property isn't documented, but as it seems
          //it's only defined for InfoWindows opened on POI's
          if (this.logAsInternal) {
            google.maps.event.addListenerOnce(this, 'map_changed', function() {
              var map = this.getMap();
      
              //the infoWindow will be opened, usually after a click on a POI
              if (map) {
      
                //trigger the click
                google.maps.event.trigger(map, 'click', {
                  latLng: this.getPosition()
                });
              }
            });
          }
          //call the original setPosition-method
          fx.apply(this, arguments);
        };
      
        google.maps.event.addListener(map, 'click', function(e) {
          //alert('clicked @' + e.latLng.toString())
          geocoder.geocode({
            'location': e.latLng
          }, function(results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
              if (results[0]) {
      
                alert('place id: ' + results[0].place_id);
      
      
              } else {
                console.log('No results found');
              }
            } else {
              console.log('Geocoder failed due to: ' + status);
            }
          });
      
        });
      }
      
      google.maps.event.addDomListener(window, 'load', initialize);
      html,
      body,
      #map_canvas {
        margin: 0;
        height: 100%;
      }
      <div id="map_canvas"></div>
      <script src="https://maps.googleapis.com/maps/api/js?callback=initialize" async defer></script>

      【讨论】:

      • 确实如此。有关详细信息,请参阅 Mihail Shishkov 的帖子。
      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 2016-03-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多