R代码计算多个经纬度对之间的距离并提取最近的对

Posted

技术标签:

【中文标题】R代码计算多个经纬度对之间的距离并提取最近的对【英文标题】:R code to calculate distance between multiple latitude-longitude pairs and extract the closest pairs 【发布时间】:2020-09-04 11:22:44 【问题描述】:

我有两个格式如下的 csv 文件

文件1.csv

Sr      Lat,Long
1       52.361176,4.899779
2       52.34061,4.871195
3       52.374749,4.893847
4       52.356624,4.912281
5       52.374026,4.883685
6       52.369956,4.919778
7       52.370895,4.8703
8       52.390454,4.915024
9       52.378576,4.900253
10      52.378372,4.896219
11      52.380056,4.899697
12      52.383744,4.875805
13      52.369981,4.881528
14      52.375954,4.904786
15      52.344417,4.891211
......1000 columns

文件2.csv

neighbourhood   LAT,LONG
Bijlmer-Centrum 52.3135175, 4.9547795
Bijlmer-Oost    52.3179787, 4.9754974
Bos en Lommer   52.3807577, 4.8545966
Buitenveldert - Zuidas  52.3382516, 4.872921499999999
Centrum-Oost    51.208107, 4.4249047
Centrum-West    52.0607927, 4.4832451
De Aker - Nieuw Sloten  52.3447535, 4.811520799999999
De Baarsjes - Oud-West  52.367746, 4.854258
De Pijp - Rivierenbuurt 52.3560276, 4.9021384
........500columns

我想计算两个文件之间的最短距离对(可能按降序排列)。此外,File1 中的每一对都应对应于 File2 中最近的位置,即不应遗漏 File1 中的任何条目。例如,考虑 file1 52.361176,4.899779 中的第一个 lat-long 对,我需要这对与 File2 中的所有其他对的距离,同样对 File1 中的所有其他条目执行此操作。这是我需要使用的公式(在 python 中)

def distance(lat1, lon1, lat2, lon2):
    p = pi/180
    a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
    return 12742 * asin(sqrt(a))

我是 R 新手,因此请本论坛上的专家提供帮助。

编辑:File1 和 File2 包含的条目比这里提到的要多,这只是一个 sn-p。原始文件分别包含超过 1000 和 500 列。

【问题讨论】:

你可以看看geosphere::distHaversine 在过去的几年里,我在 SO 上多次看到过这样的问题。你看过他们的答案吗? 【参考方案1】:

这是一个使用sf 的空间连接... data.table::fread() 用于创建示例数据。

#make spatial objects
sf1 <- file1 %>% sf::st_as_sf( coords = c("Long", "Lat"), crs = 4326 )
sf2 <- file2 %>% sf::st_as_sf( coords = c("LONG", "LAT"), crs = 4326 )

st_join( sf1, sf2, join = st_nearest_feature )
# 
# Simple feature collection with 15 features and 3 fields
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 4.8703 ymin: 52.34061 xmax: 4.919778 ymax: 52.39045
# geographic CRS: WGS 84
# First 10 features:
#    Sr         neighbourhood                  geometry
# 1   1  De Pijp - Rivierenbuurt POINT (4.899779 52.36118)
# 2   2  Buitenveldert-Zuidas POINT (4.871195 52.34061)
# 3   3  De Pijp - Rivierenbuurt POINT (4.893847 52.37475)
# 4   4  De Pijp - Rivierenbuurt POINT (4.912281 52.35662)
# 5   5  De Pijp - Rivierenbuurt POINT (4.883685 52.37403)
# 6   6  De Pijp - Rivierenbuurt POINT (4.919778 52.36996)
# 7   7  De Baarsjes - Oud-West   POINT (4.8703 52.37089)
# 8   8  De Pijp - Rivierenbuurt POINT (4.915024 52.39045)
# 9   9  De Pijp - Rivierenbuurt POINT (4.900253 52.37858)
# 10 10  De Pijp - Rivierenbuurt POINT (4.896219 52.37837)

使用的样本数据

library(sf)
library(data.table)
file1 <- data.table::fread("
Sr   Lat Long
1    52.361176 4.899779
2    52.34061 4.871195
3    52.374749 4.893847
4    52.356624 4.912281
5    52.374026 4.883685
6    52.369956 4.919778
7    52.370895 4.8703
8    52.390454 4.915024
9    52.378576 4.900253
10   52.378372 4.896219
11   52.380056 4.899697
12   52.383744 4.875805
13   52.369981 4.881528
14   52.375954 4.904786
15   52.344417 4.891211")

file2 <- data.table::fread('                            neighbourhood   LAT LONG
"Bijlmer-Centrum" 52.3135175 4.9547795
"Bijlmer-Oost"    52.3179787 4.9754974
"Bos en Lommer"   52.3807577 4.8545966
"Buitenveldert-Zuidas"  52.3382516 4.872921499999999
"Centrum-Oost"    51.208107 4.4249047
"Centrum-West"    52.0607927 4.4832451
"De Aker - Nieuw Sloten"  52.3447535 4.811520799999999
"De Baarsjes - Oud-West"  52.367746 4.854258
"De Pijp - Rivierenbuurt" 52.3560276 4.9021384')

【讨论】:

感谢您的帮助,不过我有几个问题。 1. 除了显示前 10 个特征,我可以对所有配对进行总结吗? 2. 也可以计算距离吗? 3. 与半正弦公式相比,这种方法的准确度如何? 你是否运行过所用函数和包的代码和帮助文件? 是的,我做到了,但不知道如何显示所有而不是前 10 个功能 你应该将结果存储到一个对象中...mything &lt;- .....

以上是关于R代码计算多个经纬度对之间的距离并提取最近的对的主要内容,如果未能解决你的问题,请参考以下文章

如何计算经纬度之间的距离

如何计算经纬度之间的距离?

如何计算经纬度之间的距离?

如何计算经纬度之间的距离? 具体这样计算经纬度间距

经纬度之间距离怎么算?

计算两个经纬度之间的距离