计算大型数据集的经度和纬度之间的距离

时间:2018-03-22 19:41:37

标签: r

我有一个大型数据集(df)(有300,000所房子),我有每个观察的经度和纬度。下面(df1)是数据的前10个观测值:

df1 <- read.table(sep=",", col.names=c("lat", "lon"), text="
53.543526,-8.047727
51.88029, -9.583830
52.06056, -9.488551
51.87087, -9.577604
51.89530, -8.454321
51.95688, -7.851760
53.37621, -6.392430
53.37719, -6.234660
51.88029, -9.583830
51.88145, -9.600894")

首先,我尝试使用以下(Calculate distance between two long lat coordinates in a dataframe)将我的数据集(所有300,000个观测值)与一个数据点进行比较:

centre = c(53.543526, -8.089727)
distHaversine(df, centre)
# and
distm(df, centre, fun = distHaversine)

但我一直收到错误:

  

.pointsToMatrix(x)中的错误:纬度&lt; -90

我有两个问题:

  1. 如何计算数据框“df”中300,000个观测值与“中心”数据点之间的距离

  2. 假设我想计算每个房子到学校列表的距离(较小但较大的数据集 - 数百个)(例如下面的df2)。如何计算每所学校与每所学校的距离,然后保持最小距离?

  3. 示例学校数据集:

    df2 <- read.table(sep=",", col.names=c("lat", "lon"), text="
    53.38271, -6.437433
    53.34874, -6.131537
    53.34449, -6.266856
    53.34424, -6.267444
    53.34648, -6.261414
    53.64333, -8.208663")
    

    提前致谢!

3 个答案:

答案 0 :(得分:1)

使用distm包中的geosphere函数,它计算两个矩阵之间每个点之间的距离,其中每一行代表df1个对象,列代表df2个对象:

library(geosphere)
distm(df1, df2)

            [,1]      [,2]       [,3]       [,4]       [,5]      [,6]
 [1,] 178968.962 213003.58 198172.550 198110.991 198746.488  20923.34
 [2,] 385376.082 414721.59 400788.464 400717.802 401428.071 246442.51
 [3,] 367573.615 397518.53 383398.252 383327.609 384038.877 224390.48
 [4,] 385203.033 414495.46 400578.857 400508.198 401218.340 246836.89
 [5,] 276963.269 302892.13 290037.267 289967.750 290660.977 194456.76
 [6,] 221966.904 244628.53 232857.426 232790.237 233455.843 190049.84
 [7,]   5028.478  29011.20  14323.587  14267.385  14857.496 203015.38
 [8,]  22432.536  11830.79   5076.573   5141.969   4505.897 220278.46
 [9,] 385376.082 414721.59 400788.464 400717.802 401428.071 246442.51
[10,] 387024.885 416408.72 402463.993 402393.330 403103.685 247508.26

至于你提到的错误,我在使用distm

时没有收到任何错误
distm(df1, centre, fun = distHaversine)
            [,1]
 [1,]   4675.419
 [2,] 247250.726
 [3,] 225526.648
 [4,] 247555.321
 [5,] 186051.181
 [6,] 176912.553
 [7,] 189843.467
 [8,] 207320.670
 [9,] 247250.726
[10,] 248435.392

答案 1 :(得分:1)

我有类似的问题。问题是经度和纬度是字符列。将它们转换为数字列可以解决该问题。

答案 2 :(得分:0)

我认为你的纬度坐标不好。你的错误说有一个纬度&lt; -90,这是不可能的。最低纬度为-90。做这样的事情来检查坏点:

badPoints <- which(df1$lat < -90)
print(df1[badPoints,])

运行此命令以删除坏点:

goodDf1 <- df1[(df1$lat >= -90 & df1$lat <= 90),]