Python 如何在形状相交时保留复杂直线

Python 如何在形状相交时保留复杂直线,python,geometry,intersection,shapely,geos,Python,Geometry,Intersection,Shapely,Geos,我正在尝试使用Python中的Shapely库将一条复杂的线与多边形相交。不幸的是,Shapely打断了我的原始行,因此它返回一个简单的行 例如: # complex line folded back on itself (A-B-A) ls = shapely.geometry.LineString([(1,0), (1,2), (1,0)]) ls.length == 4.0 # intersected with a covering bounding box bounding_box =

我正在尝试使用Python中的Shapely库将一条复杂的线与多边形相交。不幸的是,Shapely打断了我的原始行,因此它返回一个简单的行

例如:

# complex line folded back on itself (A-B-A)
ls = shapely.geometry.LineString([(1,0), (1,2), (1,0)])
ls.length == 4.0

# intersected with a covering bounding box
bounding_box = shapely.geometry.Polygon([(0,0), (0,2), (2,2), (2,0)])

intersected = bounding_box.intersection(ls)
# LINESTRING (1 0, 1 2)  - (A-B)
intersected.length == 2.0
您可以看到原始行中的复制组件已消失。我能理解这种行为的来源,在大多数情况下,这可能是明智的选择


我正在寻找一种方法来进行交叉,以便保留原始直线信息。在这种退化的情况下,我希望最终得到完全相同的几何体,一条长度为4的线本身折叠起来。在其他更复杂的情况下,我与之相交的多边形将分割原始直线,但我仍然需要在相交点内保留任何重复的线段。

目前,我正在通过逐段执行线段来使用蛮力

segments = [shapely.geometry.LineString(x) for x in zip(line.coords, line.coords[1:])]

for segment in segments:
    intersected = polygon.intersection(segment)
    # ...

似乎是一个很容易矢量化的问题

您的行是非简单的(即,
ls.is\u simple is False
),这就是为什么不保留重叠。您可能需要提取直线重叠段,这听起来并不容易。这就是我使用的方法。实际上,我将在下面发布。起初,我实际上是把一堆三维的线叠起来,希望它们都能被独立地分割。可惜它不起作用,对我来说会非常有帮助!