2016-09-05 4 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와 관련이 -는 IS Z 좌표 무시. '220.0'의'x-'Coordinate의 uniform 값을 제거하여 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 

대신이 문제가 계속해야합니다 : @ewcz이 코멘트에 말했듯이

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

글쎄, 그건 옵션이지만 그렇지 않습니다. 아주 똑 바른 앞으로 것. 보시다시피 다각형은 닫힌 도형이며 첫 번째 꼭지점도 마지막 것입니다. 그래서 사각형의 경우 5 개의 정점이 있습니다. 2 개의 폴리곤이 다른 버텍스에서 시작한다면, 정렬을하기 위해 각각의 마지막 버텍스를 제거해야 할 것입니다. 그렇다면 전체. 평등 함수는 의미가 없습니까? – Yair

+0

''(x, y [, z])'시퀀스에 중복을 피할 필요가 있습니다. 그런 다음 정렬하고 평등하게하십시오. 그런 식으로. 그렇지 않으면. equals 함수는 무의미합니다. – turkus

+0

아니요 - OP에서 주석을 확인하십시오. Z 좌표가 무시되기 때문입니다. – strubbly

1

을, 이는 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