计算两点之间的距离,但仅限于一对子集

时间:2017-10-25 09:44:41

标签: r geospatial

我正在尝试计算坐标对之间的距离,使用(例如)rgeos包中的gDistance函数相当容易。然而,我在解决以下问题时遇到了问题:在我的数据框中,我有关于不同类型的兴趣点(比如咖啡馆,快餐店和酒吧)的信息,我只对两个POI之间的距离感兴趣不同类型。

这就是我的数据框:

    lat <- c(50.639342, 50.623727, 50.578924, 50.786729)
    lon <- c(10.236543, 10.1896532, 10.587272, 10.776234)
    type <- c("A", "A", "B", "C")
    df <- data.frame(lat, lon, type)

我可以通过将df转换为空间对象来计算每对之间的距离...

    if (!require(sp)) install.packages('sp')
    library(sp)
    sp.data <- df
    coordinates(sp.data) <- ~lat+lon

...并使用gDistance函数获得成对的距离矩阵。

    if (!require(rgeos)) install.packages('rgeos')
    library(rgeos)
    distance <- gDistance(sp.data, byid=T)
    distance
    1          2         3         4
    1 0.00000000 0.04942147 0.3558949 0.5594545
    2 0.04942147 0.00000000 0.4001350 0.6088076
    3 0.35589488 0.40013500 0.0000000 0.2808728
    4 0.55945447 0.60880759 0.2808728 0.0000000

接下来我要做的是分析不同类型的两点之间的距离。例如,我对咖啡店最近的邻居感兴趣,咖啡店本身就不是咖啡店。我的问题是我不知道如何使用成对数据。理想情况下,我会使用原始数据框中的type列为所有包含相同类型的点之间距离的单元分配NA,但我无法弄清楚如何执行此操作。

1 个答案:

答案 0 :(得分:1)

您可以使用?outer,试试这个:

lat <- c(50.639342, 50.623727, 50.578924, 50.786729)
lon <- c(10.236543, 10.1896532, 10.587272, 10.776234)
type <- c("A", "A", "B", "C")
df <- data.frame(lat, lon, type)
library(sp)
sp.data <- df
coordinates(sp.data) <- ~lat+lon
library(rgeos)
distance <- gDistance(sp.data, byid=T)
distance
sp.data$type # we will use columns from the original data frame as you want

# solution
colnames(distance) <- sp.data$type
rownames(distance) <- sp.data$type
distance[outer(rownames(distance), colnames(distance), "==")] <- NA
distance