Я определил три линейные линии Shapely и три многоугольника Shapely, которые перекрывают / пересекаются друг с другом в разных местах, как показано на аннотированном изображении ниже.
Насколько я понимаю, операция «разницы» должна возвращать части линий, которые находятся за пределами многоугольников. Я не уверен почему, но когда я выполняю «разностную» операцию, кажется, что она удерживает часть линии внутри одного из многоугольников. Это показано на следующем графике, где я сравнил исходные полигоны с выводом разностной операции.
Обратите внимание, что аналогично, если я запускаю операцию «пересечение», он пропускает этот маленький сегмент. Кто-нибудь может объяснить, почему это так? Код для генерации всего показанного выше выглядит следующим образом:
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')