许多位置的反向地理编码搜索(国家名称),当国家缺失时输出到数据框问题

Reverse geocode search (country names) for many locations, output to dataframe issues when country is missing

我正在使用 R 中的 geonames 包进行反向地理编码搜索 (GNcountryCode) 以找到离我的输入最近的国家/地区。我的输入不是很精确,位于陆地附近的水中。 geonames 允许在输入位置的缓冲区 (km) 内进行搜索。

我试图使用 mapply 来加快从一长串输入位置中检索国家名称。但是,缓冲区大小的限制仍然使某些输入位置没有国家/地区。为了允许 mapply 继续 运行,我使用 tryCatch 来防止 mapply 停止。

但是,这会导致在整个列表列表(下面的输出)中出现非列表条目 ("Error")。因此,在尝试使用 data.table::rbindlist 时出现以下错误:"Item n of list input is not a data.frame, data.table or list"

我怎样才能循环或矢量化 GNcountryCode 以获得最接近输入位置的国家/地区名称,然后将此名称添加回 (cbind) 到原始数据框(理解某些位置不会匹配到一个国家)?

library(geonames)# requires a username for some functionality

Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
# df <- cbind.data.frame(Latitude, Longitude)

MyFun <- function(x,y) {
  MyRes <- tryCatch(GNcountryCode(lat=x, lng=y, radius=250), error = function(e) paste("Error"))
  #print(MyRes)
  return(MyRes)
}


MyResult <- mapply(MyFun, Latitude, Longitude)

data.table::rbindlist(MyResult, fill = TRUE)
#cbind(df, data.table::rbindlist(MyResult, fill = TRUE))

#Ouput
$`32.75`
$`32.75`$`languages`
[1] "pt-PT,mwl"

$`32.75`$distance
[1] "1.96436"

$`32.75`$countryCode
[1] "PT"

$`32.75`$countryName
[1] "Portuguese Republic"


$`33.75`
[1] "Error"

$`33.75`
[1] "Error"

$`34.25`
[1] "Error"

$`34.25`
[1] "Error"

$`36.75`
$`36.75`$`languages`
[1] "pt-PT,mwl"

$`36.75`$distance
[1] "22.63538"

$`36.75`$countryCode
[1] "PT"

$`36.75`$countryName
[1] "Portuguese Republic"

将错误参数设置为 return NA(您可能还想从有效结果的 return 中提取国家/地区名称)...

library(geonames)# requires a username for some functionality

Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
df <- cbind.data.frame(Latitude, Longitude)

MyFun <- function(x,y) {
  tryCatch(GNcountryCode(lat = x, lng = y, radius = 250)$countryName, error = function(e) NA_character_)
}

df$countryname <- mapply(MyFun, Latitude, Longitude)
df

#   Latitude Longitude         countryname
# 1    32.75    -17.25 Portuguese Republic
# 2    33.75    -52.25                <NA>
# 3    33.75    -51.75                <NA>
# 4    34.25    -52.25                <NA>
# 5    34.25    -51.75                <NA>
# 6    36.75    -25.25 Portuguese Republic