用于 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的主要内容,如果未能解决你的问题,请参考以下文章