Tìm kiếm nếu hai đa giác Giao nhau trong Python?


19

Tôi đang tìm kiếm một thuật toán, một giải pháp cấp cao hoặc thậm chí là một thư viện có thể giúp tôi xác định xem hai đa giác có giao nhau không, trong Python.

Tôi có các đỉnh của hai đa giác (Đây là các đa giác một phần không có lỗ) trong hai mảng khác nhau. Đa giác là 2D (tức là chỉ tọa độ X và Y)

Tôi muốn tạo một hàm sẽ trả về một boolean cho biết hai đa giác này có giao nhau không.

Xin lưu ý rằng tôi không thể sử dụng arcpy, hoặc bất kỳ arcgisthành phần nào trong này.

Bạn có thể đề xuất một thuật toán hoặc thư viện để làm điều này?

Câu trả lời:


42

Bạn có thể thử tạo hình .

Họ mô tả các mối quan hệ không gian và nó hoạt động trên các cửa sổ

Mô hình dữ liệu không gian được đi kèm với một nhóm các mối quan hệ ngôn ngữ tự nhiên giữa các đối tượng hình học - chứa, giao nhau, chồng chéo, chạm, v.v. - và khung lý thuyết để hiểu chúng bằng cách sử dụng ma trận 3x3 của các giao điểm lẫn nhau của các điểm thành phần của chúng

Đoạn mã sau cho thấy cách bạn có thể kiểm tra giao lộ:

from shapely.geometry import Polygon
p1 = Polygon([(0,0), (1,1), (1,0)])
p2 = Polygon([(0,1), (1,0), (1,1)])
print(p1.intersects(p2))

15

Bạn có thể sử dụng các ràng buộc Python GDAL / OGR cho điều đó.

from osgeo import ogr

wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874, 1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917, 1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)

intersection = poly1.Intersection(poly2)

print intersection.ExportToWkt()

Nó trả về Nonenếu chúng không giao nhau. Nếu chúng giao nhau, nó trả về hình học là cả hai giao nhau.

Ngoài ra, bạn có thể tìm thấy thêm thông tin trong Sách dạy nấu ăn GDAL / OGR .


Tôi rất thích sử dụng cái này, nhưng tôi đang ở trên windows và trên cả hai hệ thống tôi đã thử, tôi không thể làm cho các ràng buộc python hoạt động. Tôi gặp vấn đề được mô tả trong bài đăng này: gis.stackexchange.com/questions/44958/iêu
Devdatta Tengshe 18/03/2016

1
Chỉ trong trường hợp người khác vấp phải điều này, có thể sử dụng GDAL / OGR với Python trong Windows (và trong ArcGIS, không hơn không kém): gis.stackexchange.com/questions/74524/ Khăn
Evil Genius

bạn cũng có thể viết giao lộ = poly1.Intersect (poly2) --- giá trị của giao lộ sẽ là TRUE hoặc FALSE tùy thuộc vào việc đa giác có giao nhau hay không
Tối đa


0

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã viết một thư viện python để xử lý các va chạm giữa các đa giác lõm và lồi, cũng như các vòng tròn.

Nó khá đơn giản để sử dụng, ở đây bạn đi!

Thí dụ:

from collision import *
from collision import Vector as v

p0 = Concave_Poly(v(0,0), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])
p1 = Concave_Poly(v(20,20), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])

print(collide(p0,p1))

Bạn cũng có thể tạo nó phản hồi, bao gồm:

overlap (how much they overlap)
overlap vector (when subtracted from second shapes position, the shapes will no longer be colliding)
overlap vector normalized (vector direction of collision)
a in b (whether the first shape is fully inside the second)
b in a (whether the second shape is fully inside the first)

https://github.com/QwekoDev/collision


0

nếu bạn muốn biết mức độ bạn có thể sử dụng này. Là một đối số, bạn có thể đưa ra một danh sách đa giác. Và như một giá trị trả về, bạn nhận được một danh sách các cấp. Trong danh sách các cấp có đa giác.

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
def isPolygonInPolygon(poly1,poly2):
    poly2 = Polygon(poly2)
    for poi in poly1:
        poi = Point(poi)
        if(poly2.contains(poi)):
            return True

def polygonTransformHierarchy(polygon_list):
    polygon_list_hierarchy = []
    for polygon1 in polygon_list:
        level = 0
        for polygon2 in polygon_list:
            if(isPolygonInPolygon(polygon1, polygon2)):
                level += 1
        if(level > len(polygon_list_hierarchy)-1):
            dif = (level+1)- len(polygon_list_hierarchy)
            for _ in range(dif):
                polygon_list_hierarchy.append([])   
        polygon_list_hierarchy[level].append(polygon1)
    return polygon_list_hierarchy
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.