【问题标题】:WGS84 to MSL and oppositeWGS84 到 MSL 和相反
【发布时间】:2019-06-27 01:35:42
【问题描述】:

我正在使用Cesium 在地图中创建点。然后该点将可以用无人机飞行。

我有以下问题,

1) 用户在二维平面地图中将点高度设置为 20 米。 2) 点需要在真实世界位置(经/纬)+ 20 米(高度)处创建。 3) 该点将在 3D 地图上可见,因此在位置(经度/纬度)+ 20 米(高度)处。

示例:

现在,据我了解,Cesium 高度使用 WSG84,而我的服务器(我无法控制)使用 MSL。

根据我在 Internet 上看到的内容,我需要一个 geoID 来计算 WSG84 点和 MSL 之间的计算。

减去一个 插值大地水准面高度 N,从 GPS 椭球高度 h 到 获得正高或平均海平面以上的高度(AMSL), H:H = h - N

我找到了例如this lib

我对这些程序有 3 个问题 =>

1) 我说的都是正确的吗?我走对路了吗? 2)在应用程序中,有一个飞行跟踪模式,用户可以跟踪无人机飞行,但是坐标来自MSL中的服务器,我每100ms更新一次,加上所有这些额外的计算,这部分会不会有问题? 2) 铯当然不是 100% 准确的,而且我也相信我使用的任何 geoID(对于日本地区)可能也不会那么准确。预期的平均误差范围是多少?

谢谢

【问题讨论】:

    标签: geolocation gis cesium wgs84


    【解决方案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 点 long/lat 的高度值

    然后我将值传递给 GOLang 中的服务器,该服务器使用 this package 来获取给定经度/纬度的 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 2012-04-08
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多