2015-03-02 60 views
3

我試圖從谷歌地理編碼API獲取經緯度,但當丹麥本地字符在地址中時請求失敗。我懷疑這是因爲httr :: GET函數會對url進行編碼,但我不確定我是否正確。避免在R的網址編碼

如果複製/直接粘貼此鏈接到瀏覽器中,你得到一個有效的結果: http://maps.googleapis.com/maps/api/geocode/json?address =Søholmen+ 9,+ 4500 +丹麥

但下面的代碼是無效的,即使網址是同前它被解析成GET函數。如果我使用沒有本地字符的地址,它會起作用。

library(httr) 
library(jsonlite) 
library(stringr) 

address <- "Søholmen 9, 4500 Denmark" 
# address <- "Kronprinsesse Sofies Vej 6, 2000 Denmark" 

base_url <- "http://maps.googleapis.com/maps/api/geocode/json?" 

# An address OR components 
geo_url <- paste0(base_url, "address=", str_replace_all(address, pattern = " ", replacement = "+")) 

# Get the result 
# get the content 
# Parse the JSON 
temp_geo_results <- httr::GET(url = URLencode(URL = geo_url), verbose()) 
temp_geo_results <- httr::content(temp_geo_results, as = "text") 
temp_geo_results <- jsonlite::fromJSON(temp_geo_results) 

這裏是我的sessionInfo()

R version 3.1.2 (2014-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252  LC_MONETARY=Danish_Denmark.1252 
[4] LC_NUMERIC=C     LC_TIME=Danish_Denmark.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] stringr_0.6.2 jsonlite_0.9.10 httr_0.5  

loaded via a namespace (and not attached): 
[1] RCurl_1.95-4.3 tools_3.1.2 

編輯:我刪除一行代碼沒有必要的問題,並增加我的sessionInfo。

+0

也許另一種選擇是使用另一種編碼選項,並建立使用功能build_url/parse_url網址從httr包,但我不知道如何做到這一點。 – KERO 2015-03-02 09:15:57

+0

此網址也提供了正確的回覆: 'http://maps.googleapis.com/maps/api/geocode/json?address = S%C3%B8holmen + 9,+ 4500 + Denmark' 因此,您可能需要手動編碼,像@KERO建議,然後它會工作。 – LauriK 2015-03-02 09:17:26

+0

@LauriK如果我複製/粘貼您的網址到我的瀏覽器和GET功能,我收到了一個「壞請求」/「零結果」回來。 – KERO 2015-03-02 09:23:55

回答

4

這似乎是一個編碼問題。

對我來說,以下罰款作品:

address <- "Søholmen 9, 4500 Denmark" 
u <- sprintf("http://maps.googleapis.com/maps/api/geocode/json?address=%s", 
      gsub('\\s+', '+', enc2utf8(address))) 

fromJSON(content(GET(u), as='text')) 
+0

這解決了這個問題!謝謝! – KERO 2015-03-02 09:54:52

+2

我試圖將地址封裝在enc2utf8中,並且可以工作。我認爲我可以通過將R文件保存爲UTF-8來避免這些問題。顯然不是。感謝您的幫助。非常感激! – KERO 2015-03-02 09:58:04

+0

好點 - 'enc2utf8'在這裏可能更明智。我會編輯。 – jbaums 2015-03-02 10:05:27

-1

我可以分享原油路我如何在我的語言解決的非常相同的問題:

deencode <- function(text){ 
    output <- NULL 
    for(i in 1:length(text)){ 
    temp <- text[i] 
    temp <- gsub("ā", "a", temp) 
    temp <- gsub("Ā", "A", temp) 
    temp <- gsub("č", "c", temp) 
    temp <- gsub("Č", "C", temp) 
    temp <- gsub("ē", "e", temp) 
    temp <- gsub("Ē", "E", temp) 
    temp <- gsub("ģ", "g", temp) 
    temp <- gsub("Ģ", "G", temp) 
    temp <- gsub("ī", "i", temp) 
    temp <- gsub("Ī", "I", temp) 
    temp <- gsub("ķ", "k", temp) 
    temp <- gsub("Ķ", "K", temp) 
    temp <- gsub("ļ", "l", temp) 
    temp <- gsub("Ļ", "L", temp) 
    temp <- gsub("ņ", "n", temp) 
    temp <- gsub("Ņ", "N", temp) 
    temp <- gsub("š", "s", temp) 
    temp <- gsub("Š", "S", temp) 
    temp <- gsub("ū", "u", temp) 
    temp <- gsub("Ū", "u", temp) 
    temp <- gsub("ž", "z", temp) 
    temp <- gsub("Ž", "Z", temp) 
    output <- c(output, temp) 
    } 
    return(output) 
} 

這個簡單的替代它的所有工作,至少在谷歌的地理編碼API之後。

+0

'gsub'是矢量化的,所以你不需要遍歷'text'的元素:) – jbaums 2015-03-02 09:56:26

0

可以使用rvest包

library(rvest); library(jsonlite) 
address <- "Søholmen 9, 4500 Denmark" 
# address <- "Kronprinsesse Sofies Vej 6, 2000 Denmark" 
base_url <- "http://maps.googleapis.com/maps/api/geocode/json?" 

# An address OR components 
geo_url <- paste0(base_url, "address=", str_replace_all(address, pattern = " ", replacement = "+")) 
geo_url <- iconv(geo_url, to="UTF-8") 

temp_geo_results <- html_text(html_nodes(html(geo_url) , "p")) 
temp_geo_results <- fromJSON(temp_geo_results) 
+0

感謝帕斯卡爾指出這一點。我已經更新了我的答案。 – 2015-03-03 08:37:36