Ken Kousen在他的博文中介绍了在Groovy中使用Google的Geocoder v3的方法。
Google geocoder是Google提供的可以获取某个地址的经度、纬度等信息的WebService。对于Geocoder v3之前的版本,如果要使用geocoder需要先到Google地图API为你的程序的部署URL(比如:http://www.groovyq.net)生成一个Key,有点麻烦哦!
获得了Key之后,就可以在你的Groovy代码中使用Geocoder,见如下代码:
city = 'New York' state = 'NY' params = [sensor:false,output:'csv',q:[city,state].collect { URLEncoder.encode(it,'UTF-8') }.join(',+'),key:"ABQIAAAAF0RqRyWNd_7X3e0RobCNCBT2yXp_ZAY8_"+ "ufC3CFXhHIE1NvwkxQrL4ScHXqQm1WlqT2XNOKPl5k8bw" ] url = "http://maps.google.com/maps/geo?" + params.collect { k,v -> "$k=$v" }.join('&') (status,accuracy,lat,lng) = url.toURL().text.split(',') println "($status,$accuracy,$lat,$lng)" assert Math.abs(40.7142691 - lat.toDouble()) < 0.0001 assert Math.abs(-74.0059729 - lng.toDouble()) < 0.0001
代码要求获得纽约的经度、纬度,输出结果如下:
// status,latitude,longitude 200,4,40.7142691,-74.0059729
可喜的是Kousen于近期收到了Google的通知,Geocoder v3已经发布,v3有(至少)两个改进:
- 使用Geocoder时不再需要Key;
- 不再支持CSV的输出类型,而是支持JSON、XML的输出类型。
基于这些改进,上述代码就变更为:
city = 'New York' state = 'NY' base = 'http://maps.google.com/maps/api/geocode/xml?' params = [sensor:false,address:[city,+')] url = base + params.collect { k,v -> "$k=$v" }.join('&') response = new XmlSlurper().parse(url) // Walk the tree lat = response.result.geometry.location.lat // Finders work too lng = response.'**'.find { it.name() =~ /lng/ } println "($lat,$lng)" assert Math.abs(40.7142691 - lat.toDouble()) < 0.0001 assert Math.abs(-74.0059729 - lng.toDouble()) < 0.0001
这一次就没有出现Key的内容,同时使用了XmlSlurper来解析返回的结果。这里获取经度和纬度,Kousen使用了两种不同的方式。经度采用GPath的表达式获取,如:response.result.geometry.location.lat,而纬度的获取则使用了深度优先(depth-first)算法查询出来的,如:response.'**'.find { it.name() =~ /lng/ }。
如果要查看返回结果的xml内容,可以使用url.toURL().text将所有XML内容显示出来,比如:println url.toURL().text。如果要将返回结果设置成JSON,可以将上述代码中的:base = 'http://maps.google.com/maps/api/geocode/xml?' 改为 base = 'http://maps.google.com/maps/api/geocode/json?'。XML、JSON返回结果的格式参见Geocoding Responses
目前Geocoder v2还是可用的,但是可以很容易的就移植到v3上,可以参考本文中的代码进行移植。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。