【问题标题】:google places api get details not returned for every place谷歌地方 api 获取未返回每个地方的详细信息
【发布时间】:2016-05-01 17:49:02
【问题描述】:

我正在我的网站上创建一个页面,该页面使用 google places api 和用户的地理位置(lat、lng)并查找附近的餐馆。作为代码的一部分,我还查找了餐厅与用户位置的距离。问题是当它得到每个结果时,我有一个名为 getDistance 的函数,它为每个地方调用。这会为很多结果返回空字符串,并且确实会返回一些结果。出于示例的目的,我在这个 plunker 示例中对用户的位置进行了硬编码。有人可以指出为什么没有为每个地方返回距离以及为什么它为某些地方返回一个空字符串以及对此的正确解决方法吗?我真的很感谢你的帮助。

我正在调用 get distance 函数,该函数在场所服务的回调函数中计算每家餐厅的距离(以英里为单位)

 angular.forEach(results, function(result) {

        //using new function for getting distance from user's location
        var place = getDistance(result, service);

        $scope.places.push(place);
      });

这里是getDistance函数

function getDistance (place, service) {

    var request = {
      reference: place.reference
    };

    service.getDetails(request, function (details, status) {

        if(status == google.maps.places.PlacesServiceStatus.OK) {

          place.details = details;
          var distance = google.maps.geometry.spherical.computeDistanceBetween
          (new google.maps.LatLng(33.940496, -84.048816), new google.maps.LatLng(place.geometry.location.lat(), place.geometry.location.lng()));
          var distanceInMiles = getMiles(distance);
          place["distance"] = distanceInMiles;
        }
    });

    return place;
};

Plunker example

【问题讨论】:

  • 看起来像同步问题,在 getDetails 回调设置 place["distance"] 之前返回位置。
  • right serg 我如何修改此代码,以便在从 service.getDetails 返回响应之前不会返回该位置。我不能做。然后似乎在 getDetails 函数上,更改示例会有所帮助,谢谢!!
  • 你需要 promises/deferred 对象来让你的异步请求同步回来。见docs.angularjs.org/api/ng/service/$q
  • 嗨,serg,我添加了一个延迟对象/promise 到 getDistance 函数,现在正在添加解决 promise 时的位置,但认为仍然存在距离永远不会添加的问题,我认为总体没有结果也没有像以前那样显示。你能看看 plunker 并让我知道在返回之前是否正确解决了承诺?

标签: javascript angularjs google-maps google-places-api


【解决方案1】:

如果您的所有用户在定期运行客户端地理编码请求时同时发出请求,您的请求可能会被阻止。为避免这种情况,请考虑以下Quota Considerations 之一:

  • 使用缓存策略。
  • 为您的请求引入随机间隔(抖动)。确保请求 在您的整个用户群中是随机的。
  • 如果为 Android 开发,请使用不准确的重复警报。
  • 如果为 Android 开发,请选择合适的定位策略。

Google Maps API 允许您缓存地理编码,如果您反复查找相同的地址,这将非常有用。但是,如文档中所述,有两件重要的事情需要牢记。一个是:

随着我们的数据越来越准确,地理编码经常发生变化。因此,即使您有缓存数据,您也应该定期刷新它,以确保获得适合您所在位置的最佳地理编码。

除了提供区域内的地点列表外,地点服务还可以返回有关特定地点的详细信息。通过调用服务的getDetails() 方法来请求地点详细信息。此方法接受一个包含所需地点的placeId 的请求,还接受一个回调方法,该方法需要处理google.maps.places.PlacesServiceStatus 响应中传递的状态码,以及google.maps.places.PlaceResult 对象。

最后,对于同步问题,其中位置在 getDetails() 回调设置位置之前返回,此相关 SO 帖子 - Can't wait until results come back from google API 可以帮助您。

【讨论】:

  • 嗨 Teyam,谢谢,所以我做了一些更改,现在我返回了承诺,所以现在返回每个结果的距离,但结果仅限于 20-21。你可以看到上面有 60 个结果的早期 plunker。这是因为谷歌每次调用 getDetails 函数都有限制吗?正如您在 init 函数中看到的那样,我根据 google api 的要求等待 2 秒来调用 pagination.nextPage() 函数。请看看这个更新的 plunker,让我知道为什么你认为结果有限plnkr.co/edit/9WZnMZ3FGVx5ioVtlkoq?p=preview
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多