计算测量点与目标线之间的距离

Calculating the distance between measured points and target line

我有两种地理坐标。
一个是目标点,另一个是GPS测量点。

我可以像下图那样画线和点:

sample image

这些黑点是测量点,白点是目标点。

所以,我想计算测量点与目标点连成的线之间的距离。但重要的是,这两个点都包括倒退点。我的意思是它就像一条返回路径。

我读了这篇文章 -- Calculating the distance between a point and a virtual line of two lat/lngs 但是我的坐标包含了很多点。而且点的间隔不固定

因此,我认为我应该使用 for 循环之类的东西。 我想知道点和线之间的距离。

如何计算距离?

以下是我构建算法的方式。我假设目标点和测量点是 'linear'(我不会在任何时候倒退)。

第 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 gives an example of how to easily implement this, while this question 详细介绍了更精确的 Vincenty 公式。

第二步:确定当前虚拟段

您想开始查看每个测量点,并比较它与虚拟线段的距离。对于每个点,您要检查是否仍在将其与正确的虚拟段进行比较。

因此,在确定每个距离之前,请检查您是否处于正确的路段。让我们试试这个:

targetSegment = 0
for point in measuredPoints:
    while Dist(point, targetCoords[targetSegment+2]) < targetPointDistances[targetSegment+1]:
        targetSegment += 1

对于每个点,我都在检查它与下一段终点的距离是否小于当前段的长度。如果这是真的,我开始将它与下一个虚拟段进行比较。 (额外的功劳:是否有任何情况下这不起作用,或者不是最理想的?)

在您的示例图像中,这会在第一段中留下前 4 个测量点。第五个测量点比第三个目标点更接近第三个目标点,所以我们前进到下一个虚拟段。

第三步:计算与虚拟线的距离

这似乎很简单 - 您已经链接到它了!

只需使用targetCoords[targetSegment]targetCoords[targetSegment+1]作为虚拟线的起点和终点。这可以是步骤 2 中 for 循环的一部分!