2016-09-01 3 views
13
나는 지역을 그리기있어

의 "시각적"센터를 찾을 수는 SQL 공간 데이터를 (C#)를 사용 (SqlGeometry/SqlGeography을 사용하고 WPF LocationCollection 동등한로 번역) 빙지도 WPF 컨트롤에 그들을 레이블에 필요한 . 나는 지역에 그려진 라벨을 붙이고 STCentroid()에 의해 발견 된 지점에 붙였다. 물론 이것은 당신이 생각하기에 이것은 중심이 영역 밖에서 끝나는 'U'또는 'C'자형 영역의 문제이므로 라벨을 부정확하게 만듭니다.불규칙한 다각형

SqlGeometry/SqlGeography을 사용하여 "시각적"센터를 찾거나 해당 모양을 사용하고 해당 센터를 사용할 수있는 가장 큰 원을 찾을 수 있습니까? 나는 STPointOnSurface()를 사용 various methods 해봤지만 STPointOnSurface() 항상 바닥 짙은 녹색 지역에 대한 라벨이 항상 가장자리에 끝납니다 그래서 DCREHA (같은 가장자리에 포인트를 선택합니다 보인다 :

enter image description here

+0

에만 존재한다고 가정 하나의 모양, 한 가지 해결책은 열린면을 찾아 레이블이 모양 안에있을 때까지 반대쪽으로 움직이는 것입니다. 일부 영역을 제거하기 위해 일부 필터링을 수행 할 수도 있습니다. 또는 가장 큰 오목한 영역을 찾으려고 할 수도 있습니다 (알고리즘이 있는지는 모르겠습니다). – Phil1970

+0

관련 : http://stackoverflow.com/q/1203135/3628232 –

+0

U 모양의 "시각 중심"은 어디에 있습니까? –

답변

9

거의 동일한에게 질문이 이미 접수되었습니다 here. 귀하의 경우 가장 관련있는 답변은 아마도 this입니다. 그 대답의 어려운 부분은 다각형을 두 개의 동일한 영역으로 나누는 선을 그리는 위치를 결정하는 것이므로 약간 수정 된 버전을 제안합니다 SQL 서버에 대한 아래 :

  1. STCentroid을 사용하면 무게 중심을 찾을 수 있습니다.
  2. 다각형 (STWithin) 안에 있으면 더 이상 처리 할 필요가 없습니다. 그렇지 않으면 :
  3. 은 (는 충분 될 수있다 (예 : 다각형의 봉투를 얻을 수 STEnvelope를 사용 STCentroid의 인수로 그 전달)이 중심이 다각형 (STWithin) 내에있는 경우
  4. 다각형의 경계 상자의 중심을 결정 테스트가 필요할 것입니다.) 그렇지
  5. 는 단지 각 방향으로 다각형의 봉투 넘어서까지 연장되도록 다각형의 중심을 상기 봉투의 무게 중심을 연결하는 선의 연장 (C# 코드에 쉽게 될 수있다, 또는 PostGIS와 솔루션 here 참조) 결정
  6. 을 확장 된 선과 다각형 사이의 교차점
  7. 1 단계에서 다각형의 중심 점에 가장 가까운 교차점을 찾습니다 (here 참조). 이 점은 linked answer에 자세히 설명 된 "첫 번째 절단 점"의 근사치입니다.
  8. 위의 7 단계에서 발견 된 교차점과 가장 가까운 교차점을 찾으십시오.이 점은 linked answer에 설명 된 "두 번째 절단 점"의 근사값입니다.
  9. 두 교차점을 연결하는 선의 중간 점은 다각형 내부에 있으며 다각형의 "시각 중심"에 대한 합리적인 근사값이어야합니다. 상기 DCREHA의 예 다각형 주어진 예컨대

은 다음 GIF 위에서 설명한 절차를 애니메이트 (눈에 의해 판단 - 실제 결과가 다를)

enter image description here

+1

내가이 일을 끝내고 (비슷한 문제가있는 사람이라면 누구나 할 수있는 일) 매우 가까워서이 사실을 받아 들일 것입니다. 나는 중력, N, NE, E, SE, S, SW, W에 centroid에서 8 개의 광선을 주조 (실제 모양과 뷰 박스에 의해 형성된 모양으로 그 선의 교차점을 취함)했다. , 측정 한 후 가장 긴 최종 선의 중간 점에 레이블을 붙였습니다. – Hershizer33

관련 문제