使用st_distance计算到特定点的最近距离

问题描述 投票:0回答:1

我才刚开始使用R和空间分析,所以我缺少很多基础知识!

我的数据包含学校地址。我想为每所学校计算到最近学校的距离。我的数据还包含有关学校“特殊功能”的信息。此变量(sps)编码为1(“具有特殊功能”)或0(“无特殊功能”)。我想计算从“具有特殊功能”的学校到“无特殊功能”的学校的距离。这是我的数据的样子:

head(data01)
 id     lon      lat         sps
1 11725  6.932546 50.38269    0
2 11739  6.975160 50.48649    1
3 26883  6.987575 50.50857    0

到目前为止,我设法使用st_distance命令和以下代码来计算到最近学校的距离。不幸的是,在使用此代码时,在某些情况下,最近的学校都具有“特殊功能”。我只想要1-> 0或0-> 1的距离,而不是1-> 1!

my_sf <- st_as_sf(data01,
                  coords = c("lon", "lat"), # x, y (order matters)
                  crs = 4326)

dist.mat <- st_distance(my_sf) # Great Circle distance since in lat/lon
# Number within 1.5km: Subtract 1 to exclude the point itself
num.1500 <- apply(dist.mat, 1, function(x) {
  sum(x < 1500) - 1
})

# Calculate nearest distance
nn.dist <- apply(dist.mat, 1, function(x) {
  return(sort(x, partial = 2)[2])
})
# Get index for nearest distance
nn.index <- apply(dist.mat, 1, function(x) { order(x, decreasing=F)[2] })

n.data <- data01
colnames(n.data)[1] <- "neighbor"
colnames(n.data)[2:ncol(n.data)] <- 
  paste0("n.", colnames(n.data)[2:ncol(n.data)])
mydata2 <- data.frame(data01,
                      n.data[nn.index, ],
                      n.distance = nn.dist,
                      radius1500 = num.1500)
rownames(mydata2) <- seq(nrow(mydata2))

感谢您的帮助!

欢呼声,k

r geospatial distance sf
1个回答
0
投票

(毕达哥拉斯)上两点之间距离的公式:

sqrt( (x1-x2)**2 + (y1-y2)**2)

我们可以创建一个函数来对其进行计算(您可以为library(magrittr)运算符调用%>%:]

dist = function(x1,x2,y1,y2){ 
   sqrt( (x1-x2)**2 + (y1-y2)**2) %>% return()
}

创建条件变量(只是为了使其看起来更好-如果需要,可以内联它)

condition = data01$sps %>% as.logical()

现在我们可以使用lapply

    lapply(1:nrow(data01), function(x){
                            if(condition[x]){
                                dist(data01$lon[!condition],
                                     data01$lon[x],
                                     data01$lat[!condition],
                                     data01$lat[x])
                            }else{
                                dist(data01$lon[condition],
                                     data01$lon[x],
                                     data01$lat[condition],
                                     data01$lat[x])
                            }
     }) %>% do.call()

该代码未经测试,但是它应该产生一个向量列表,每个向量都应给出具有相反sps值的学校的距离。第一个向量将对应于第一行,等等。此外,该解决方案还保留了邻居的顺序,因此向量中的第一个距离将始终对应于相反sps组中的第一个邻居。

© www.soinside.com 2019 - 2024. All rights reserved.