Принятие во внимание высоты при вычислении геодезического расстояния

bad_cast только брошен при кастинге ссылок

dynamic_cast< Derived & >(baseclass)

, ПУСТОЙ УКАЗАТЕЛЬ возвращается при кастинге указателей

dynamic_cast< Derived * >(&baseclass)

, Таким образом, никогда нет потребности проверить обоих.

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

12
задан luvieere 7 October 2009 в 22:07
поделиться

4 ответа

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

0
ответ дан 2 December 2019 в 22:38
поделиться

Я реализовал функцию расстояния 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.

Редактировать:

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

8
ответ дан 2 December 2019 в 22:38
поделиться

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

0
ответ дан 2 December 2019 в 22:38
поделиться

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

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

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

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

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

0
ответ дан 2 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: