2つのポリゴンがPythonで交差しているかどうかを確認しますか?


19

Pythonで2つのポリゴンが交差するかどうかを判断するのに役立つアルゴリズム、高レベルのソリューション、またはライブラリを探しています。

2つの異なる配列に2つのポリゴン(これらは穴のない単一パーツポリゴンです)の頂点があります。ポリゴンは2Dです(XおよびY座標のみ)

これらの2つのポリゴンが交差するかどうかを示すブール値を返す関数を作成します。

私はarcpy、またはarcgisこのコンポーネントを使用できないことに注意してください。

これを行うためのアルゴリズムまたはライブラリを提案できますか?

回答:


42

格好良く試すことができます。

空間的な関係を記述し、ウィンドウで機能します

空間データモデルには、幾何オブジェクト間の自然言語関係のグループ(包含、交差、重複、タッチなど)と、コンポーネントポイントセットの相互交差の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 Cookbookで詳細を確認できます。


私はこれを使いたいと思っていますが、私は窓にいて、試した両方のシステムで、Pythonバインディングを動作させることができません。私はこの記事で説明する問題に遭遇:gis.stackexchange.com/questions/44958/...
Devdatta Tengshe

1
他の誰かがこれに出くわした
Evil Genius

あなたはまた、交差点の値がポリゴンが交差する場合に応じて、TRUEまたはFALSEになります---交差点= poly1.Intersect(ポリ2)を書くことができます
マックス


0

これは古い質問であることは知っていますが、凹型ポリゴンと凸型ポリゴン、および円の間の衝突を処理するためのPythonライブラリを作成しました。

使い方はとても簡単です、どうぞ。

例:

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

以下を含む応答を生成することもできます。

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.