Почему Shapely «разница» и «пересечение» возвращают неожиданный результат? - PullRequest
0 голосов
/ 04 апреля 2020

Я определил три линейные линии Shapely и три многоугольника Shapely, которые перекрывают / пересекаются друг с другом в разных местах, как показано на аннотированном изображении ниже.

enter image description here

Насколько я понимаю, операция «разницы» должна возвращать части линий, которые находятся за пределами многоугольников. Я не уверен почему, но когда я выполняю «разностную» операцию, кажется, что она удерживает часть линии внутри одного из многоугольников. Это показано на следующем графике, где я сравнил исходные полигоны с выводом разностной операции.

enter image description here

Обратите внимание, что аналогично, если я запускаю операцию «пересечение», он пропускает этот маленький сегмент. Кто-нибудь может объяснить, почему это так? Код для генерации всего показанного выше выглядит следующим образом:

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')

1 Ответ

1 голос
/ 09 апреля 2020

Вы выполняете функцию «разности» на трех отдельных линиях и полигонах. Таким образом, первая строка обрезается только первой рамкой. Вторая ссылка обрезается только во втором окне. Третья строка обрезается только третьей рамкой. Решением этой проблемы является обрезка линий в объединенном наборе данных многоугольника, чтобы они были обрезаны по всем блокам. Вы можете изменить это в строке:

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

и изменить на:

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