Рассчитать перекрытие эффективно - PullRequest
0 голосов
/ 04 июля 2018

В моем коде я хотел бы рассчитать перекрытие между несколькими полигонами и другим полигоном. В качестве примера я создал следующие три многоугольника («дорожки») и квадратный многоугольник. Мне нужно рассчитать наложение треков на квадрат. Сначала полигоны:

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

Теперь, чтобы получить оверлей, я сначала объединяю три трека, используя 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) занимают основную часть времени работы. Есть ли более быстрый способ расчета перекрытия?

...