Lớp phủ đa giác với hình dạng


15

Tôi đang cố gắng nắm bắt tất cả các đa giác không chồng lấp được chỉ định bên dưới bằng Shapely (đã cho đa giác A, B & C). Hơn nữa, tôi hy vọng sẽ làm như vậy mà không lặp lại, kiểm tra giao cắt, v.v ... Câu trả lời được chấp nhận cho câu hỏi này thể hiện phương pháp PostGIS nhưng dường như 'liên minh' có nghĩa là những điều khác nhau đối với những người khác nhau.

lớp phủ đa giác

Câu trả lời:


21

Bạn cần phải lặp đi lặp lại ở một số cấp độ. ( Cập nhật : Tôi đã chỉnh sửa để xóa tất cả các vòng lặp "cho", ngoại trừ việc hiểu một danh sách )

# 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]

Trước tiên, bạn cần liên kết của tất cả các giao điểm (sử dụng liên kết theo tầng ), sử dụng cặp kết hợp của mỗi hình dạng. Sau đó, bạn loại bỏ (thông qua difference) các giao điểm từ sự kết hợp của tất cả các hình dạng.

# 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)

Đây là những gì nonoverlaptrông giống như (thông qua JTS Test Builder): không chồng


1

Sau một vài năm, dường như có một giải pháp tốt hơn thông qua 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))))

Nó hỗ trợ bất kỳ chiều dài hình học nào, vấn đề duy nhất là về thời gian tính toán và không hỗ trợ đa giác có lỗ.


Vì tò mò, tại sao bạn nghĩ giải pháp của bạn tốt hơn giải pháp của @MikeT? Tôi chỉ có thể đọc về một vấn đề về thời gian tính toán.
mgri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.