【问题标题】:Location based on correct map center for Google Place Service Nearby Search results位置基于 Google Place Service 附近搜索结果的正确地图中心
【发布时间】:2016-09-09 02:22:03
【问题描述】:

此代码成功获取从自动完成字段传递的 localStorage 地点 id 变量(可以单击“映射它”并在出现的弹出窗口中输入地点,在 roadtripsharing.com 进行测试),并创建一个标记,信息窗口, 和圆圈。我包括了一个默认位置 {lat: 39, lng: -105} 以防用户直接访问该页面而不使用任何 localStorage。但是,即使我从主页转到本地存储中,出现的地方(在本例中为 ATM 机)都以美国科罗拉多斯普林斯为中心,即 {lat: 39, lng: -105 }。

我相信在声明的时候

var request = {
        location: mapit.getCenter(),
        radius: 5000,
        //  query: 'atm'
        types: ['atm']
      };

mapit.getCenter() 应该是 results[0].geometry.location(基于从主页传递的 localStorage Place ID 的标记位置)。如何使 Place Service Nearby Search 结果使用它作为位置而不是总是 {lat: 39, lng: -105}?

function initMapIt() {    
  var mapit = new google.maps.Map(document.getElementById('mapitmap'), {
      center: {lat: 39, lng: -105},
      zoom: 11,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });  
  var rtscircle = new google.maps.Circle({
        radius:document.getElementById("rtsfader").value*1609.34, 
        strokeWeight: 2,
        strokeColor: "blue",
          strokeOpacity: 0.9,
        fillColor: "red",
        fillOpacity: 0.15,
          clickable: false,
        map: mapit
        });
  if (localStorage.placetopass !== null){
    var rtsgeocoder = new google.maps.Geocoder;
    var newplace = localStorage.getItem('placetopass');
    rtsgeocoder.geocode({'placeId': newplace}, function(results, status) {
    if (status === google.maps.GeocoderStatus.OK) {
      if (results[0]) {
        mapit.setZoom(11);
        mapit.setCenter(results[0].geometry.location);
        var rtsmarker = new google.maps.Marker({
          map: mapit,
          position: results[0].geometry.location
        });
        var rtsinfowindow = new google.maps.InfoWindow;
        rtsinfowindow.setContent(results[0].formatted_address+'<p><a href="http://roadtripsharing.com/rate-place">Rate this place?</a></p>');
        rtsinfowindow.open(mapit, rtsmarker);
        rtsmarker.addListener('click', function() {
          rtsinfowindow.open(mapit, rtsmarker);
        });
        rtscircle.setCenter(results[0].geometry.location);
        jQuery("#rtsfader").change(function(){
          rtscircle.setRadius(document.getElementById("rtsfader").value*1609.34);
        });
      }                           
         else {
        rtscircle.setCenter({lat: 39, lng: -105});   
      }
    } else {
      rtscircle.setCenter({lat: 39, lng: -105});
    }
  });
  document.getElementById("rts-aahs").play();
  }
  var request = {
    location: mapit.getCenter(),
    radius: 5000,
    //  query: 'atm'
    types: ['atm']
  };
  var infowindow = new google.maps.InfoWindow();
  var service = new google.maps.places.PlacesService(mapit);
  service.nearbySearch(request, callback);

function callback(results, status) {
  if (status == google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
      createMarker(results[i]);
      console.log(results[i]);
    }
  }
  else
      alert("Status not OK");
}

function createMarker(place) {
    // alert("createMarker function");
  var placeLoc = place.geometry.location;
  var marker = new google.maps.Marker({
    map: mapit,
    position:  place.geometry.location
  });
  console.log(marker);
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.setContent(place.name);
    infowindow.open(mapit, this);
  });
}

}

【问题讨论】:

    标签: javascript html google-maps google-maps-api-3 google-places-api


    【解决方案1】:

    问题是你打电话给mapit.getCenter()之前你打电话给mapit.setCenter(results[0].geometry.location)。发生这种情况是因为您在rtsgeocoder.geocode(...) 的回调中更新了地图中心,但您无需等待它运行,然后继续执行nearbySearch。您可以通过在 getCenter/setCenter 调用之前添加几个 console.log 调用并观察它们发生的顺序来轻松验证这一点。

    要解决此问题,您可以尝试以下方法之一:

    1. 在调用getCenter(以及基于它的nearbySearch)之前,等待rtsgeocoder.geocode 运行它的回调直到某个截止日期(例如2 秒)。这不是很可靠,例如,缓慢的网络链接可能意味着需要超过 2 秒的时间,同时您没有标记可以向用户显示。
    2. 从您的rtsgeocoder.geocode 回调中调用nearbySearch 以及立即- 甚至在每次更改地图中心时。因为向地图添加大量标记会消耗内存并减慢页面速度,所以您可能希望在获得新标记时删除旧标记。例如,保留一组由您的 createMarker 函数添加的标记,并在每个标记上调用 marker.setMap(null)

    我认为选项 2 通常是更好的选择。

    【讨论】:

    • 谢谢,在中心更改生效后,从 rtsgeocoder.geocode 调用 nearSearch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2020-08-28
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多