为什么 Shapely 'difference' 和 'intersection' 返回意外结果?

Why are Shapely 'difference' and 'intersection' returning unexpected result?

我已经定义了三个 Shapely 线串和三个 Shapely 多边形,它们在不同的地方 overlap/intersect 彼此,如下面的注释图像所示。

我的理解是,一个匀称的 'difference' 操作应该 return 多边形之外的线部分。我不确定为什么,但是当我执行 'difference' 操作时,它似乎保留了一个多边形内的线的一部分。这显示在下图中,我将原始多边形与差分操作的输出进行了比较。

请注意,类似地,如果我 运行 一个 'intersection' 操作,它会丢失这个小片段。谁能解释为什么会这样?生成上面显示的所有内容的代码如下:

import geopandas as gpd
import pandas as pd
from shapely.geometry import Polygon, LineString

#Define lines and polygons:
linkID = ['1','2','3']
link_geom = [LineString([(0, 0), (10, 10)]),LineString([(10, 10), (20, 10)]),LineString([(20, 10), (25, 15)])]
gdf_links = gpd.GeoDataFrame({'linkID':linkID,'geometry':link_geom})
polyID = ['100','200','300']
poly_geom = [Polygon([(2, 1), (2, 3), (4, 3), (4, 1)]),Polygon([(15, 7), (15, 13), (18, 13), (18, 7)]),Polygon([(19, 7), (19, 13), (21, 13), (21, 7)])]
gdf_poly = gpd.GeoDataFrame({'polyID':polyID,'geometry':poly_geom})

links = gdf_links.unary_union
polys = gdf_poly.unary_union

#Show plot of lines and polygons together:
gpd.GeoSeries([links,polys]).plot(cmap='tab10')

#Split links at polygons, keeping segments that are outside of polgyon:
difference = gdf_links.difference(gdf_poly).reset_index(drop=True)

#Plot resulting 'difference' vs original polygons:
diff = difference.unary_union
gpd.GeoSeries([diff,polys]).plot(cmap='tab10')

您正在对三个独立的 linke 和多边形执行 'difference' 函数。所以第一行只被第一个盒子裁剪。 secone link 仅被第二个框裁剪。第三行仅被第三个框裁剪。解决这个问题的方法是裁剪连接的多边形数据集上的线,这样它们就会针对所有框进行裁剪。您可以在线更改此设置:

difference = gdf_links.difference(gdf_poly).reset_index(drop=True)

并将其更改为:

difference = gdf_links.difference(polys).reset_index(drop=True)