Shapely - 从复杂的线串中获取交叉点的坐标

时间:2017-12-18 17:26:17

标签: python shapely

我创建了复杂的线串,如下所示:

from shapely.geometry import LineString

complex_line = LineString([(-1, -1), (1, 1), (1, 0), (-1, 0)])

该行有效,但并不简单。我怎样才能得到交叉点(这里是[0,0])?

1 个答案:

答案 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)

这不是很好的优化。在大而复杂的几何形状上,我可以想象这可能需要对每一半线进行更多解析插值 最终很慢。