पायथन में कुशलता से कई बहुभुजों का प्रतिच्छेदन प्राप्त करना


12

मैं कई बहुभुजों के प्रतिच्छेदन प्राप्त करना चाहूंगा। पायथन के shapelyपैकेज का उपयोग करते हुए , मैं intersectionफ़ंक्शन का उपयोग करके दो बहुभुज का प्रतिच्छेदन पा सकता हूं । वहाँ कई बहुभुज के चौराहे प्राप्त करने के लिए एक समान कुशल कार्य है?

यहाँ एक कोड स्निपेट है जिसे समझने का मेरा मतलब है:

from shapely.geometry import Point

coord1 = ( 0,0 )
point1 = Point(coord1)
circle1 = point1.buffer(1)

coord2 = ( 1,1 )
point2 = Point(coord2)
circle2 = point2.buffer(1)

coord3 = ( 1,0 )
point3 = Point(coord3)
circle3 = point3.buffer(1) 

दो घेरे के एक चौराहे द्वारा पाया जा सकता है circle1.intersection(circle2)। मैं द्वारा सभी तीन हलकों के प्रतिच्छेदन पा सकते हैं circle1.intersection(circle2).intersection(circle3)। हालांकि, यह दृष्टिकोण बड़ी संख्या में बहुभुज के लिए योग्य नहीं है क्योंकि इसके लिए अधिक कोड की आवश्यकता होती है। मैं एक ऐसा कार्य करना चाहता हूँ जो बहुसंख्यकों की मनमानी करता है और उनका प्रतिच्छेदन लौटाता है।


im सोच शायद एक शब्दकोश और लूप में कोट्स को स्टोर कर सकता है, जबकि इटर्स्टूल इम्पोर्ट कॉम्बिनेशन से उपयोग कर सकता है। मैं जल्द ही पोस्ट करूंगा
ziggy

"उनके चौराहों" से आपका क्या मतलब है? क्या आप सभी क्षेत्रों का मतलब है कि कम से कम एक अन्य बहुभुज, या उन क्षेत्रों के साथ जो सभी आदानों को प्रतिच्छेद करते हैं?
jpmc26

मेरा मतलब है कि कम से कम एक नहीं, सभी बहुभुजों का प्रतिच्छेदन।
स्प्लिन्टर

आपको इसे ऊपर (शायद एक उदाहरण आउटपुट के साथ) स्पष्ट करना चाहिए। मैं काफी निश्चित हूं कि अधिकांश उत्तर आपकी इच्छानुसार व्यवहार नहीं करते हैं। (और तथ्य यह है कि कई उत्तरदाताओं को गलत समझा गया है, यह पर्याप्त सबूत है कि प्रश्न को स्पष्टीकरण की आवश्यकता है।)
jpmc26

1
@ jpmc26 मैंने अभी-अभी अपने उत्तर में एक अद्यतन जोड़ा है जहाँ rtree का उपयोग किया जाता है। दृष्टिकोण अब अधिक कुशल और मापनीय है। उम्मीद है की यह मदद करेगा!
एंटोनियो फाल्कियानो

जवाबों:


7

एक संभव दृष्टिकोण बहुभुज के जोड़े, उनके चौराहों और अंत में सभी चौराहों के संघ को एक कैस्केड संघ (जैसे यहाँ सुझाव दिया गया है ) के संयोजन पर विचार कर सकता है :

from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations

circles = [
    Point(0,0).buffer(1),
    Point(1,0).buffer(1),
    Point(1,1).buffer(1),
]

intersection = cascaded_union(
    [a.intersection(b) for a, b in combinations(circles, 2)]
)
print intersection

एक अधिक कुशल दृष्टिकोण को बहुत सारे ज्यामितीय (तीन मंडलियों का मामला नहीं) से निपटने के लिए, Rtree की तरह एक स्थानिक सूचकांक का उपयोग करना चाहिए :

from shapely.geometry import Point
from shapely.ops import cascaded_union
from rtree import index

circles = [
    Point(0,0).buffer(1),
    Point(1,0).buffer(1),
    Point(1,1).buffer(1),
]
intersections = []
idx = index.Index()

for pos, circle in enumerate(circles):
    idx.insert(pos, circle.bounds)

