В моем коде я хотел бы рассчитать перекрытие между несколькими полигонами и другим полигоном. В качестве примера я создал следующие три многоугольника («дорожки») и квадратный многоугольник. Мне нужно рассчитать наложение треков на квадрат.
Сначала полигоны:
from shapely.ops import cascaded_union
from shapely import geometry
import matplotlib.pyplot as plt
from descartes import PolygonPatch
import cartopy.crs as ccrs
#Set up polygons
square = geometry.Polygon([(-3,-3),(3,-3),(3,3),(-3,3),(-3,-3)]) #blue square
track1 = geometry.Polygon([(-6,-0.5),(6,-0.5),(6,0.5),(-6,0.5),(-6,-0.5)])
#green track 1
track2 = geometry.Polygon([(-0.5,-6),(-0.5,6),(-2,6),(-2,-6),(-0.5,-6)]) #red
track 2
track3 = geometry.Polygon([(-8.5,-3),(-7.5,-3),(8.5,4),(7.5,4),(-8.5,-3)])
#yellow track 3
Что выглядит следующим образом при построении графика:
![enter image description here](https://i.stack.imgur.com/a3Fhn.png)
Теперь, чтобы получить оверлей, я сначала объединяю три трека, используя cascaded_union
в многоугольник. После этого я получаю полигон пересечения:
casc = cascaded_union([track1,track2,track3]) #ISSUE 1
intersect = square.intersection(casc) #ISSUE 2
Затем, чтобы получить перекрытие, я использую:
ratio = intersect.area/square.area*100.0
print(ratio)
Что дает значение 41.98598710317461
. Таким образом, перекрытие составляет примерно 42%.
Проблема в том, что мне приходится вычислять перекрытие сотни раз. Геометрия должна быть сделана только один раз, но я знаю (используя time.time()
), что две линии (обозначенные ВЫПУСК 1 и ВЫПУСК 2) занимают основную часть времени работы. Есть ли более быстрый способ расчета перекрытия?