计算测量点和目标线之间的距离
Posted
技术标签:
【中文标题】计算测量点和目标线之间的距离【英文标题】:Calculating the distance between measured points and target line 【发布时间】:2019-03-20 11:27:00 【问题描述】:我有两种地理坐标。 一个是目标点,另一个是 GPS 测量点。
我可以像下图那样画线和点:
sample image
这些黑点是测量点,白点是目标点。
所以,我想计算测量点与目标点形成的线之间的距离。但重要的是,这两点都包括倒退点。我的意思是它就像一条返回的路径。
我读了这篇文章——Calculating the distance between a point and a virtual line of two lat/lngs,但我的坐标包含了很多点。而且点的间隔是不固定的。
因此,我认为我应该使用类似的 for 循环。 我想知道点和线之间的距离。
如何计算距离?
【问题讨论】:
如果你想要直线和点之间的最短距离,取垂直距离。 是的,我想要最短距离。但是两个目标点之间有很多测量点。 【参考方案1】:以下是我构建算法的方式。我假设目标点和测量点是“线性的”(我不会在任何时候倒退)。
第 1 步:定义虚拟细分
您从Calculating the distance between a point and a virtual line of two lat/lngs 知道如何确定点到虚拟线的距离。因此,您可以将目标点列表视为一系列虚拟线。假设您的目标点是在 x,y 对 targetCoords
的数组中提供的,如果您有 n = len(targetCoords)
目标点,那么您将拥有 n-1
虚拟段。
对于目标点中的每个点,确定它与下一个目标点的距离。您可以通过简单的列表理解来做到这一点:
targetPointDistances = [(Dist(Coords2,Coords1) for Coords1, Coords2 in zip(targetCoords[:-1], targetCoords[1:])]
“Dist”是用户定义的函数,用于确定坐标对之间的距离。 This question 提供了一个如何轻松实现此功能的示例,而this question 提供了更精确的 Vincenty 公式的详细信息。
第 2 步:确定当前虚拟段
您想开始查看每个测量点,并比较它与虚拟线段的距离。对于每个点,您都需要检查是否仍在将其与正确的虚拟段进行比较。
因此,在确定每次距离之前,请检查您是否处于正确的路段。让我们试试这个:
targetSegment = 0
for point in measuredPoints:
while Dist(point, targetCoords[targetSegment+2]) < targetPointDistances[targetSegment+1]:
targetSegment += 1
对于每个点,我正在检查它与下一段终点的距离是否小于当前段的长度。如果这是真的,我开始将它与下一个虚拟段进行比较。 (额外的功劳:在任何情况下这是行不通的,或者不是最理想的吗?)
在您的示例图像中,这会在第一段中留下前 4 个测量点。第五个测量点距离第三个目标点比第二个目标点距离第三个目标点更近,所以我们前进到下一个虚拟段。
第 3 步:计算与虚拟线的距离
这似乎很简单——你已经链接到这个了!
只需使用targetCoords[targetSegment]
和targetCoords[targetSegment+1]
作为虚拟线的起点和终点。这可以是第 2 步中 for 循环的一部分!
【讨论】:
非常感谢您的评论!!我无法理解的是第 1 步。“Dist(Coords2,Coords1)”是用户定义的功能吗?而且,我是一个非常新手,所以我还没有清楚地理解列表理解。你能告诉我更多关于第 1 步的信息吗? @yyykkkyyy 是的,我创建了一个用户定义的函数。我已经用一个链接 (***.com/questions/5228383/…) 更新了这个问题,在这里应该会有所帮助。 感谢您的回复。我可以理解 Dist 函数。我有另一个问题。所有坐标都是地理坐标。那么当我计算距离时,我应该使用 pyproj 吗? 好问题!这取决于您可用的处理能力、您覆盖的距离以及您需要的精度。如果您正在查看城市街区周围的距离并且不需要高精度,则可以进行简单的距离确定(勾股定理)。您可能想了解更多关于文森提公式 (gis.stackexchange.com/questions/84885/…) 哦,对不起,我明白了!以上是关于计算测量点和目标线之间的距离的主要内容,如果未能解决你的问题,请参考以下文章