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.

您对手动执行向量运算的原始解决方案感兴趣吗?