2016-09-05 49 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 
相关问题