2016-09-05 14 views
1

整形式ライブラリにいくつか問題があります。偽とPython shapely:.equals関数が必ずしも機能しない場合があります。

poly1 = Polygon(([220.0, 400, 500], [220.0, 20, 500], [220.0, 20, 0], [220.0, 400, 0], [220.0, 400, 500])) 
poly2 = Polygon(([220.0, 20, 500], [220.0, 400, 500], [220.0, 400, 0], [220.0, 20, 0], [220.0, 20, 500])) 

print (poly1.equals(poly2)) 

結果: は今等号機能は常に動作していないようです。 理由は何ですか?ドキュメントから

+2

それがこのhttp://stackoverflow.com/questions/9470406/python-shapely-intersection-parallel-planesと関連しています - であるz座標無視される。 '220.0'の' x-'Coordinateの一様な値を削除して2Dの問題にすると、' poly1.equals(poly2) 'は' True'を返します。 – ewcz

答えて

2

ポリゴンコンストラクタは、二つの位置パラメータをとります。最初は(x、y [、z])ポイントタプルの順序付けられたシーケンスであり、LinearRingの場合とまったく同じように扱われます。

だから、前Polygonを作成(タプル)最初にそれらをソートしてみてください。

>>> pol1_coords = ([0, 1, 2], [3, 4, 5], [6, 7, 8]) 
>>> pol2_coords = ([0, 1, 2], [6, 7, 8], [3, 4, 5]) 
>>> Polygon(sorted(pol1_coords)) == Polygon(sorted(pol2_coords)) 
True 

代わりにあなたはまだこの問題を持っています:

>>> Polygon(pol1_coords) == Polygon(pol2_coords) 
False 
+0

これはオプションですが、そうではありません。非常にまっすぐ進むもの。ご覧のように、ポリゴンは閉じた図形で、最初の頂点も最後の頂点です。したがって、長方形の場合、5つの頂点があります。 2つのポリゴンが異なる頂点から始まる場合、ソートを行うには、それぞれの最後の頂点を削除する必要があります。これは、全体の平等関数を意味しない? – Yair

+0

''(x、y [、z]) ''のシーケンスに重複を避ける必要があります。その後、それらを並べ替えて等しくします。そうであれば。そうでなければ.equals関数は無意味です。 – turkus

+0

いいえ - OP上のコメントをチェックします.Z座標が無視されているためです – strubbly

1

@ewczがコメントで言うように、これは、Shapelyが実際にはXY平面内の2Dジオメトリでのみ機能するためです。ここではZ座標を無視しています。これらは、XY平面に投影されたときに有効なポリゴンではないため、Shapelyはそれらが等しいことに同意する準備ができていません。あなたはX(不要)を削除する場合には正常に動作座標:

from shapely.geometry import Polygon 

poly1 = Polygon(([220.0, 400, 500], [220.0, 20, 500], [220.0, 20, 0], [220.0, 400, 0], [220.0, 400, 500])) 
poly2 = Polygon(([220.0, 20, 500], [220.0, 400, 500], [220.0, 400, 0], [220.0, 20, 0], [220.0, 20, 500])) 

print (poly1.equals(poly2)) # False 

print poly1.is_valid # False 
print poly2.is_valid # False 

poly1 = Polygon(([400, 500], [20, 500], [20, 0], [400, 0], [400, 500])) 
poly2 = Polygon(([20, 500], [400, 500], [400, 0], [20, 0], [20, 500])) 

print (poly1.equals(poly2)) # True 

print poly1.is_valid # True 
print poly2.is_valid # True 

poly1 = Polygon(([220.0, 400], [220.0, 20], [220.0, 20], [220.0, 400], [220.0, 400])) 
poly2 = Polygon(([220.0, 20], [220.0, 400], [220.0, 400], [220.0, 20], [220.0, 20])) 

print (poly1.equals(poly2)) # False 

print poly1.is_valid # False 
print poly2.is_valid # False 
関連する問題