我创建了复杂的线串,如下所示:
from shapely.geometry import LineString
complex_line = LineString([(-1, -1), (1, 1), (1, 0), (-1, 0)])
该行有效,但并不简单。我怎样才能得到交叉点(这里是[0,0])?
答案 0 :(得分:0)
你想在自相交之后的某个点分割线。然后你可以做isect_pnt = first.intersection(second)
。诀窍是在自相交之后找到那个点。
因此,我将从0.1到0.9循环“分割分数”,并在总长度的每个分数处分割几何,并查看是否可以找到有效的交点。如果可以,我们可以突破循环并停止搜索。对于自相交之前的分割,isect_pnt = first.intersects(second)
将返回False
,我们可以继续搜索。
这里的一个细微差别是我将使用interpolate
方法以更精细的分辨率创建新几何
import numpy
from shapely.geometry import LineString, Point
complex_line = LineString([(-1, -1), (1, 1), (1, 0), (-1, 0)])
# initial, non-result
intersection = None
# fraction of total distance at which we'll split the line
for split in numpy.arange(0.1, 1, 0.1):
full_len = complex_line.length
split_len = full_len * split
# endpoint = False to make sure we don't get a false-positive
# at the split point
first = LineString([
complex_line.interpolate(d)
for d in numpy.linspace(0, split_len, num=25, endpoint=False)
])
second = LineString([
complex_line.interpolate(d)
for d in numpy.linspace(split_len, full_len, num=25)
])
if first.intersects(second):
intersection = first.intersection(second)
break
print(intersection)
在我的机器上,输出:
POINT (0 0)
这不是很好的优化。在大而复杂的几何形状上,我可以想象这可能需要对每一半线进行更多解析插值 最终很慢。