2009-07-10 11 views
9

현재 정확한 고도 측정과 결합 된 GPS 데이터를 다루고 있습니다. 두 개의 연속 점 사이의 거리를 계산하고 싶습니다. WGS84 타원체를 사용하여 두 점 사이의 거리를 계산하는 방법에 대한 정보는 입니다.계측 거리를 계산할 때 고도를 고려하십시오.

그러나이 정보를 찾지 못했습니다 고도이 거리 계산을 위해 변경되었습니다.

누구나 이러한 방법을 설명하는 웹 사이트, 논문, 서적 등을 알고 있습니까? 감사합니다

: Sql Server 2008 지리적 확장 또한 거리를 계산할 때 고도 정보를 무시합니다.

+0

나는 WGS84 방정식에보고하지 않은, 그래서 대답으로이 글을 쓰는 있지 않다. 즉, 측정 지점을 "새로운"표면으로 만들려면 반경 또는 두 개를 조정할 수 있어야합니다. 이것은 아마도 고도 측정이 GPS 기반이라면 가장 잘 작동 할 것입니다. 기계적 수단 (예 : 공기압)을 기반으로한다면, "해수면"은 모델 지오이드와의 관계가 거의 없을 수 있습니다. – kdgregory

+0

당신은 이것에 대한 좋은 해결책을 내놓은 적이 있습니까? – lnafziger

답변

0

나는 WGS84를 사용하면 고도의 차이가 중요하지 않은 정확도가 훨씬 더 높아진다는 것을 제안합니다. 그리고 고도 차이가 중요한 어떤 거리에서도 직선 근사를 사용해야합니다.

0

이렇게하기 위해서는 먼저 고도 변화를 정의하는 방법이 있습니다. 정상 방정식은 2 차원 표면에 있기 때문에 작동하지만 3 차원을 추가하면 최단 거리에 대한 간단한 정의가 더 이상 적용되지 않습니다. 예를 들어 thrid 차원이 '작동 중'인 경우 최단 거리가 원본을 통과 할 수 있습니다. 타원체. 약간 빠르고 빠르지 만 최선의 해결책은 타원체의 원래 2D 경로를 따라 모든 변화율이 일정하다고 가정하는 것일 수 있습니다. 그런 다음 2D 거리를 길이로 계산하고 고도 변화율을 계산 한 다음 피타고라스를 사용하여 삼각형의 한면이 2D 거리이고 고도가 두 번째 길이 인 길이의 증가를 계산할 수 있습니다.

6

시작 고도와 종료 고도의 평균을 상수 고도로 사용하여 WGS84 거리 함수를 구현했습니다. 당신의 경로를 따른 고도 변화가 비교적 적다는 것이 확실하다면 이것은 잘 작동합니다 (오류는 두 LLA 포인트의 고도 차이에 비례합니다). 우리는 고도 차이가 거의 큰 차이가없는 것으로 나타났습니다 실제로

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

는, 우리의 경로는 일반적으로 고도가 100m 정도의 변화와 함께 긴 1-2km됩니다 여기

내 코드 (C#을)입니다 수정되지 않은 WGS84 타원체를 사용하는 것보다 평균 5m 정도의 변화가 있음을 알 수 있습니다.

편집 :

당신이 큰 고도 변화를 기대한다면, 당신은 당신의 WGS84는 ECEF (지구가 지구가 고정)를 중심 좌표를 변환 할 수 있습니다, 여기에 추가하고 하단에 그림과 같이 직선 경로를 알아보고자 내 기능. ECEF에 포인트를 변환하는 것은 할 간단하다 :

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

편집 2 : 내 코드에서 다른 변수의 일부에 대해 질문했다

:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer 내가 사용하는 클래스입니다 LatLonAlt 좌표를 ECEF 좌표로 변환하고 위의 상수를 정의합니다.

+0

질문자가 고도가 사실상 일정한 상황에 대해 묻고 있다고 생각하지 않습니다. 요점은 두 점 사이의 고도가 크게 다른 두 지점 사이의 큰 원형 스타일의 거리를 찾는 것입니다. – jprete

+0

아마 내가 명확히하지는 않았지만 내 솔루션은 두 점의 고도를 평균화하고 그 값을 일정하게 부릅니다. 두 개의 고도를 사용하여 측지선 거리를 평가하는 것은 시간 소모적이며 근사가 매우 좋은 결과를 얻을 때 특히 어렵습니다. –

+0

원래의 질문자는 고도 변화로 인한 거리의 약간의 변화를 포착하기를 원합니다. 그래서 평균, 최대 alt 또는 최소 alt를 사용하는 것이 해결책이 아닙니다. 직선 거리는 고도 차등 문제에 대한 해결책이 아닙니다. 왜냐하면 그러한 직선은 "내가 60 마일을 여행했고 고도를 20000 피트 증가 시켰을 때의 적절한 상승/하강 프로파일을 가지고 있지 않기 때문입니다 시각". 예 : 너의 마지막 지점이 지평선 밑이라면 길의 첫 번째 일은 땅 아래에서 터널을 돌리는 것이다. – jprete

0

처음에는 두 지점 사이의 선상에서 고도가 어떻게 변하는 지 알려주는 모델이 필요합니다. 그러한 모델이 없으면 두 점 사이의 거리에 대한 일관된 정의가 없습니다.

선형 모델 (점 사이의 거리의 50 %를 이동하는 것이 고도의 50 %까지 올라 갔다는 것을 의미 함)가 있다면, 전체 점이 직각 삼각형 인 것처럼 가장 할 수 있습니다. 즉 고도 변화가 거리에 미치는 영향을 결정할 목적으로 세계가 평평한 것처럼 행동합니다. 지면을 따라 거리가 기준이며, 고도 변화는 삼각형의 높이이며, 빗변은 예상되는 실제 거리입니다.

더 자세히 다듬 으려면 위의 모델이 무한 거리에 완벽하게 적합하다는 것을 알 수 있습니다. 즉, 현재 고도를 사용할 때마다 거리, 미적분 스타일의 개별 델타를 반복 할 수 있습니다 지상 거리를 계산 한 다음 동일한 삼각 함수 비율을 사용하여 이동 거리에 대한 고도 변화 기여도를 계산합니다. 아마도 for() 루프에서 세그먼트의 10 ~ 100 개 조각을 사용하고 실제 값의 엡실론 안에 들어가기 위해 필요한 조각 수를 시행 착오를 계산할 수 있습니다. 또한이 모델에서 두 점 사이의 실제 거리를 계산하기 위해 선분을 계산할 수도 있습니다.

0

큰 2D 거리 분리에 대해서는 고도를 신경 쓰지 않을 가능성이 높습니다. 그래서 만약 당신이 얻는 dist가 20 (또는 아마도 50) km 이상이라면, 고도 차를 걱정하는 누가 (당신의 필요에 따라). 20km라고 말하면서, 고도 차이에 단순한 피타고라스가 추가됩니다. 그것을 부드럽게 먹이십시오.

Distance between two geo-points?

관련 문제