Groovy中使用Google的Geocoder v3

Ken Kousen在他的博文中介紹了在Groovy中使用Google的Geocoder v3的方法。html

Google geocoder是Google提供的能夠獲取某個地址的經度、緯度等信息的WebService。對於Geocoder v3以前的版本,若是要使用geocoder須要先到Google地圖API爲你的程序的部署URL(好比:http://www.groovyq.net)生成一個Key,有點麻煩哦!git

得到了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

代碼要求得到紐約的經度、緯度,輸出結果以下:json

// status, accuracy, latitude, longitude
200,4,40.7142691,-74.0059729

可喜的是Kousen於近期收到了Google的通知,Geocoder v3已經發布,v3有(至少)兩個改進:api

  • 使用Geocoder時再也不須要Key;
  • 再也不支持CSV的輸出類型,而是支持JSON、XML的輸出類型。

基於這些改進,上述代碼就變動爲:wordpress

city = 'New York'
state = 'NY'
base = 'http://maps.google.com/maps/api/geocode/xml?'
params = [sensor:false,
       address:[city,state].collect { URLEncoder.encode(it,'UTF-8') }.join(',+')]
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/ }。google

若是要查看返回結果的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 Responsesurl

目前Geocoder v2仍是可用的,可是能夠很容易的就移植到v3上,能夠參考本文中的代碼進行移植。.net

相關文章
相關標籤/搜索