【问题标题】:Orthogonal distance between a reference line and successive points of a polyline参考线与折线的连续点之间的正交距离
【发布时间】:2020-07-10 12:52:24
【问题描述】:

图像显示 (1) 一条红线,我称之为参考线,以及 (2) 一条黄色折线。每个线特征由数千个 x,y 坐标对点组成。我想沿着红色参考线增量移动,并计算到黄色折线的每个坐标对点的正交距离(相对于红线)。我正在使用 python 3。

这里是红色参考线的前 25 个坐标对:

这是黄色折线的前 25 个坐标对:

我一直在尝试基于hereherehere 的一些方法。我正在测试上次hyperlink 讨论的答案,以尝试构建工作流:

import numpy as np
from shapely.geometry import LineString, Point

x1 = 457508.40746964136
x2 = 457508.5456318401

y1 = 8872649.617776532
y2 = 8872649.773129418

dist = np.sqrt((x2 - x1)**2 + (y2 - y1)**2)

centerX = (x2 - x1) / 2 + x1
centerY = (y2 - y1) / 2 + y1

test_x = centerX - dist/4
test_y = centerY + dist

line = LineString([(x1, y1), (x2, y2)])  
print(list(line.coords))

p = Point(test_x,test_y)  
print(list(p.coords))

print(p.distance(line))

p.distance(line) 返回:0.17780...这是此特定测试的图像:

黑色点是红色参考线上的两个连续坐标对。红点是一个测试坐标对,用于计算从黑点到浅蓝色线段的正交距离。在我看来,上面给出的 p.distance 结果对于正交距离来说太短了。对于在这个问题上取得进展的任何帮助,我将不胜感激。提前致谢。

【问题讨论】:

  • 假设红线始终是一条直线,您可以转换点,使 x 轴变为沿线的距离(即所有红色 y 坐标均为 0),那么您可以这样做每个所需间隔的线性插值 (see interp1d())
  • @mikewatt 插值到什么特定的坐标集?也许我的目标从我上面的描述中不清楚,或者我不知道如何从你的评论中到达那里。以上面给出的情节为例。目标是将线段从两个黑点之间的线段投影到红点;投影线必须与连接两个黑点的线段正交。然后我想计算这条投影线到红点的距离。然后我会重复这个过程,沿着红色参考线移动,投影到黄色线。

标签: python geometry computational-geometry shapely


【解决方案1】:

(test_x,test_y)到线(x1,y1)-(x2,y2)的正交距离可以用向量代数计算

orthodistance = abs((y2 - y1)*test_x - (x2 - x1)*test_y + x2*y1 - y2*x1) / dist)

这个表达式为您的数据提供0.176,所以结果看起来很接近。

请注意,您的图像比例并不完美 - 绘图在 X 方向上拉伸,这就是您可能会怀疑的原因。

【讨论】:

  • MBo 确实看起来您是正确的。这是一个更新图的链接,其中轴绘制为相同的比例:Image。由于参考线上的投影点(深蓝色点)绘制在最初显示的线段右侧,因此我在参考线上又添加了一对坐标。感谢您提供向量代数解决方案以及您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2017-02-11
  • 2020-01-26
  • 2019-09-25
  • 1970-01-01
  • 2017-07-06
  • 2012-04-04
相关资源
最近更新 更多