我需要你的帮助从一个列表中提取经度和纬度信息。我有一堆具体的地址,我用这个网站来获取每个地址的经纬度,https://geocoding.geo.census.gov/geocoder/geographies/onelineaddress。下面是我的代码:
fetch_geocodes <- function(address) {
# Specify the API endpoint
base_url <- "https://geocoding.geo.census.gov/geocoder/geographies/onelineaddress"
# Specify the parameters to pass to the API
params <- list(
address = address,
benchmark = "Public_AR_Current",
vintage = "Current_Current",
format = "json"
)
# Send a GET request to the API
response <- GET(url = base_url, query = params)
# Check if the request was successful
if (status_code(response) == 200) {
# Parse the response to JSON
data <- content(response, "parsed")
# Print the entire JSON response
print(data)
# Extract the longitude and latitude
longitude <- data$result$addressMatches$coordinates$x
latitude <- data$result$addressMatches$coordinates$y
return(c(longitude, latitude))
} else {
stop("Request failed with status ", status_code(response))
}
}
addresses <- c("Riverside Dr, Apple Valley, CA, 92307",
"11 Wall Street, New York, NY 10005")
geocodes <- lapply(addresses, fetch_geocodes)
下面是我的部分输出,因为整个输出很长:
$result
$result$input
$result$input$address
$result$input$address$address
[1] "Riverside Dr, Apple Valley, CA, 92307"
$result$input$vintage
$result$input$vintage$isDefault
[1] TRUE
$result$input$vintage$id
[1] "4"
$result$input$vintage$vintageName
[1] "Current_Current"
$result$input$vintage$vintageDescription
[1] "Current Vintage - Current Benchmark"
$result$input$benchmark
$result$input$benchmark$isDefault
[1] TRUE
$result$input$benchmark$benchmarkDescription
[1] "Public Address Ranges - Current Benchmark"
$result$input$benchmark$id
[1] "4"
$result$input$benchmark$benchmarkName
[1] "Public_AR_Current"
$result$addressMatches
list()
$result
$result$input
$result$input$address
$result$input$address$address
[1] "11 Wall Street, New York, NY 10005"
$result$addressMatches[[1]]$coordinates
$result$addressMatches[[1]]$coordinates$x
[1] -74.01073
$result$addressMatches[[1]]$coordinates$y
[1] 40.70714
型
对于第一个地址,滨江Dr,Apple Valley,CA,92307,它没有从网站中提取经度和纬度,我需要将NA分配给“longitude”和“latitude”列。对于第二个地址,$result$addressMatches1$coordinates提供经度和纬度信息。但是,我不知道如何从geocodes中提取相应的信息,因为它返回NULL。
print(geocodes)
[[1]]
NULL
[[2]]
NULL
型
我不知道该怎么办。非常感谢你的帮助我的目标是得到一个有三列的 Dataframe ,第一列是full_address,第二列是longitude,第三列是latitude。
2条答案
按热度按时间5m1hhzi41#
前面:
data$result$addressMatches
是一个list
,每个元素可能有coordinates
,你可能会做类似data$result$addressMatches[[1]]$coordinates$x
的事情。如果保证返回中总是只有一个x/y,那么你可以这样做:
字符串
但是,如果你可以得到两个或更多,那么你需要返回一个
list
或data.frame
,你需要做更多的工作:型
使用第一个假设,那么
型
tpgth1q72#
tidygeocoder包非常适合这一点。它支持多种地理编码服务,包括您正在使用的美国人口普查服务。
字符串
默认情况下,
tidycensus
使用OSM地理编码器命名。它为您的两个示例地址查找坐标。型
尝试人口普查地理编码器,我们看到这里的第一个地址也没有产生任何坐标。
型