2009-07-10 6 views
9

В настоящее время я занимаюсь данными GPS в сочетании с точным измерением высоты. Я хочу рассчитать расстояние между двумя точками. Существует много информации о расчете расстояния между двумя точками с использованием эллипсоида WGS84 и т. Д.Учитывать высоту при расчете геодезического расстояния

однако, я не нашел информации, которая принимает Высота Изменения в счете для этого расчет расстояния.

Кто-нибудь знает о некоторых веб-сайтах, документах, книгах и т. Д., Которые описывают такой метод? спасибо

Редактировать: Географические расширения Sql Server 2008 также игнорируют информацию о высоте при расчете расстояния.

+0

Я не смотрел на WGS84 уравнений, поэтому я не пишу это как ответ. Тем не менее, мне кажется, что вы должны иметь возможность настроить радиус или два, чтобы ваши измерительные точки были «новой» поверхностью. Это, вероятно, будет работать лучше всего, если ваши измерения высоты основаны на GPS; если на основе механических средств (например, давления воздуха), то «уровень моря» может иметь очень мало отношения к модельному геоиду. – kdgregory

+0

Вы когда-нибудь придумывали хорошее решение? – lnafziger

ответ

0

Я бы предположил, что на любом расстоянии, где использование WGS84 даст вам значительно лучшую точность, разница в высоте не будет иметь значения. И на любом расстоянии, где важна разница в высотах, вы, вероятно, должны просто использовать прямолинейное приближение.

0

Для этого первой проблемой, с которой вы должны обратиться, является определение изменения высоты. Нормальные уравнения работают, потому что они находятся на двумерной поверхности, однако добавление третьего измерения означает, что простое определение кратчайшего расстояния больше не применимо, например, теперь, когда четкое измерение «в игре», ваше кратчайшее расстояние может прорезать оригинал эллипсоид. Это немного быстро и грязно, но наилучшим решением может быть предположить, что скорость изменения общности постоянна вдоль исходного 2D-пути на эллипсоиде. Затем вы можете рассчитать двумерное расстояние как длину, выработать скорость изменения высоты, а затем просто использовать Pythagoras для расчета увеличения длины с одной стороной треугольника, являющейся 2D-расстоянием, а высота - второй.

6

Я реализовал функцию расстояния WGS84, используя среднюю начальную и конечную высоту как постоянную высоту. Если вы уверены, что по вашему пути будет относительно мало изменений высоты, это работает приемлемо хорошо (ошибка относительно разницы высот ваших двух точек LLA).

Вот мой код (C#):

/// <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); 
    } 

На практике мы обнаружили, что разница высот редко делает большую разницу, наши пути, как правило, 1-2ке долго с высотой варьирования порядка 100 м и мы видим около 5 м изменения в среднем по сравнению с использованием немодифицированного эллипсоида WGS84.

Edit:

Чтобы добавить к этому, если вы ожидаете большие изменения высоты над уровнем моря, вы можете конвертировать ваши координаты 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

Я считаю, что первоначальный вопросник хочет зафиксировать небольшое изменение расстояния, связанное с изменениями высоты; поэтому использование среднего или max alt или min alt не является решением. Прямые дистанции также не являются решением проблемы с высотой дифференциала, потому что у таких прямых нет соответствующего профиля подъема/спуска, который вы ожидаете от слова «Я преодолел 60 миль и изменил высоту на 20000 футов в этом время". Например. если конечная точка вашего а ниже горизонта, то первое, что делает путь, это туннель под землей. – jprete

0

Для начала вам нужна модель, которая расскажет вам, как высота изменяется на линии между двумя точками. Без такой модели у вас нет постоянного определения расстояния между двумя точками.

Если у вас была линейная модель (перемещение 50% расстояния между точками также означает, что вы поднялись вверх на 50% от высоты), то вы, вероятно, можете притвориться, что все это был правый треугольник; т. е. вы действуете так, как будто мир плоский для определения того, как сдвиг высоты влияет на расстояние. Расстояние по земле - основание, изменение высоты - это высота треугольника, а гипотенуза - это ваше истинное расстояние от точки к точке.

Если вы хотите уточнить это дальше, то вы можете заметить, что вышеприведенная модель отлично подходит для бесконечно малых расстояний, что означает, что вы можете перебирать отдельные дельта расстояния, исчисления, каждый раз, используя текущую высоту для вычисления расстояния на земле и затем с использованием одного и того же тригонометрического отношения для вычисления вклада изменения высоты в пройденное расстояние. Я бы, вероятно, сделал это в цикле for() с 10-100 частями сегмента и, возможно, путем проб и ошибок вычислил количество штук, необходимых для получения эпсилона истинного значения. Можно было бы также разработать линейный интеграл для определения фактического расстояния между двумя точками в рамках этой модели.

0

Вы, вероятно, не заботитесь о высоте для больших 2D расстояний. Так что, если у вас есть превышение, скажите 20 (или, может быть, 50) км, то кто заботится об абсолютной разности (зависит от вашего требования). Говорят, что в 20 км подаются простые пифагорейские дополнения к разнице высот. Кормите его плавно.

Distance between two geo-points?