2015-01-30 2 views
1

안녕하세요 빙지도의 다각형 면적을 계산하는 데 문제가 있습니다. 이 코드를 사용하여 면적을 계산합니다.빙지도의 다각형 면적

public static double PolygonArea(LocationCollection points, double resolution) 
    { 
     int n = points.Count; 
     var partialSum = 0.0; 
     var sum = 0.0; 

     for (int i = 0; i < n - 1; i++) 
     { 
      partialSum = (points[i].Longitude * points[i + 1].Latitude) - 
       (points[i + 1].Longitude * points[i].Latitude); 
      sum += partialSum; 
     } 

     var area = 0.5 * sum/Math.Pow(resolution, 2); 
     area = Math.Abs(area); 
     return area; 
    } 

이것은 내가 m^2을 trasform 어떻게 해결 방법

public static double Resolution(double latitude, double zoomLevel) 
    {     
     double groundResolution = Math.Cos(latitude * Math.PI/180) * 
     2 * Math.PI * EARTH_RADIUS_METERS/(256 * Math.Pow(2, zoomLevel)); 

      return groundResolution; 
    } 

입니까?

EDIT1 : 답변을 시도했지만 확대/축소 수준을 변경하면 해당 영역이 변경된 것으로 나타났습니다.

다른 문제에서 내 문제를 설명하려고합니다. 나는 지역

-(long double)calcArea :(CLLocationCoordinate2D*) pastureCordinates :(long) count { 
    long double area = 0.0; 
    long double scale = 0.0; 

    for (int cnt = 1; cnt < count; cnt++) { 
     area += (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).x) 
     * (MKMapPointForCoordinate(pastureCordinates[cnt]).y) 
     - (MKMapPointForCoordinate(pastureCordinates[cnt]).x) 
     * (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).y); 
    } 

    area += (MKMapPointForCoordinate(pastureCordinates[count - 1]).x) 
    * (MKMapPointForCoordinate(pastureCordinates[0]).y) 
    - (MKMapPointForCoordinate(pastureCordinates[0]).x) 
    * (MKMapPointForCoordinate(pastureCordinates[count - 1]).y); 

    scale = MKMapPointsPerMeterAtLatitude(pastureCordinates[count -1].latitude); 
    area = (area/(long double)2)/pow(scale,2); 

    area = fabsl(area); 
    return area; 

}

내가 사용을 여기에있는 함수를 계산하기 위해이 알고리즘을 사용하는 iOS 앱의 포팅 확인해야합니다 : 규모, 지상 해상도를 계산하는 https://msdn.microsoft.com/en-us/library/bb259689.aspx을하지만 결과가 다릅니다 iOS 솔루션에 비해

+0

이 링크는 도움이 될 수 있습니다. http://stackoverflow.com/a/36090029/3918500 –

답변

2

좋아, 나는 몇 가지 코드로 놀아 보았고 정말 깊이있는 공간 수학을 사용하지 않고도 상당히 정확하게 면적을 계산하는 간단한 방법을 모았습니다. 다양한 다각형 및 SQL에서 계산 된 영역에 비교와

private double CalculateArea(LocationCollection locs) 
{ 
    double area = 0; 
    for (var i = 0; i < locs.Count - 1; i++) 
    { 
     area += Math.Atan(
      Math.Tan(Math.PI/180 * (locs[i + 1].Longitude - locs[i].Longitude)/2) * 
      Math.Sin(Math.PI/180 * (locs[i + 1].Latitude + locs[i].Latitude)/2)/
      Math.Cos(Math.PI/180 * (locs[i + 1].Latitude - locs[i].Latitude)/2)); 
    } 

    if (area < 0) 
    { 
     area *= -1; 
    } 

    return area * 2 * Math.Pow(6378137.0, 2); 
} 

시험이, 나는 엄청나게 큰 다각형을 사용하는 경우 최악의 경우에 차이가 약 0.673 % 것을 발견했다. 크기가 약 0.5 제곱 킬로미터 인 다각형에 대해 테스트 할 때, 그 차이는 약 0.06 %였다. 이 메서드는 평방 미터 단위로 영역을 반환합니다.

+0

감사합니다. 귀하의 솔루션은 올바른 방법에 가깝지만 몇 가지 문제가 있습니다! 결과는 ios 솔루션과 비교하여 다릅니다. 예를 들어, 같은 폴리곤에 대해 iOS 3805 m^2 및 Win 3686 m^2가 있습니다. –

+0

여기에는 여러 가지 이유가있을 수 있습니다. 가장 단순한 차이 중 하나는 계산에서 지구 반경에 사용되는 값입니다. 지구는 완전한 구가 아니므로 반경은 대개 근사됩니다. 이것에 대한 다른 많은 이유가있을 수 있습니다. 누가 iOS 솔루션이 올바른지 말해야합니다. 다각형 좌표를 제공하면보다 진보 된 공간 도구를 테스트 할 것입니다. – rbrundritt

+0

확인. 원래 질문에 iOS 솔루션을 추가했습니다. 최대한 빨리 좌표 세트를 게시하겠습니다 ... –

0

지도에서 다각형의 면적을 계산하는 것은 매우 복잡합니다. 왜냐하면 세계가 구이고 실제로 구의 표면에 펼쳐지는 다각형의 면적을 계산하려고하기 때문입니다. WPF를 사용하고 있기 때문에 SQL Server에서 사용할 수있는 공간 라이브러리를 쉽게 만들고 사용할 수있는 방법을 제안합니다. SQL Server의 모든 공간 기능은 WPF 응용 프로그램에서 사용할 수있는 dll로 사용할 수 있습니다. 이 라이브러리를 사용하여 폴리곤의 면적을 정확하게 계산하고 다른 많은 강력한 작업을 수행 할 수 있습니다. 우선 SQL을 설치했다면 C : \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Shared 디렉토리에있는 SQL Spatial Library (Microsoft.SqlServer.Types)를 찾을 수 있습니다. SQL Server가 설치되어 있지 않은 경우 설치하지 않아도되므로이 라이브러리를 Nuget 패키지로 사용할 수 있습니다. https://www.nuget.org/packages/Microsoft.SqlServer.Types

사용 방법은이 실습실을 살펴보십시오. .NET의 SQL 공간 도구 : http://view.officeapps.live.com/op/view.aspx?src=http%3A%2F%2Fecn.channel9.msdn.com%2Fo9%2Flearn%2FSQL2008R2TrainingKit%2FLabs%2FUsingSpatialDataInManagedCode%2FLab.docx

일단이 라이브러리가 있으면 다각형에서 SQL Geography 개체를 만들 수 있습니다. 이 작업이 끝나면 STArea 메서드를 사용하여 다각형의 면적을 계산할 수 있습니다. 정말 강력한 매핑 애플리케이션을 만드는 데 사용할 수있는 다양한 공간적 방법도 있습니다.

+0

감사합니다. 그러나 SQL Server는 무료입니까? 무료 메서드가 필요합니다. –

+0

SQL 서버는 필요 없으며 무료로 사용할 수있는 공간 라이브러리 만 필요합니다. 공간 라이브러리는 SQL의 무료 버전 인 SQL Express에서도 사용할 수 있습니다. 즉, NUGET 패키지를 사용하여 라이브러리를 얻으십시오. – rbrundritt

+0

좋습니다. 이제 아키텍처에 따라 런타임에 올바른 어셈블리를로드하는 방법을 이해하지 못합니다. –