7

我正在尝试使用Geocoder API位于:http ://code.google.com/p/geocoder-java/ 的 for java

这些是我编写的代码行,当我将其作为 GAE Web 应用程序运行时,它可以完美运行。

    final Geocoder geocoder = new Geocoder();
    GeocoderRequest geocoderRequest = new GeocoderRequestBuilder().setAddress(req.getParameter("location").toString()).setLanguage("en").getGeocoderRequest();
    GeocodeResponse geocoderResponse = geocoder.geocode(geocoderRequest);
    List<GeocoderResult> someList = geocoderResponse.getResults();
    GeocoderResult data = someList.get(0);
    GeocoderGeometry data_2 = data.getGeometry();
    BigDecimal Latitude = data_2.getLocation().getLat();
    BigDecimal Longitude = data_2.getLocation().getLng();

它的作用是我输入一个文本,例如纽约,它会找出该地区的经度和纬度。

但是,当我将相同的代码行放入 GAE 时,有时当我运行此代码时,我会得到位于“ GeocoderResult data = someList.get(0)”的检查边界异常;

有时我没有收到错误,它会正确显示网页上的坐标。所以我有点困惑,在网站上显示它支持GAE,还是geocodergoogle提供的有问题本身有问题?

通常它在东部时间的下午或午夜不起作用。

4

2 回答 2

5

我相信你在这里达到了 API 限制。API 速率限制是按 IP 地址设置的,并且 Google App Engine 等基础设施通常使用共享 IP 向服务器发出请求,因此虽然您的应用程序本身没有达到这些限制,但由于共享基础设施,它可能会达到这些限制,你没有得到任何结果。

于 2013-04-29T09:49:31.803 回答
3

您的响应 GeocodeResponse geocoderResponse 有一个状态,这对于在您的代码中进行验证总是有用的。通常应始终返回状态,否则他们的系统已关闭。

可能的状态:

  • GeocoderStatus.OK(这很明显)
  • GeocoderStatus.ZERO_RESULTS(找不到您的地址的结果)
  • ...(还有其他一些可能的状态)
  • GeocoderStatus.OVER_QUERY_LIMIT

最后一个可能对您很重要,因为它表明您每秒发送许多请求或者您已达到每日限制(您可以支付密钥并升级每日限制,没有什么是真正免费的)

为避免每秒请求过多的问题:

if (firstTry && GeocoderStatus.OVER_QUERY_LIMIT.equals(geocodeResponse.getStatus()) {
     Thread.sleep(2000);
     // try again..
} else { logger.error("You reached your daily limit of requests"); }

无论如何,拥有此代码很有用

于 2014-07-10T06:51:17.957 回答