2017-06-22 123 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

相关问题