То что я поняла: 1 Пересчет геодезических координат от одного эллипсоида до другого делается по формулам и в целом умею это делать. 2. Для перехода от системы высот до геодезических координат нужены данные соответствующего геоида.
Тагда вопросы. 1. Есть ли у вас функция, которая делает перевод высоты из геодезической в геодезическую другого эллипсоида, для всех эллипсоидов, поддерживаемых MTW 2. Есть ли у вас доступные данные для пересчета из балтийской системы высот в высоты Эллипсоида WGS84?
внизу страницы под описанием Модель геоида EGM2008.
Например, если у Вас высота в Балтийской системе высот или в системе MSL, то она не может быть пересчитана при смене системы координат или эллипсоида. Она сначала должна быть переведена в геодезическую высоту. И т.д.
Открыть модель геоида можно функциями:
Код
// Открытие матрицы (Egm2008 или другой)
// Если имя файла не задано (mtrname равно 0), то проверяется наличие следущих
// матриц в папке приложения:
// egm2008_1min.mtw (размер элемента 1 минута)
// egm2008_2.5min.mtw (размер элемента 2.5 минуты)
// При нахождении матрицы выполняется ее открытие
// mtrname - путь к открываемой модели геоида/квазигеоида (MTW) или 0
// multithread - признак применения матрицы в потоке (если не равен 0, то открывается отдельно,
// независимо от наличия уже открытой ранее матрицы, со своим буфером для чтения блоков)
// Каждый поток должен иметь свой идентификатор открытой матрицы,
// полученный с параметром multithread равным 1
// Возвращает идентификатор открытой матрицы Egm2008
// При ошибке возвращает 0
_MAPIMP HANDLE _MAPAPI mapOpenEgmPro(const WCHAR *mtrname, long int multithread);
_MAPIMP HANDLE _MAPAPI mapOpenEgm2008Un(const WCHAR *mtrname);
_MAPIMP HANDLE _MAPAPI mapOpenEgm2008(const char *mtrname);
// Закрытие матрицы
// hmtr - идентификатор открытой матрицы
_MAPIMP void _MAPAPI mapCloseEgm(HANDLE hmtr);
_MAPIMP void _MAPAPI mapCloseEgm2008(HANDLE hmtr);
// Чтение высоты геоида/квазигеоида над поверхностью эллипсоида wgs84
// по геодезическим координатам на эллипсоиде WGS84
// hmtr - идентификатор открытой матрицы
// interptype - тип интерполяциия
// 1 - ближайший сосед
// 2 - интерполяция по ближайшим 3 элементам
// 3 - билинейная интерполяция по 4 ближайшим элементам
// 4 - бикубическая интерполяция по 16 ближайшим элементам
// b - широта точки на эллипсоиде WGS84 в радианах
// l - долгота точки на эллипсоиде WGS84 в радианах
// h - возвращаемая высота геоида над эллипсоидом WGS84 в метрах (поправка)
// При переходе от геодезической высоты WGS84 к нормальной высоте (MSL)
// необходимо вычесть полученную поправку
// При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapReadEgm(HANDLE hmtr, long int interptype, double b, double l, double *h);
_MAPIMP long int _MAPAPI mapReadEgm2008(HANDLE hmtr, long int interptype, double b, double l, double *h);
// Запросить имя открытой матрицы
// hmtr - идентификатор открытой матрицы
// При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapGetEgmName(HANDLE hmtr, WCHAR * name, long int size);
Преобразование высот можно выполнить, в частности, через функции:
Код
// Преобразование нормальной высоты (MSL) к геодезической (WGS84)
// B,L - геодезические координаты (WGS-84) в радианах для точки, в которой пересчитывается высота
// hegm - идентификатор модели геоида, открытой mapOpenEgmPro
// H - высота в метрах
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapNormalHeightToGeoHeightWGS84(double B, double L, double *H, HANDLE hegm);
// Преобразование геодезической (WGS84) высоты к нормальной (MSL)
// B,L - геодезические координаты (WGS84) в радианах для точки, в которой пересчитывается высота
// hegm - идентификатор модели геоида, открытой mapOpenEgmPro
// H - высота в метрах
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGeoHeightToNormalHeightWGS84(double B, double L, double *H, HANDLE hegm);
Спасибо за развернутый ответ. Многое стало понятно.
Но вот с этим есть момент.
Цитата
Например, если у Вас высота в Балтийской системе высот или в системе MSL, то она не может быть пересчитана при смене системы координат или эллипсоида.
Может у нас случится такая ситуация, что надо пересчитать высоты из одной Системы высот в другую. А если так случится, что данные соответствующих геоидов даны относительно разных эллипсоидов. Здесь ведь один из этапов будет перевод высот от одного эллипсоида к другому?
// Преобразование из геодезических координат (радианы) в пользовательской системе координат
// в геодезические координаты в радианах (общеземной эллипсоид WGS84)
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты, на входе радианы, на выходе - радианы
// H - геодезическая высота в точке (метры), пересчитывается между эллипсоидами
// При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapUserGeoToGeoWGS843D(HANDLE huser, double *Bx, double *Ly, double *H);
// Преобразование из геодезических координат в радианах (общеземной эллипсоид WGS84)
// в геодезические координаты в радианах на эллипсоиде в пользовательской проекции
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты, на входе радианы, на выходе - радианы
// H - геодезическая высота в точке (метры), пересчитывается между эллипсоидами
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGeoWGS84ToUserGeo3D(HANDLE huser, double *Bx, double *Ly, double *H);
Любые пересчеты между разными системами делаются через WGS84: Система1 -> WGS84 -> Система2
mapUserGeoToGeoWGS843D(huser1, &lat, &lon, &h); h - ГЕОДЕЗИЧЕСКАЯ высота (не БАЛТИЙСКАЯ система высот)
Только у Вас (и у меня) нет модели геоида для Балтийской системы. Вы можете (теоретически) найти локальные поправки с помощью геодезических работ и выполнить пересчет.
Поэтому задача, которую Вы решаете, не имеет смысла.
Только у Вас (и у меня) нет модели геоида для Балтийской системы.<br>Вы можете (теоретически) найти локальные поправки с помощью геодезических работ и выполнить пересчет.
Но пока это останется поводом для внутреннего обсуждения.