2016-07-02 4 views
-1

어떤 목적을 위해 여러 위도와 경도를 결합한 끝점으로 폴리곤을 그립니다.파이썬에서 닫힌 다각형을 생성하기 위해 끝점을 포함하는 배열을 다시 배열하십시오.

fig=plt.figure() 
ax = plt.gca() 

x_map1, x_map2 = 114.166,114.996 
y_map1, y_map2 = 37.798,38.378 

map = Basemap(llcrnrlon=x_map1,llcrnrlat=y_map1,urcrnrlon=x_map2,urcrnrlat=y_map2) 
map.drawparallels(np.arange(y_map1+0.102,y_map2,0.2),labels=[1,0,0,1],size=14,linewidth=0,color= '#FFFFFF') 
map.drawmeridians(np.arange(x_map1+0.134,x_map2,0.2),labels=[1,0,0,1],size=14,linewidth=0) 

bo_x = [114.4390022, 114.3754847, 114.3054522, 114.3038236, 114.2802081, 114.2867228, 114.3378847, 114.3888619, \ 
    114.6288783, 114.6848733, 114.7206292, 114.7341219] 
bo_y = [38.16671389, 38.14472722, 38.14309861, 38.10156778, 38.08853833, 38.06980889, 38.03587472, 37.96409056, \ 
    37.84975278, 37.84840333, 37.9017, 38.16683306] 

x, y = map(bo_x, bo_y) 
xy = zip(x,y) 
poly = Polygon(xy, facecolor='red', alpha=0.4) 
plt.gca().add_patch(poly) 

그림은 다음과 같이 나타낸다 :

예 데이터는 다음과 같이 표시

enter image description here

을 그러나 Lons 배열 Lats 어레이가 반 시계 순서가 아닌 경우, 배열에는 수동으로 조정하기 어려운 많은 항목이 포함되어 있습니다. 다각형 출력이 부적합 함을 나타낼 수 있습니다. 여기

는, 나는 상상의 상황과 bo_xbo_y을 조직을 파괴.

enter image description here

그래서 여기 내 질문 : 같은

bo_x_adjust = [114.4390022, 114.3754847, 114.3054522, 114.3038236, 114.6288783, 114.6848733, 114.7206292, 114.7341219, 
     114.2802081, 114.2867228, 114.3378847, 114.3888619,  ] 
bo_y_adjust = [38.16671389, 38.14472722, 38.14309861, 38.10156778, 37.84975278, 37.84840333, 37.9017, 38.16683306, 
     38.08853833, 38.06980889, 38.03587472, 37.96409056,  ] 

그림을 보여줍니다. 가끔, 원래의 끝점은 닫힌 다각형을 출력 할 수있는 순서가 아닙니다. 미리 배열을 구성하는 것이 좋습니다. 엔드 포인트 쌍을 중단하지 않도록하기위한 목적으로 동 기적으로 조정해야한다이 두 배열의

  • 요소 :

    나는 두 가지 원칙을 따라야합니다 bo_xbo_y 같은 배열의 순서를 조정하는 생각 (X ~ Y)

  • 새 배열은 2 차원 공간에서 시계 방향 또는 반 시계 방향 순서로 윤곽을 지정해야합니다.

조언이나 지침을 따르십시오.

답변

1

아직 답변이 없지만 이미지 첨부 기능이 필요했습니다.

문제가 잘못 정의되었을 수 있습니다. 예를 들어,이 두 정당한 폴리곤은 동일한 정점을가집니다.

polygon 1 polygon2

당신이 중 하나를 얻을시겠습니까?

+0

오 최선의 다각형을 제공하지 않습니다! 나는 그것에 대해 생각하지 않았다! –

+0

출력이 어떤 가능성을 보여줄 수 있다면, 좋을 것입니다! –

1

여기 선형 대수학으로 원하는 것을 풀 수있는 방법이 있습니다. 죄송하지만 저는 일반적인 지침 만 쓰고 있습니다. 그럼에도 불구하고 작동해야합니다.

  1. 두 개의 에지 번호 j와 k를 허용하고 교차가 있는지 확인하는 함수를 작성하십시오. 마지막 첫 번째 꼭지점 모서리를 올바르게 처리해야합니다. 또한 인접 가장자리가 항상 정의에 의해 교차하기 때문에 'False'를 지정해야합니다.

이제 두 모서리가 교차하는지 알아 보는 방법은 약간의 대수를 따르는 것입니다. 각 모서리에서 y = a * x + b로 직선 매개 변수 a와 b를 추출합니다. 그런 다음 a1 * x + b1 == a2 * x + b2를 등식으로써 교차점 x를 찾기 위해 두 모서리를 푸십시오. 두 에지의 교차점 x가 모서리의 꼭지점 x 사이에 있으면 두 에지가 실제로 교차합니다.

  1. 모든 가장자리 쌍을 검사하고 교차점을 테스트하는 함수를 작성하십시오. 교집합이 존재하지 않는 경우에만 다각형이 합법적입니다.

다음 당신은 두 가지 방법으로 갈 수 있습니다

  1. 포괄적 인 접근 방식 - 정점의 모든 가능한 순열을 통해 이동합니다. 교차에 대한 각 순열 다각형을 테스트하십시오. permutating 할 때 x와 y를 함께 permutate 할 필요가있다. 많은 순열이 있으므로 매우 시간이 많이 걸릴 수 있습니다.

  2. 욕심 많은 접근법 - 교차점이있는 한 가장자리 쌍의 조합을 건너 뛰고 교차점이있을 때마다 단순히 마지막 두 가장자리 좌표를 전환합니다 (교차점 해제). 그런 다음 모든 가장자리 쌍을 다시 시작합니다. 더 이상의 교차로가 없을 때까지 이것을 반복하십시오. 이것은 많은 가능성이있을 것입니다, 꽤 빨리 작동해야하지만 (예를 들어, 가장 큰 다각형 영역을 최적화하지 않습니다)이 도움이

희망 ...