Python 点到直线段的投影
我有一个由两点定义的线串,所以本质上是一条直线段,我想在上面投射一个点。我知道Python 点到直线段的投影,python,gis,point,projection,shapely,Python,Gis,Point,Projection,Shapely,我有一个由两点定义的线串,所以本质上是一条直线段,我想在上面投射一个点。我知道.project和.interpolate。但是,当点位于线段“外部”时,我不希望线段上最近的点,但我希望延伸线段并绘制一条穿过该点的直线,该直线与(延伸的)线段正交。我要投影的坐标 例如,如果该点在线段内 from shapely.geometry import Point from shapely.geometry import LineString point = Point(0.2, 0.5) dist =
.project
和.interpolate
。但是,当点位于线段“外部”时,我不希望线段上最近的点,但我希望延伸线段并绘制一条穿过该点的直线,该直线与(延伸的)线段正交。我要投影的坐标
例如,如果该点在线段内
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.
您对手动执行向量运算的原始解决方案感兴趣吗?