На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Отклонение от курса при использовании функции mapDirectPositionComputation

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1
RSS
Отклонение от курса при использовании функции mapDirectPositionComputation
 
Добрый день!
Помогите пожалуйста понять, в чем может быть ошибка в моих вычислениях:

Есть карта Татарстана, WGS-84, в проекции Меркатора, вызываем метод mapDirectPositionComputation со следующими параметрами:

double radLatitude(0.9599310885968813), radLongitude(0.8377580409572782); // координаты 55 СШ, 48 ВД
double azimuth(1.5707963267948966); // курс 90 градусов
double resRadianLatitude, resRadianLongitude, resultAzimuth;
mapDirectPositionComputation(m_mapView->GetMapHandle(), radLatitude, radLongitude, azimuth, 250000, &resRadianLatitude, &resRadianLongitude, &resultAzimuth);

После выполнения получаем:
resRadianLatitude = 0.95883501419510186 - 54.93719956274572 градусов
resRadianLongitude = 0.90602364848688555 - 51.911331197342996 градусов
resultAzimuth = 4.7682945838160551 - 273,20315512774931 градусов

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

Заранее благодарен за помощь!
Изменено: Андрей Лаптев - 29.04.2016 16:06:01
 
Между двумя точками на одной широте кратчайший путь по эллипсоиду не проходит по линии параллели.
Он будет идти по дуге, которая будет подыматься (в северном полушарии) над серединой отрезка на параллели, соединяющей две точки.
Соответственно азимут между двумя точками на одной широте будет не 90 градусов, а скажем 87 (зависит от расстояния).
А с азимутом 90 градусов Вы попадаете южнее, поскольку двигаетесь по кратчайшему расстоянию по эллипсоиду.

Попробуйте вообразить сечение шара из центра шара (не из центра дуги параллели на широте параллели!) и получите требуемую дугу (ортодромию).

Цилиндрическая проекция (в которой Вы условно рассуждаете) удобна для приблизительных построений, но она, в частности, неверно передает расстояния.

Если у Вас координаты в системе WGS-84, то в функцию mapDirectPositionComputation не нужно передавать HMAP. Если этот параметр равен 0,
то вычисление идет на эллипсоиде WGS-84, иначе - на эллипсоиде открытой карты (или текущего эллипсоида документа).
 
Спасибо большое за развернутый ответ! Вы очень помогли определиться с терминами, похоже, вся проблема в том, что нам необходимо строить локсодромию вместо ортодромии (так ведет себя отслеживаемый нами объект). В mapapi есть построение локсодромии между двумя точками, но нам нужны аналоги mapDirectPositionComputation и mapInversePositionComputation. В интернете есть формулы для шара, но мы все-таки используем конкретные заданные sxf эллипсоиды. Есть ли в панораме соответствующие функции для получения по локсодромии путевого угла и расстояния между двумя точками и получение второй точки по заданной первой, путевому углу и расстоянию между ними?
Изменено: Андрей Лаптев - 05.05.2016 14:44:35
 
Функция построения локсодромии по двум точкам есть -

Код
 // Построение локсодромии
 // first - координаты первой точки в радианах
 // second - координаты второй точки в радианах
 // array - адрес массива координат построенной локсодромии,
 //         размер массива равен count
 // count - количество точек для построения локсодромии
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapLoxodrome(DOUBLEPOINT *first, DOUBLEPOINT *second,
                                      DOUBLEPOINT *array, long int count);


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

Длину отрезка можно получить, например, так:
Код
 // Вычисление расстояния между двумя точками на местности
 // hmap   - идентификатор открытых данных
 // point1, point2 - координаты точек в метрах на местности
 // Для вычисления расстояния координаты пересчитываются
 // в проекцию топографической карты с установкой осевого
 // меридиана в центре отрезка
 // При ошибке возвращает 0

_MAPIMP double _MAPAPI mapRealDistance(HMAP hmap, DOUBLEPOINT *point1, DOUBLEPOINT *point2);
 
То есть, если я правильно понял, в отличии от реализованных методов для решения задач на эллипсоиде по ортодромии, в нашем случае нужно разбивать маршрут на отрезки, суммировать длины, плюс брать азимут первого отрезка(когда известны только начальная и конечная точка, то азимут не известен). Подскажите, как оптимальнее разбивать маршрут по отрезкам, чтобы как можно точнее посчитались расстояние и азимут? По двум точкам заранее расстояние не знаем, соответственно, не сделаешь, чтобы отрезки всегда оказывались одной длины.
А как быть в случае, когда нужно рассчитать вторую точку по азимуту и длине маршрута?
 
Деление на отрезки - это итерационный процесс. Он останавливается обычно при достижении заданной точности измерений.
То есть, когда результат начинает изменяться в пределах заданной погрешности.

Функция расчета второй точки по азимуту и расстоянию известна:

Код
 // Прямая геодезическая задача на эллипсоиде
 // Для расстояния не более 250 км координаты определяются с ошибкой до 0,0001",
 // а обратный азимут - до 0,001", что соответствует триангуляции 1 класса
 // Способ вспомогательной точки по методу Красовского
 // Метод предназначен для расстояний меньше радиуса Земли
 // Вычисления выполняются на текущем эллипсоиде, установленном
 // в документе - mapSetDocProjection
 // Если hmap равен 0, то вычисления выполняются на эллипсоиде WGS-84
 // hmap     - идентификатор открытых данных
 // b1,l1    - геодезические координаты исходной точки
 // angle1   - азимут на вторую точку
 // distance - расстояние до второй точки
 // b2,l2    - рассчитанные координаты второй точки
 // angle2   - рассчитанный азимут со второй точки на первую
 //            (если angle2 равен 0, то обратный азимут не вычисляется)
 // При ошибке в параметрах возвращает 0

_MAPIMP long int _MAPAPI mapDirectPositionComputation(HMAP hmap,
                                                      double b1, double l1, double angle1,
                                                      double distance,
                                                      double *b2, double *l2, double *angle2);



Но при больших расстояниях азимут в любом случае меняется по мере продвижения ко второй точке по кратчайшему пути.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности