การซ้อนทับรูปหลายเหลี่ยมด้วยหุ่นดี


15

ฉันพยายามจับรูปหลายเหลี่ยมที่ไม่ทับซ้อนกันทั้งหมดที่ระบุด้านล่างโดยใช้ Shapely (รูปหลายเหลี่ยม A, B & C) ยิ่งกว่านั้นฉันหวังว่าจะทำเช่นนั้นโดยไม่ต้องทำซ้ำทดสอบจุดตัดเป็นต้นคำตอบที่ยอมรับสำหรับคำถามนี้เป็นการแสดงออกถึงวิธีการของ PostGIS แต่ดูเหมือนว่า 'สหภาพ' หมายถึงสิ่งที่แตกต่างกันสำหรับผู้คนที่แตกต่างกัน

การซ้อนทับรูปหลายเหลี่ยม

คำตอบ:


21

คุณต้องทำซ้ำในระดับหนึ่ง ( อัปเดต : ฉันได้แก้ไขเพื่อลบลูป "สำหรับ" ทั้งหมดยกเว้นความเข้าใจในรายการเดียว)

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)

# list the shapes so they are iterable
shapes = [A, B, C]

ก่อนอื่นคุณต้องทำการรวมกลุ่มของการแยกทั้งหมด (ใช้การรวมกันแบบต่อเรียง ) โดยใช้คู่การรวมกันของแต่ละรูปร่าง จากนั้นคุณลบ (ผ่านdifference) จุดแยกออกจากการรวมกันของรูปร่างทั้งหมด

# All intersections
inter = cascaded_union([pair[0].intersection(pair[1]) for pair in combinations(shapes, 2)])
# Remove from union of all shapes
nonoverlap = cascaded_union(shapes).difference(inter)

นี่คือnonoverlapลักษณะ (ผ่านตัวสร้างการทดสอบ JTS): nonoverlap


1

หลังจากไม่กี่ปีที่ผ่านมาดูเหมือนว่าจะมีทางออกที่ดีกว่าผ่านshapely:

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import polygonize, unary_union

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
...

# list the shapes so they are iterable
shapes = [A, B, C, ...]

# generate the overlay
list(polygonize(unary_union(list(x.exterior for x in shapes))))

มันรองรับความยาวของรูปทรงเรขาคณิตปัญหาเดียวที่เกี่ยวกับเวลาการคำนวณและไม่รองรับรูปหลายเหลี่ยมที่มีรู


ทำไมคุณคิดว่าทางออกของคุณดีกว่า @MikeT? ฉันสามารถอ่านปัญหาเกี่ยวกับเวลาการคำนวณเท่านั้น
mgri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.