无法使用 Tigris 进行地理编码
Cannot GeoCode with Tigris
我正在尝试为一批地址生成人口普查区大地水准面。当我使用 tigris 包中的“append_geoid”函数时,r returns ”Error in call_geolocator(as.character(address$street[i]) , as.character(address$city[i]), : 错误请求 (HTTP 400)".
我使用了 r 文档中给出的示例数据,它产生了相同的结果。下面的代码。感谢任何有关如何解决问题的帮助!
airports <- dplyr::data_frame(street = "700 Catalina Dr", city = "Daytona Beach", state = "FL")
append_geoid(airports, 'tr) # Populate Census Tract GEOID
编辑:包的固定版本在github:
remotes::install_github("walkerke/tigris")
然后重试
编辑 2:
github 上的版本似乎仍然出错,虽然这次不同。 HTTP 调用成功,但响应不包含他的函数所期望的内容。我会联系他或她。
我的初始Post:
我收到了和你一样的信息。
我做到了:debug( call_geolocator )
又是运行,这次是单步执行。在几行代码之后,它创建了 url:https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json
此 url 然后失败。在浏览器中打开这个 url 也会报错,提示无效基准。
此时是时候打电话给作者,让他知道他的包裹不再工作了。
作为参考,这是调试会话在我的终端中的样子,直到我检查了完整的 url 创建并点击 Q
停止调试:
> debug( call_geolocator )
> append_geoid(airports, 'tract') # Populate Census Tract GEOID
debugging in: call_geolocator(as.character(address$street[i]), as.character(address$city[i]),
as.character(address$state[i]))
debug: {
call_start <- "https://geocoding.geo.census.gov/geocoder/geographies/address?"
if (is.na(zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
if (!is.na(zip)) {
if (class(zip) == "character" & nchar(zip) == 5 & !grepl("\D",
zip)) {
url <- paste0("street=", utils::URLencode(street),
"&city=", utils::URLencode(city), "&state=",
state, "&zip=", zip)
}
else {
message("'zip' (", paste0(zip), ") was not a 5-character-long string composed of :digits:. Using only street, city, state.")
url <- paste0("street=", utils::URLencode(street),
"&city=", utils::URLencode(city), "&state=",
state)
}
}
call_end <- "&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
url_full <- paste0(call_start, url, call_end)
r <- httr::GET(url_full)
httr::stop_for_status(r)
response <- httr::content(r)
if (length(response$result$addressMatches) == 0) {
message(paste0("Address (", street, " ", city, " ", state,
") returned no address matches. An NA was returned."))
return(NA_character_)
}
else {
if (length(response$result$addressMatches) > 1) {
message(paste0("Address (", street, " ", city, " ",
state, ") returned more than one address match. The first match was returned."))
}
return(response$result$addressMatches[[1]]$geographies$`Census Blocks`[[1]]$GEOID)
}
}
Browse[2]>
debug: call_start <- "https://geocoding.geo.census.gov/geocoder/geographies/address?"
Browse[2]>
debug: if (is.na(zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
Browse[2]>
debug: url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
Browse[2]>
debug: if (!is.na(zip)) {
if (class(zip) == "character" & nchar(zip) == 5 & !grepl("\D",
zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state, "&zip=",
zip)
}
else {
message("'zip' (", paste0(zip), ") was not a 5-character-long string composed of :digits:. Using only street, city, state.")
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
}
Browse[2]>
debug: call_end <- "&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
Browse[2]>
debug: url_full <- paste0(call_start, url, call_end)
Browse[2]>
debug: r <- httr::GET(url_full)
Browse[2]> url_full
[1] "https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
Browse[2]> Q
进入人机界面:https://geocoding.geo.census.gov/geocoder/locations/address?form
它确实看起来像上面的 url 的基准,在下拉列表 select 框中不再可用。将其更改为 Public_AR_Census2020 反而会给出另一个错误 Invalid vintage in request
。将该字符串中的 2010 更改为 2020 会导致成功的 HTTP 请求:https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2020&vintage=Census2010_Census2010&layers=14&format=json .
这在这一点上并不能真正帮助你,但至少你可以联系作者并指出问题可以解决,你可以给他一些信息以开始工作。
如果你很聪明,你可以克隆他的包源并自己修复它,将修复提供给他,但仍然使用你自己的修复包,直到他解决问题。
我正在尝试为一批地址生成人口普查区大地水准面。当我使用 tigris 包中的“append_geoid”函数时,r returns ”Error in call_geolocator(as.character(address$street[i]) , as.character(address$city[i]), : 错误请求 (HTTP 400)".
我使用了 r 文档中给出的示例数据,它产生了相同的结果。下面的代码。感谢任何有关如何解决问题的帮助!
airports <- dplyr::data_frame(street = "700 Catalina Dr", city = "Daytona Beach", state = "FL")
append_geoid(airports, 'tr) # Populate Census Tract GEOID
编辑:包的固定版本在github:
remotes::install_github("walkerke/tigris")
然后重试
编辑 2:
github 上的版本似乎仍然出错,虽然这次不同。 HTTP 调用成功,但响应不包含他的函数所期望的内容。我会联系他或她。
我的初始Post:
我收到了和你一样的信息。
我做到了:debug( call_geolocator )
又是运行,这次是单步执行。在几行代码之后,它创建了 url:https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json
此 url 然后失败。在浏览器中打开这个 url 也会报错,提示无效基准。
此时是时候打电话给作者,让他知道他的包裹不再工作了。
作为参考,这是调试会话在我的终端中的样子,直到我检查了完整的 url 创建并点击 Q
停止调试:
> debug( call_geolocator )
> append_geoid(airports, 'tract') # Populate Census Tract GEOID
debugging in: call_geolocator(as.character(address$street[i]), as.character(address$city[i]),
as.character(address$state[i]))
debug: {
call_start <- "https://geocoding.geo.census.gov/geocoder/geographies/address?"
if (is.na(zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
if (!is.na(zip)) {
if (class(zip) == "character" & nchar(zip) == 5 & !grepl("\D",
zip)) {
url <- paste0("street=", utils::URLencode(street),
"&city=", utils::URLencode(city), "&state=",
state, "&zip=", zip)
}
else {
message("'zip' (", paste0(zip), ") was not a 5-character-long string composed of :digits:. Using only street, city, state.")
url <- paste0("street=", utils::URLencode(street),
"&city=", utils::URLencode(city), "&state=",
state)
}
}
call_end <- "&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
url_full <- paste0(call_start, url, call_end)
r <- httr::GET(url_full)
httr::stop_for_status(r)
response <- httr::content(r)
if (length(response$result$addressMatches) == 0) {
message(paste0("Address (", street, " ", city, " ", state,
") returned no address matches. An NA was returned."))
return(NA_character_)
}
else {
if (length(response$result$addressMatches) > 1) {
message(paste0("Address (", street, " ", city, " ",
state, ") returned more than one address match. The first match was returned."))
}
return(response$result$addressMatches[[1]]$geographies$`Census Blocks`[[1]]$GEOID)
}
}
Browse[2]>
debug: call_start <- "https://geocoding.geo.census.gov/geocoder/geographies/address?"
Browse[2]>
debug: if (is.na(zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
Browse[2]>
debug: url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
Browse[2]>
debug: if (!is.na(zip)) {
if (class(zip) == "character" & nchar(zip) == 5 & !grepl("\D",
zip)) {
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state, "&zip=",
zip)
}
else {
message("'zip' (", paste0(zip), ") was not a 5-character-long string composed of :digits:. Using only street, city, state.")
url <- paste0("street=", utils::URLencode(street), "&city=",
utils::URLencode(city), "&state=", state)
}
}
Browse[2]>
debug: call_end <- "&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
Browse[2]>
debug: url_full <- paste0(call_start, url, call_end)
Browse[2]>
debug: r <- httr::GET(url_full)
Browse[2]> url_full
[1] "https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2010&vintage=Census2010_Census2010&layers=14&format=json"
Browse[2]> Q
进入人机界面:https://geocoding.geo.census.gov/geocoder/locations/address?form
它确实看起来像上面的 url 的基准,在下拉列表 select 框中不再可用。将其更改为 Public_AR_Census2020 反而会给出另一个错误 Invalid vintage in request
。将该字符串中的 2010 更改为 2020 会导致成功的 HTTP 请求:https://geocoding.geo.census.gov/geocoder/geographies/address?street=700%20Catalina%20Dr&city=Daytona%20Beach&state=FL&benchmark=Public_AR_Census2020&vintage=Census2010_Census2010&layers=14&format=json .
这在这一点上并不能真正帮助你,但至少你可以联系作者并指出问题可以解决,你可以给他一些信息以开始工作。
如果你很聪明,你可以克隆他的包源并自己修复它,将修复提供给他,但仍然使用你自己的修复包,直到他解决问题。