微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

点到线段的投影Python Shapely

我有一个由两个点定义的Linestring,因此本质上是一个直线段,我想在其上投影一个点.我知道.project和.interpolate.但是,当该点在该线段“外部”时,我不希望该线段上最近的点,而是要扩展该线段并绘制一条穿过该点并与(延伸的)线段正交的线.我想要投影的坐标.

enter image description here

例如,如果该点在“段内”

from shapely.geometry import Point
from shapely.geometry import Linestring
point = Point(0.2, 0.5)
dist = Linestring([(0, 1), (1, 1)]).project(point)
list(Linestring([(0, 1), (1, 1)]).interpolate(dist).coords)

任何人都知道该点在线段之外怎么办?

解决方法:

手动执行此操作可能最简单.如果将角度x-u-v表示为alpha,则

cos(alpha) = (v - u).(x - u) / (|x - u|*|v - u|)

在哪里.表示点积,| |代表欧几里得范数.
因此,P(x)与u的距离d为:

d = cos(alpha)*|x - u| = (v - u).(x - u) / |v - u|

计算出d之后,即可轻松获得投影点P(x)为:

P(x) = u + d*(v - u)/|v - u|

实现:

import numpy as np
from shapely.geometry import Point
from shapely.geometry import Linestring

point = Point(0.2, 0.5)
line = Linestring([(0, 1), (1, 1)])

x = np.array(point.coords[0])

u = np.array(line.coords[0])
v = np.array(line.coords[len(line.coords)-1])

n = v - u
n /= np.linalg.norm(n, 2)

P = u + n*np.dot(x - u, n)
print(P) #0.2 1.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