Mam dużą liczbę wielokątów (~ 100000) i staram się znaleźć inteligentny sposób obliczania ich przecinających się obszarów za pomocą zwykłych komórek siatki.Szybszy sposób przecięcia poligonu z zgrabnym
Obecnie tworzę wielokąty i komórki siatki za pomocą kształtów (na podstawie ich współrzędnych kątowych). Następnie za pomocą prostej pętli for przejdę przez każdy wielokąt i porówna go z pobliskimi komórkami siatki.
Po prostu mały przykład ilustrujący wielokąty/komórki siatki.
from shapely.geometry import box, Polygon
# Example polygon
xy = [[130.21001, 27.200001], [129.52, 27.34], [129.45, 27.1], [130.13, 26.950001]]
polygon_shape = Polygon(xy)
# Example grid cell
gridcell_shape = box(129.5, -27.0, 129.75, 27.25)
# The intersection
polygon_shape.intersection(gridcell_shape).area
(BTW: komórki siatki mają wymiary 0.25x0.25 i 1x1 wielokątów przy max)
Właściwie jest to dość szybko do indywidualnego wielokąt/combo sieci komórkowej z około 0,003 sekundy. Jednak uruchomienie tego kodu na ogromnej liczbie wielokątów (każdy z nich może przecinać dziesiątki komórek siatki) zajmuje około 15+ minut (do 30+ min w zależności od liczby przecinających się komórek siatki) na moim komputerze, co jest niedopuszczalne. Niestety, nie mam pojęcia, jak można napisać kod dla przecięcia wieloboków, aby uzyskać obszar pokrywania się. Czy masz jakieś wskazówki? Czy istnieje alternatywa dla zgrabnej?
Jestem ciekawa, jak się zapętlasz i przecinasz swoje wielokąty. Czy możesz pokazać więcej kodu w procesie? Byłoby łatwiej dowiedzieć się, jak można to zoptymalizować. – tdedecko
Generalnie biorę tablicę wartości rogu lat/lon i konwertuję je w pętlę for do wielokątów. Następnie porównuję każdy wielokąt z pewną komórką siatki, która jest ponownie wykonywana w pętli for. Zobacz: http://stackoverflow.com/a/13956110/1740928 – HyperCube