用于 Java 的地理编码器 API

Posted

技术标签:

【中文标题】用于 Java 的地理编码器 API【英文标题】:Geocoder API for Java 【发布时间】:2013-04-22 17:14:28 【问题描述】:

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

这些是我编写的代码行,当我将其作为 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,还是google自己提供的geocoder有问题?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您的响应 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"); 

反正有这段代码很有用

【讨论】:

以上是关于用于 Java 的地理编码器 API的主要内容,如果未能解决你的问题,请参考以下文章

使用FME进行地理编码转换

用于从 IP 地址获取地理编码的 Java 库

反向地理编码不返回邮政编码

如何在地理名称和地理编码器 api 中动态生成边界框

高德地图的API怎么用URL实现地理编码/逆地理编码?

阻止Maps API进行地理编码坐标