手动执行此操作可能最简单。如果将角度 p - s - e 表示为 alpha,则
cos(alpha) = (e - s).(p - s) / (|p - s|*|e - s|)
其中.表示点积,| | 表示欧氏范数。 P(p) 与 s 的距离 d 因此是:
d = cos(alpha)*|p - s| = (e - s).(p - s) / |e - s|
计算出 d 后,投影点 P(p) 便可轻松获得:
P(p) = s + d*(e - s)/|e - s|
实现:
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)])
p = np.array(point.coords[0])
s = np.array(line.coords[0])
e = np.array(line.coords[len(line.coords)-1])
d = e - s
d /= np.linalg.norm(d, 2)
P = s + d*np.dot(p - s, d)
print(P) #0.2 1.