使用R,如何计算从一点到线的距离?

Posted

技术标签:

【中文标题】使用R,如何计算从一点到线的距离?【英文标题】:Using R, how to calculate the distance from one point to a line? 【发布时间】:2016-05-13 15:40:53 【问题描述】:

假设我们有三个点,a,b,c。 b 和 c 连成一条线。如何使用R计算从a到这条线的距离?有什么功能吗?

【问题讨论】:

***.com/questions/6910814/… 可能有答案,尤其是第二个答案 您是指从bc 的“线段”,还是穿过bc 的无限线? 谢谢大家。我的意思是在二维情况下。点 b 和 c 可以确定一条线 l。然后是 a 到 l 的距离。 【参考方案1】:

必须区分我们是在处理二维情况还是三维情况。

二维案例

如果问题是二维的,点abc 的位置可以由代表点xy 坐标的数字对来定义。 下面的函数可以用来计算dabc两点定义的直线之间的距离:

dist2d <- function(a,b,c) 
 v1 <- b - c
 v2 <- a - b
 m <- cbind(v1,v2)
 d <- abs(det(m))/sqrt(sum(v1*v1))
 

这是一个展示如何应用该函数的示例:

## two-dimensional case:
a2 <- c(0,2)
b2 <- c(2,0)
c2 <- c(1,3)
d2 <- dist2d(a2,b2,c2) # distance of point a from line (b,c) in 2D
#> d2
#[1] 1.264911

3D案例

在三个维度上,问题稍微复杂一些。我们可以使用以下两个函数:

dist3d <- function(a,b,c) 
  v1 <- b - c
  v2 <- a - b      
  v3 <- cross3d_prod(v1,v2)
  area <- sqrt(sum(v3*v3))/2
  d <- 2*area/sqrt(sum(v1*v1))


cross3d_prod <- function(v1,v2)
  v3 <- vector()
  v3[1] <- v1[2]*v2[3]-v1[3]*v2[2]
  v3[2] <- v1[3]*v2[1]-v1[1]*v2[3]
  v3[3] <- v1[1]*v2[2]-v1[2]*v2[1]
  return(v3)

计算距离的主函数可以像前面例子一样在二维中调用,唯一的区别是现在这些点由三个坐标定义,分别代表xy和@987654337 @,如下例所示:

## three-dimensional case:
a3 <- c(0,0,2)
b3 <- c(1,0,0) 
c3 <- c(2,3,1)
d3 <- dist3d(a3,b3,c3) # distance of point a from line (b,c) in 3D
#> d3
#[1] 2.215647

此答案中使用的方程式在各种教科书中都有描述,并且可以找到,例如 here 和 here。

【讨论】:

有没有一种简单的方法可以获取该点最近的直线上的点的坐标?

以上是关于使用R,如何计算从一点到线的距离?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 R 的 OSM 计算从某个点到 POI 的距离

arcgis怎么批量计算两点之间的距离

如何计算给定点到最近道路的距离?

如何获取从固定点到特定距离的坐标邻居

如何计算点到原点的距离?

三维坐标点到直线的距离公式是啥?