WGS84 到 MSL 和相反
WGS84 to MSL and opposite
我正在使用 Cesium 在地图中创建点。然后该点将可以用无人机飞行。
我有以下问题,
1) 用户在二维平面地图中设置了一个点高度为20米。
2) 需要在现实世界位置 (long/lat) + 20 米(高度)处创建点。
3) 该点将在 3D 地图上可见,因此位于 (long/lat) + 20 米(高度)的位置。
示例:
现在,据我了解,Cesium altitude 使用的是 WSG84,而我的服务器(我无法控制)使用的是 MSL。
根据我在 Internet 上看到的内容,我需要一个 geoID 来计算 WSG84 点和 MSL 之间的计算。
it is a straightforward procedure to subtract an
interpolated geoid height, N, from a GPS ellipsoidal height, h, to
obtain an orthometric height or a height above mean sea level (AMSL),
H: H = h - N
我发现例如 this lib。
我有 3 个关于这些程序的问题 =>
1) 我说的都对吗?我走的路对吗?
2)在应用程序中,有一个飞行跟踪模式,用户可以跟踪无人机飞行,但是坐标来自 MSL 中的服务器,我每 100 毫秒更新一次,加上所有这些额外的计算,这部分会不会有问题?
2) Cesium 当然不是 100% 准确,我也相信我使用的任何 geoID(日本地区)可能也不会那么准确。平均误差范围是多少?
谢谢
我更新这个 post 因为如果有人感兴趣我从来没有回复 =>
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();
});
});
});
});
}
}
这将使用铯世界地形获取地图上某个点的高度。这将是 long/lat
点高度的 WSG84 值
然后我将该值传递给 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)
}
我正在使用 Cesium 在地图中创建点。然后该点将可以用无人机飞行。
我有以下问题,
1) 用户在二维平面地图中设置了一个点高度为20米。 2) 需要在现实世界位置 (long/lat) + 20 米(高度)处创建点。 3) 该点将在 3D 地图上可见,因此位于 (long/lat) + 20 米(高度)的位置。
示例:
现在,据我了解,Cesium altitude 使用的是 WSG84,而我的服务器(我无法控制)使用的是 MSL。
根据我在 Internet 上看到的内容,我需要一个 geoID 来计算 WSG84 点和 MSL 之间的计算。
it is a straightforward procedure to subtract an interpolated geoid height, N, from a GPS ellipsoidal height, h, to obtain an orthometric height or a height above mean sea level (AMSL), H: H = h - N
我发现例如 this lib。
我有 3 个关于这些程序的问题 =>
1) 我说的都对吗?我走的路对吗? 2)在应用程序中,有一个飞行跟踪模式,用户可以跟踪无人机飞行,但是坐标来自 MSL 中的服务器,我每 100 毫秒更新一次,加上所有这些额外的计算,这部分会不会有问题? 2) Cesium 当然不是 100% 准确,我也相信我使用的任何 geoID(日本地区)可能也不会那么准确。平均误差范围是多少?
谢谢
我更新这个 post 因为如果有人感兴趣我从来没有回复 =>
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();
});
});
});
});
}
}
这将使用铯世界地形获取地图上某个点的高度。这将是 long/lat
点高度的 WSG84 值然后我将该值传递给 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)
}