geolocation - WGS84 到 MSL 和相反
问题描述
我正在使用Cesium在地图中创建点。然后,该点将可以用无人机飞行。
我有以下问题,
1) 用户在 2D 平面地图中将点高度设置为 20 米。2)需要在真实世界位置(经/纬度)+ 20 米(高度)创建点。3) 该点将在 3D 地图上可见,因此在位置(经度/纬度)+ 20 米(高度)。
示例:
现在,据我了解,Cesium 高度使用 WSG84,而我的服务器(我无法控制)使用 MSL。
从我在互联网上看到的情况来看,我需要一个 geoID 来计算 WSG84 点和 MSL 之间的计算。
从 GPS 椭球高度 h 中减去插值大地水准面高度 N 以获得正高或高于平均海平面 (AMSL) 的高度 H 是一个简单的过程:H = h - N
例如,我发现了这个 lib。
我对这些程序有 3 个问题 =>
1)我说的一切都正确吗?我走对路了吗?2)在应用程序中,有一个飞行跟踪模式,用户可以跟踪无人机飞行,但是坐标来自MSL中的服务器,我每100ms更新一次,加上所有这些额外的计算,这部分会不会有问题? 2) 铯当然不是 100% 准确的,而且我也相信我使用的任何 geoID(对于日本地区)可能也不会那么准确。预期的平均误差范围是多少?
谢谢
解决方案
我更新了这篇文章,因为如果有人感兴趣,我从来没有回复过=>
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 中的服务器,该服务器使用这个包来获取给定 long/lat 的 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)
}
推荐阅读
- python - Python JoinableQueue 在其他进程中调用 task_done 需要两次
- python - BeautifulSoup Python NoneType 对象没有属性“文本”
- python - 根据另一列出现百分比从熊猫数据框中选择行
- android - Android 11 (SDK 30) 自定义文件选择器库
- python - 分组 Tkinter 标签
- python-3.x - 为什么 sklearn RidgeCV 没有 n_jobs 参数?
- mule - 如何在数据编织中的有效负载中为多个键的值为空的有效负载添加错误?
- java - 如何阻止 JScrollPane 在初始显示时自动滚动到底部?
- react-native - 如果项目数不足以使其可滚动,则不调用 React Native FlatList onEndReached
- arrays - 如何在excel vba动态数组中包含文件系统对象属性