计算测量点与目标线之间的距离
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 循环的一部分!
我有两种地理坐标。
一个是目标点,另一个是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 循环的一部分!