2017-06-22 120 views
0

這是緯度爲經度&的位置數據框。如何快速確定點(緯度和經度)是否在一個國家內?

library(data.table) 
a1=seq(10,60,1);a2=seq(70,140,1) 
a3=lapply(a1,function(i){res=data.table(i,a2)}) 
pretb=rbindlist(a3,fill=T); 

我想通過下面的代碼來確認中國範圍內的每一點。運行後找到
,總共用了近40分鐘纔得到結果。

library(maps) 
> Sys.time() 
[1] "2017-06-23 12:54:12 CST" 
> bb=apply(pretb,1,function(ce){ 
+  aa=map.where(database="world", ce[3], ce[2]) 
+ }) 
> bb 

> Sys.time() 
[1] "2017-06-23 13:35:56 CST" 

實際上,不能用這麼長的時間來執行代碼。有沒有什麼快速的方法來獲得判斷或其他更好的功能或包裝效率更高?

+0

你在哪裏使用最新版本的地圖包?在上一次更新v3.2(2017年6月8日)中,map.where()變得相當快。 –

回答

2

在整個點列表上運行map.where()一次,而不是在每個點上單獨運行(和我在評論中所說的,在地圖的v3.2中代碼是更有效率,有時快100倍)。只是通過矢量與所述列表的所有緯度(y)和經度(X):

z <- map.where(database="world", x=pretb$a2, y=pretb$i) 

注意到約1秒至運行。

如果您無法更新到的「地圖」的最新版本中,您還可以通過世界地圖加載到內存中(而不是從磁盤中讀取)加快代碼很多:

myworld <- map("world", fill=TRUE, plot=FALSE) 
z <- map.where(myworld, y=pretb$i, x=pretb$a2) 

map.where()在3.2之前在讀取存儲在磁盤上的地圖數據中的各種多邊形時非常低效。如果您的R庫安裝在比本地驅動器響應時間更長的網絡驅動器上,這一點最爲明顯。

+0

真的非常快。謝謝! – Susie

相關問題