我有两种地理坐标。
一个是目标点,另一个是通过GPS测量的点。
我可以画线和点,如下图:
这些黑点是测量点,白点是目标点。
因此,我想计算测量点与目标点所形成的线之间的距离。但重要的是,这两点都包括倒退点。我的意思是,这就像一条返回之路。
我读了这篇文章Calculating the distance between a point and a virtual line of two lat/lngs,但是我的座标包含了很多点。而且点的间隔不是固定的。
因此,我认为我应该使用for循环之类的方法。 我想知道点和线之间的距离。
如何计算距离?
答案 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循环的一部分!