การค้นหาว่ารูปหลายเหลี่ยมสองจุดตัดกันใน Python หรือไม่


19

ฉันกำลังมองหาอัลกอริทึมการแก้ปัญหาระดับสูงหรือแม้แต่ห้องสมุดที่สามารถช่วยฉันพิจารณาว่ารูปหลายเหลี่ยมสองจุดตัดกันใน Python หรือไม่

ฉันมีจุดยอดของรูปหลายเหลี่ยมสองรูป (นี่คือรูปหลายเหลี่ยมส่วนเดียวที่ไม่มีรูใด ๆ ) ในสองอาร์เรย์ที่ต่างกัน รูปหลายเหลี่ยมเป็น 2D (เช่นพิกัด X และ Y)

ฉันจะสร้างฟังก์ชั่นซึ่งจะคืนค่าบูลีนโดยระบุว่ารูปหลายเหลี่ยมสองรูปนี้ตัดกันหรือไม่

โปรดทราบว่าฉันไม่สามารถใช้arcpyหรือarcgisส่วนประกอบใด ๆในนี้

คุณสามารถแนะนำอัลกอริทึมหรือไลบรารีสำหรับทำสิ่งนี้ได้หรือไม่?

คำตอบ:


42

คุณอาจจะลองหุ่นดี

พวกเขาอธิบายความสัมพันธ์เชิงพื้นที่และมันทำงานบน windows

แบบจำลองข้อมูลเชิงพื้นที่จะมาพร้อมกับกลุ่มของความสัมพันธ์ภาษาธรรมชาติระหว่างวัตถุทางเรขาคณิต - ประกอบด้วย, ปริภูมิ, ทับซ้อน, สัมผัสและอื่น ๆ - และกรอบทฤษฎีสำหรับทำความเข้าใจกับพวกเขาโดยใช้เมทริกซ์ 3x3 ของจุดตัดร่วมของชุดจุดองค์ประกอบ

รหัสต่อไปนี้แสดงวิธีการทดสอบจุดตัด:

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

คุณสามารถใช้การผูก GDAL / OGR Pythonได้

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

มันจะกลับมาNoneถ้าพวกเขาไม่ตัดกัน หากพวกมันตัดกันมันจะคืนค่าเรขาคณิตทั้งคู่

นอกจากนี้คุณสามารถค้นหาข่าวสารต่อไปในGDAL / OGR ตำรา


ฉันชอบที่จะใช้สิ่งนี้ แต่ฉันอยู่บน windows และทั้งสองระบบที่ฉันได้ลองฉันไม่สามารถทำให้การเชื่อมหลามทำงานได้ ฉันพบปัญหาที่อธิบายในโพสต์นี้: gis.stackexchange.com/questions/44958/ …
Devdatta Tengshe

1
ในกรณีที่คนอื่นสะดุดกับเรื่องนี้ก็เป็นไปได้ที่จะใช้ GDAL / OGR กับ Python ใน Windows (และภายใน ArcGIS ไม่น้อยกว่า): gis.stackexchange.com/questions/74524/ …
Evil Genius

คุณยังสามารถเขียน intersection = poly1.Intersect (poly2) --- ค่าของการแยกจะเป็น TRUE หรือ FALSE ขึ้นอยู่กับว่ารูปหลายเหลี่ยมตัดกัน
Max


0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันได้เขียนห้องสมุดหลามสำหรับจัดการการชนระหว่างรูปหลายเหลี่ยมเว้าและนูนรวมถึงแวดวง

มันค่อนข้างใช้งานง่ายไปเลย!

ตัวอย่าง:

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

นอกจากนี้คุณยังสามารถให้มันสร้าง reponse ซึ่งรวมถึง:

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

ถ้าคุณต้องการทราบระดับคุณสามารถใช้สิ่งนี้ เป็นอาร์กิวเมนต์คุณสามารถให้รายการรูปหลายเหลี่ยม และเป็นค่าตอบแทนที่คุณจะได้รับรายการระดับ ในรายการระดับมีรูปหลายเหลี่ยม

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.