Самый быстрый способ определения СТРАНЫ по миллионам GPS-координат [R] - PullRequest
0 голосов
/ 21 октября 2018

У меня есть миллионы GPS-координат и я хочу быстро добавить столбец страны с координатами.

Мой текущий метод работает, но он очень медленный:

library(data.table)

#REPRODUCE DATA
data <- data.table(latitude=sample(seq(47,52,by=0.001), 1000000, replace = TRUE),
                   longitude=sample(seq(8,23,by=0.001), 1000000, replace = TRUE))

#REQUIRED PACKAGES
if (!require("sp")) install.packages("sp")
if (!require("rworldmap")) install.packages("rworldmap")
if (!require("sf")) install.packages("sf")
library(sp)
library(rworldmap)
library(sf)

#CURRENT SLOW FUNCTION
coords2country = function(points,latcol,loncol){  
  countriesSP <- getMap(resolution='low')
  pointsSP <- st_as_sf(points,coords=c(loncol,latcol),crs=4326)
  pointsSP<- as(pointsSP,"Spatial")
  # use 'over' to get indices of the Polygons object containing each point 
  indices = over(pointsSP, countriesSP)
  # return the ADMIN names of each country
  indices$ADMIN  
  #indices$ISO3 # returns the ISO3 code 
  #indices$continent   # returns the continent (6 continent model)
  #indices$REGION   # returns the continent (7 continent model)
}

#SLOW!
> system.time(data[,country:=coords2country(data,"latitude","longitude"),])
   user  system elapsed 
121.293   7.849 130.226 

Есть ли более быстрый / лучший способ сделать это?Спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

Есть два похожих вопроса.Они в моих комментариях выше.Вопросы спрашивают, как получить названия стран из координат.Здесь ОП спрашивает, какой способ быстрее выполнить задачу.Исходя из постов, у нас есть три варианта.Одним из них является использование пользовательской функции в этом вопросе.Другой способ - использовать пакет geonames.Другой - использовать map.where() в пакете map.Второй вариант требует небольшой настройки.Итак, я только что проверил map.where().Ниже приводится результат.Как сказал ОП, эта функция должна работать быстрее.

library(maps)
set.seed(111)
data <- data.table(latitude=sample(seq(47,52,by=0.001), 1000000, replace = TRUE),
                   longitude=sample(seq(8,23,by=0.001), 1000000, replace = TRUE))

system.time(data[, country := map.where(x = longitude, y = latitude)])

#   user  system elapsed 
#   7.20    0.05    7.29 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...