(大圆)路径上的项目位置


9

我已经在这个SE网站上搜索了好几个小时,但我仍在努力寻找解决问题的方法。我的目标是给定OSM中的一种方式和我的位置(纬度/经度坐标),我想以此方式找到最近的位置(纬度/经度坐标)。该点可以在路线上的任何位置,而不仅限于用于定义路线的点。

所以我在考虑以下算法:

  1. 单独的路径分成单独的边,每个边仅连接两个点。
  2. 选择最近的边。
  3. 将我的位置投射到该边缘。

现在有很多关于计算位置和路径之间距离的问题:

还有一个非常类似的问题,我无法正确计算或验证该计算:

Math博士也提供了一些有关该主题的信息。但是,我似乎找不到在第3步中计算位置的算法。由于我已经有一段时间没有接触(矢量)代数了,所以我不太理解这些答案中的逻辑。

有人可以展示一种算法来做到这一点吗?我可以用任何合理的编程语言来解决。


1
由于这似乎对您“拒绝”其他问题至关重要,因此请详细说明“将我的位置投射到该边缘”。投影可能不在边缘上。我认为其他问题都可以解决这个问题。(为研究起见,做得很好,请顺便说一句。)
Martin F


@MartinF这个问题计算的是从点到直线的距离,但不是直线上最接近的点。
bouke 2015年

这里一个解决方案,gis.stackexchange.com/a/23500/3195虽然它也许很难理解。
Martin F

啊,是的,谢谢,我已经更新了参考号。3.特定问题中的“解决方案”链接到对问题领域的一般解释。尽管这对于有充分基础的数学家来说已经足够了,但我不太了解该论文中的数学。
bouke

Answers:


7

使用地球的球形模型可能会提供足够的精度,并导致简单的快速计算。

将所有坐标转换为以地球为中心的(3D)直角坐标。例如,公式

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

会做。(它使用距离测量,其中地球半径为一个单位,这很方便。)

写X0 =(x0,y0,z0)作为起点,X1 =(x1,y1,z1)作为终点,定义了大圆(假设X0与X1不同,并且两者并不完全相反),令U为X0和X1的标准化叉积。分两个步骤进行计算:

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

V的长度是

|V| = sqrt(xv^2 + yv^2 + zv^2)

归一化将V拉伸到单位长度:

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

任何点X =(x,y,z)与该大圆的平面之间的定向3D距离只是X与Z的点积,由下式给出

d = X * U = x*xu + y*yu + z*zu

就地球表面上的距离而言,最接近的点是最接近平面的点;因此,它的绝对值最小d

数字

该图显示了一个大圆(黑色),该圆由球上的两个白点和2000个随机点确定,该点根据它们与该大圆的平面的绝对3D距离进行着色和着色。即| d |。

找到最接近的点后,首先将其投影到大圆的平面(在3D中),然后将其径向向外扩展到地球表面,然后将其投影到大圆上。投影仅减去d * U:

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

径向投影只是简单地将X'重新归一化,就像将V重新归一化为U一样:

X'' = X' / |X'|.

(如果| X'| = 0,这将是有问题的,当最接近的点是大圆的极点之一时会发生。如果可能发生,请在代码中包含此条件的测试,然后单独进行处理,使用d的符号来标识哪个极点。)

如果需要,可以使用常用公式将X''的坐标转换回(lat,lon)。


一个问题。考虑到一种非常不寻常的情况,从精度的角度来看,我们可以选择任意一个X1和X0(在大圆圈上),最好将X1和X0选得相近或相距远一点(同样,前提是X0与X1和X1不同)。两者不是完全相反的)?
user189035 '16

1
@ user189035将它们分开90度。当它们非常接近时,其叉积在数值上不确定:减法有很多抵消,从而导致有效数字的损失。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.