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

时间:2018-10-16 01:43:39

标签: python python-3.x math geolocation geo

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

我可以画线和点,如下图:

sample image

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

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

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

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

如何计算距离?

1 个答案:

答案 0 :(得分:0)

这是我构造算法的方式。我假设目标点和被测点是“线性的”(那我什么时候都不会向后退)。

第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:])]

“距离”是用户定义的函数,用于确定坐标对之间的距离。 This question给出了如何轻松实现此示例,而this question给出了有关更精确的Vincenty公式的详细信息。

第2步:确定当前的虚拟细分

您要开始查看每个测量点,然后比较它与虚拟线段的距离。对于每个点,您都希望检查自己是否仍在将其与正确的虚拟细分进行比较。

因此,在确定每个距离之前,请确保您位于正确的段中。让我们尝试一下:

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

对于每个点,我都在检查它与下一个段的端点的距离是否小于当前段的长度。如果是这样,我开始将其与下一个虚拟段进行比较。 (额外的功劳:在任何情况下,这种方法都行不通或不理想吗?)

在示例图像中,这将前四个测量点留在第一段中。第五个测量点比第二个目标点更靠近第三个目标点,因此我们前进到下一个虚拟线段。

第3步:计算距虚拟线的距离

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

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