2016-09-05 50 views
1

我遇到了一些問題, 現在等號功能似乎並不總是工作:Python身材勻稱:.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-'座標的統一值來將它降低到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個多邊形從一個不同的頂點開始 - 我將不得不移除每個頂點的最後一個頂點以進行排序。這使得整個.equals函數沒有意義? – Yair

+0

你需要避免在''(x,y [,z])''序列中出現重複。然後對它們進行排序並平等以這種方式。否則.equals函數將毫無意義。 – turkus

+0

否 - 檢查對OP的評論 - 這是因爲Z座標被忽略 – strubbly

1

由於@ewcz在評論中說,這是因爲Shapely只能在XY平面上與2D幾何圖形一起工作。這裏忽略了Z座標。投影到XY平面時,這些不是有效的多邊形,所以Shapely不準備同意它們是平等的。如果您刪除(不必要的)×它正常工作協調:

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 
相關問題