for circle in circles:
    merged_circles = cascaded_union([circles[pos] for pos in idx.intersection(circle.bounds) if circles[pos] != circle])
    intersections.append(circle.intersection(merged_circles))

intersection = cascaded_union(intersections)
print intersection

मुझे विश्वास नहीं है कि यह वही करता है जो ओपी चाहता है। यह उन क्षेत्रों को वापस देता है जो कम से कम 2 बहुभुज कवर करते हैं, जबकि ओपी केवल सेट में सभी बहुभुज द्वारा कवर किए गए क्षेत्रों की तलाश में है। टिप्पणियों में स्पष्टीकरण देखें।
jpmc26

3

क्यों नहीं एक पुनरावृत्ति या पुनरावृत्ति का उपयोग करें? कुछ इस तरह :

from shapely.geometry import Point

def intersection(circle1, circle2):
    return circle1.intersection(circle2)

coord1 = ( 0,0 )
point1 = Point(coord1)
circle1 = point1.buffer(1)

coord2 = ( 1,1 )
point2 = Point(coord2)    
circle2 = point2.buffer(1)


coord3 = ( 1,0 )
point3 = Point(coord3)
circle3 = point3.buffer(1)
circles = [circle1, circle2, circle3]
intersectionResult = None

for j, circle  in enumerate(circles[:-1]):

    #first loop is 0 & 1
    if j == 0:
        circleA = circle
        circleB = circles[j+1]
     #use the result if the intersection
    else:
        circleA = intersectionResult
        circleB = circles[j+1]
    intersectionResult = intersection(circleA, circleB)

result= intersectionResult

2

इस कोड को एक शॉट दें। इसकी अवधारणा में बहुत सरल है और मुझे विश्वास है कि आप जो चाहते हैं वह आपको मिल जाता है।

from shapely.geometry import Point
from itertools import combinations
dic ={}
dic['coord1']=Point(0,0).buffer(1)
dic['coord2']=Point(1,1).buffer(1)
dic['coord3']=Point(1,0).buffer(1)
inter = {k[0]+v[0]:k[1].intersection(v[1]) for k,v in combinations(dic.items(),2)}
print inter

और अगर आप चाहते हैं कि आउटपुट को एक आकारफाइल उपयोग फियोना के रूप में संग्रहीत किया जाए:

from shapely.geometry import Point,mapping
import fiona
from itertools import combinations
schema = {'geometry': 'Polygon', 'properties': {'Place': 'str'}}
dic ={}
dic['coord1']=Point(0,0).buffer(1)
dic['coord2']=Point(1,1).buffer(1)
dic['coord3']=Point(1,0).buffer(1)
inter = {k[0]+v[0]:k[1].intersection(v[1]) for k,v in combinations(dic.items(),2)}
print inter
with fiona.open(r'C:\path\abid', "w", "ESRI Shapefile", schema) as output:
    for x,y in inter.items():
        output.write({'properties':{'Place':x},'geometry':mapping(y)})

यह आउटपुट -

यहाँ छवि विवरण दर्ज करें


3
मुझे विश्वास नहीं है कि यह वही करता है जो ओपी चाहता है। यह उन क्षेत्रों को वापस देता है जो कम से कम 2 बहुभुज कवर करते हैं, जबकि ओपी केवल सेट में सभी बहुभुज द्वारा कवर किए गए क्षेत्रों की तलाश में है। टिप्पणियों में स्पष्टीकरण देखें। इसके अतिरिक्त, kऔर vआपकी dictसमझ में परिवर्तनशील नामों के लिए खराब विकल्प हैं । वे चर प्रत्येक के विभिन्न तत्वों को संदर्भित करते हैं dic.items(), न कि एक कुंजी-मूल्य जोड़ी को। ऐसा कुछ a, bकम भ्रामक होगा।
jpmc26

1
ओह ठीक है हाँ मुझे समझ में नहीं आया कि उसका क्या मतलब था
ziggy

और अच्छी तरह से मेरे कश्मीर, वी विकल्पों के बारे में लिया - मैं बस स्वचालित रूप से कश्मीर का उपयोग करता हूं, वी जब एक शब्दकोश के माध्यम से
पाला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.