如何快速识别点(纬度和经度)是不是在一个国家/地区内?

Posted

技术标签:

【中文标题】如何快速识别点(纬度和经度)是不是在一个国家/地区内?【英文标题】:How to quickly identify if points (latitude & longitude) are within one country or not?如何快速识别点(纬度和经度)是否在一个国家/地区内? 【发布时间】:2017-06-22 08:44:36 【问题描述】:

这是按经度和纬度划分的位置数据框。

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"

其实,不能用这么长的时间来执行代码。有没有什么快速的方法可以让判断或者其他更好的功能或者包更高效?

【问题讨论】:

你在哪里使用最新版的地图包?在上次更新 v3.2(2017 年 6 月 8 日)中,map.where() 的速度大大提高了。 【参考方案1】:

在整个点列表上运行一次 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 库安装在响应时间比本地驱动器长的网络驱动器上,这一点最为明显。

【讨论】:

真的非常快。谢谢!

以上是关于如何快速识别点(纬度和经度)是不是在一个国家/地区内?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pygeoip从国家、地区代码获取纬度、经度

给定经度和纬度,如何找到国家

将经度和纬度与 R 中的国家/地区匹配

在谷歌地图 api v3 中将地区、城市、州、国家/地区转换为纬度和经度?

如何从纬度和经度获取国家名称

NodeJS 按纬度/经度查找国家