WGS84 на MSL и наоборот

Я использую цезий для создания точки на карте. После этого точку можно будет летать с дрона.

У меня следующая проблема,

1) Пользователь установил высоту точки на 20 метров на плоской 2D-карте. 2) Точку необходимо создать в реальном месте (долгота / широта) + 20 метров (высота). 3) Точка будет видна на 3D-карте, поэтому в местоположении (долгота / широта) + 20 метров (высота).

Пример:

Теперь, насколько я понимаю, высота по Цезию использует WSG84, а мой сервер (который я не могу контролировать) использует MSL.

из того, что я видел на в Интернете MSL.

это простая процедура вычитания интерполированной высоты геоида N из эллипсоидальной высоты h GPS для получения ортометрической высоты или высоты над средним уровнем моря (AMSL), H: H = h - N

Я нашел, например, эту библиотеку.

У меня 3 вопроса об этой процедуре =>

1) Все ли я говорю правильно? я иду по правильному пути? 2) В приложении есть режим отслеживания полета, в котором пользователь может отслеживать полет дрона, но координаты поступают с сервера в MSL, я получаю обновление каждые 100 мс, со всеми этими дополнительными вычислениями, будет ли эта часть проблемой ? 2) Цезий, конечно, не на 100% точен, и я также считаю, что какой бы географический идентификатор я не использовал (для региона Японии), вероятно, тоже не будет таким точным. Какую среднюю погрешность можно ожидать?

Спасибо


person Crocsx    schedule 27.06.2019    source источник


Ответы (1)


Я обновляю этот пост, потому что никогда не отвечал, если кому-то было интересно =>

import { Injectable, NgZone } from '@angular/core';
import { Cartographic } from 'src/app/shared/models/navigation.models';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AltimeterService {
  terrainProvider = new Cesium.createWorldTerrain();

  constructor(private ngZone: NgZone) { }

  getElevation(pos: Cartographic): Observable<number> {
    return new Observable<number>(observer => {
      this.ngZone.run(() => {
        const promise = Cesium.sampleTerrainMostDetailed(this.terrainProvider, [new Cesium.Cartographic(pos.longitude, pos.latitude, 0)]);
        Cesium.when(promise, (updatedPositions) => {
          this.ngZone.run(() => {
            observer.next(updatedPositions[0].height);
            observer.complete();
          });
        });
      });
    });
  }

  getElevations(pos: Array<Cartographic>): Observable<Array<number>> {
    return new Observable<Array<number>>(observer => {
      this.ngZone.run(() => {
        const copy = new Array<Cartographic>();
        pos.forEach((p) => copy.push(new Cesium.Cartographic(p.longitude, p.latitude, 0)));

        const promise = Cesium.sampleTerrainMostDetailed(this.terrainProvider, copy);
        Cesium.when(promise, (updatedPositions) => {
          this.ngZone.run(() => {
            const elevations = new Array<number>();
            updatedPositions.forEach((p) => elevations.push(p.height));
            observer.next(elevations);
            observer.complete();
          });
        });
      });
    });
  }
}

Это позволит получить высоту точки на карте с помощью Cesium World Terrain. это будет WSG84 значение высоты в точке долгота / широта

Затем я передаю значение серверу в GOLang, который использует этот пакет, чтобы получить высоту geoID для данного долгий / широта

// ConvertGPSElevationToMSL convert gps to msl elevation
// use geolocation package by garrettsickles to get the undulation or geoid from lat and lon
func ConvertGPSElevationToMSL(gpsElevation float32, lat, lon float64) float32 {
    return gpsElevation - getGeoID(lat, lon) // geoid - gps elevation
}

// ConvertMSLToGPSElevation convert msl to gps elevation
// use geolocation package by garrettsickles to get the undulation or geoid from lat and lon
func ConvertMSLToGPSElevation(msl float32, lat, lon float64) float32 {
    return getGeoID(lat, lon) + msl // should be geoID - the msl (mean sea level)
}
person Crocsx    schedule 29.08.2019