2017-02-18 2 views
1

Ich versuche Regionen von Polygonen unter der Bedingung zu schaffen, dass sie berühren. In meinem Beispiel habe ich ein Beispiel-Dataset mit 382 Polygonen, die zusammen gruppiert werden müssen (aber das vollständige Dataset enthält 6355 Polygone). (Ich würde ein Bild zeigen, aber ich habe nicht genug Ruf, um das zu tun ..)Python-Region wächst mit Polygonen Leistung

Ich habe zwar diese rohe Gewalt, aber das dauert natürlich sehr lange und ist nicht sehr optimal.

Ich erfuhr über die Region wächst und dachte, dass das eine mögliche Lösung wäre, aber immer noch die Leistung ist schrecklich. Ich habe dies auf folgende Weise umgesetzt:

def groupBuildings(blds): 
    # blds is a list with shapely polygons 
    others = blds 
    groups = [] 
    while blds != []: 
     done = [] 
     group = [] 
     first = blds.pop(0) 
     done.append(first) 
     group.append(first) 
     for other in others: 
      if (other in blds) and first.touches(other): 
       group.append(other) 
       blds.remove(other) 

return groups 

Aber ich denke, das Problem hier ist, dass ich keine nächsten Nachbarn haben, also muss ich noch zweimal jedes Gebäude laufen.

Also meine Frage ist: sind die nächsten Nachbarn essentiell für die Region wächst? Oder gibt es eine andere Möglichkeit, dies effizient zu tun?

Antwort

1

Sie werden am besten bedient mit shapely.ops.cascaded_union() (docs here).

from shapely.geometry import Point, Polygon, MultiPolygon 
from shapely.ops import cascaded_union 
import numpy as np 
polygons = [Point(200*x,200*y).buffer(b) for x,y,b in np.random.random((6000,3))] 
multi = MultiPolygon(polygons) 
unioned = cascaded_union(multi) 

%%timeit 
unioned = cascaded_union(multi) 
# 2.8 seconds for me