从R中的经度和纬度获取国家和州/省名称的有效方法?

问题描述 投票:0回答:2

我有一个巨大的数据框(大约100万个数据点),其中包含经度和纬度信息。我想获取国家和州/省的信息。然而,代码并没有我想象的那么高效

下面是我的代码:

示例数据框:

df = data.frame(
     ID =c(A00001,A00002,A00003,A00004,A00005)
     longitude = c(-98.84295,-91.11844,-75.91037,-71.00733,-92.29651)
     latitude= c(43.98332,40.17851,39.26118,46.70087,45.49510)
     )

第一:读取地理信息

library(sp)
library(rgdal)
library(dplyr)

countries_map<- readOGR(dsn="Country", layer="ne_10m_admin_0_countries")
states_map <- readOGR(dsn="States", layer="ne_10m_admin_1_states_provinces")

然后,构建一个函数并将结果导出到指定的数据框

geo_to_location <-function(lat,long){
  #First the coordinates are transformed to spatialpoints
  points<-SpatialPoints(data.frame(long,lat))

  #Creating a projection of the coordinates on the map of countries
  proj4string(points) <- proj4string(countries_map)
  country<-as.character(over(points, countries_map)$NAME)
  
  #The same for state/province
  proj4string(points) <- proj4string(states_map)
  state<-as.character(over(points, states_map)$name)  
  
  dplyr::bind_rows(setNames(c(country,state), c("Country", "State")))
}

df = df  %>% dplyr::bind_cols(purrr::map2_dfr(.$latitude, .$longitude, geo_to_location ))

此方法有效,但 400,000 点已经需要大约 30 分钟才能完成。我有超过 400k 点需要处理。有没有更有效的方法来处理这个问题?

或者,没有更有效的方法来处理这项工作?

提前谢谢大家。

r geolocation
2个回答
1
投票

感谢@starja,他建议对函数进行向量化并使用 data.table 来替换 dplry。

我使用前 500 行进行测试,发现周转时间存在巨大差异。

以下是修改后的代码:

geo_to_location <-function(lat,long){
  #First the coordinates are transformed to spatialpoints
  points<-SpatialPoints(data.frame(long,lat))
  #Creating a projection of the coordinates on the map of countries
  proj4string(points) <- proj4string(countries_map)
  country<-as.character(over(points, countries_map)$NAME)
  
  #The same for state
  proj4string(points) <- proj4string(states_map)
  state<-as.character(over(points, states_map)$name)  
  
  return(list(country = country, state = state )) 
}

df = as.data.table(df) 
df[, c("Country","State_Province") := geo_to_location (latitude, longitude)] 
df = as.data.frame(df)

原方法处理500个点大约需要3.194分钟。新方法大约花费了 0.651 秒。如果还有其他更有效的方法来处理这个问题,请告诉我,我可以学习更高级的技能。

再次感谢您的建议和帮助。


0
投票

我也想弄清楚同样的事情。我有一个巨大的数据库,包含经纬度(和地理位置),但没有位置。我需要国家、州(美国)和县(美国)。解决方案非常简单。使用maps包中的map.where()函数。这对我有用。例如对于国家来说就是:

map.where(database = "world", df$lon, df$lat).

对于美国,只需为“世界”输入“州”或“县”即可。

HRK

© www.soinside.com 2019 - 2024. All rights reserved.