前言

osgearth_srstest示例,主要涉及到两个坐标系转换,wgs84→egm96  wgs84→plate-carre

wgs84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统。导航系统、GPS系统,都在使用此坐标。

egm96:EGM9模型是美国bai推出的一种适用于全球范围,并综合利用现有全球大量重力数据所计算出来的高精度大地水准面模型。但是因其发布年代较早并且缺乏中国地区重力数据所以高程转换精度较低,难以满足工程测量需要。而近年来由美国NGA重力场研发小组发布了EGM2008大地水准面模型,改善了这一情况。

plate-carre:简易圆柱投影是一种等距圆柱投影,其标准纬线位于赤道处。 经纬线的格网从东到西并从极点到极点形成完美的方形。(此链接实为宝藏,对于不理解各种坐标和投影关系的小伙伴,特别有帮助)

// cmd 命令框 输入以下代码:
osgearth_srstestd.exe

执行结果

Convert geodetic Z to EGM96: transform succeed for texst #output[0]: 0, 0, 1.5258789076710854715202e-07
Convert geodetic Z to EGM96: output doesn't match for test #1; expected Z=0, got Z=-0.0100004577636738645196601
Convert geodetic Z to EGM96: transform succeed for texst #output[2]: 180, 0, 3.814697251414145284798e-07
Convert geodetic Z to EGM96: transform succeed for texst #output[3]: -90, 0, -0.00999979019165042615213679
Convert geodetic Z to EGM96: output doesn't match for test #4; expected Z=0, got Z=44.06999969482421875result = -20037508.3427892476320267, -10018754.1713946219533682, 0
result = -20037508.3427892476320267, 10018754.1713946219533682, 0
result = 20037508.3427892476320267, -10018754.1713946219533682, 0
result = 20037508.3427892476320267, 10018754.1713946219533682, 0
result = 10018754.1713946238160133, 3339584.72379820747300982, 1000

根据执行结果猜测:第一种转换是为了验证两种坐标系获取的同一位置高程值是否相同。

第二种转换,猜测是将椭球投影后,在平面上,获取XY的位置,Z值意义不大。毕竟投影后就不关心高程值了。

代码分析

#include <osgEarth/SpatialReference>
#include <osgEarth/StringUtils>
#include <osgEarth/Profile>
#include <iostream>bool eq(const double& a, const double& b, double e =1e-6) {return fabs(a - b) <= e;
}bool eq(const osg::Vec3d& a, const osg::Vec3d& b, double e =1e-6) {return fabs(a.x() - b.x()) <= e && fabs(a.y() - b.y()) <= e && fabs(a.z() - b.z()) <= e;
}int fail(const std::string& test, const std::string& msg) {std::cout << test << ": " << msg << std::endl;return -1;
}int
main(int argc, char** argv)
{using namespace osgEarth;std::string test;// Vertical datum tests.// Reference: http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpt.html{// wgs84坐标 转换到 EGM96坐标。这是两个不同的坐标系统。// 在osgearth中,还有epsg:4326 plate-carretest = "Convert geodetic Z to EGM96";const SpatialReference* wgs84 = SpatialReference::get("wgs84");const SpatialReference* wgs84_egm96 = SpatialReference::get("wgs84", "egm96");        osg::Vec3d input[5] = {osg::Vec3d( 0,  0,  17.16),// 赤道上的点osg::Vec3d( 90, 0, -63.24),osg::Vec3d(180, 0,  21.15),osg::Vec3d(-90, 0,  -4.29),osg::Vec3d(90,30,10)// 一般值测试};osg::Vec3d output;for (int i = 0; i<5; ++i) {osg::Vec3d output;if (!wgs84->transform(input[i], wgs84_egm96, output))std::cout << test << ": transform failed for texst #" << i << std::endl;else if (!eq(output.z(), 0.0, 0.01)) { // 判断转换后的值,高度z是否为0std::cout << test << ": output doesn't match for test #" << i << "; expected Z=0, got Z=" << output.z() << std::endl;}else{  // 转换成功std::cout << test << ": transform succeed for texst #output[" << i <<"]: "<<std::setprecision(24) << output.x() << ", " << output.y() << ", " << output.z() << std::endl;}}}std::cout << std::endl;// Plate Carre EQC Test.{// plate-carre: WGS84 projected flat (X=longitude, Y=latitude),WGS84投影平面test = "Plate Carre EQC Test";const SpatialReference* wgs84 = SpatialReference::get("wgs84");const SpatialReference* pceqc = SpatialReference::get("plate-carre");// 二维坐标osg::Vec3d input[5] = {osg::Vec3d(-180, -90, 0),// 极值测试osg::Vec3d(-180, +90, 0),osg::Vec3d( 180, -90, 0),osg::Vec3d( 180, +90, 0),osg::Vec3d(90,30,1000)// 一般值测试};osg::Vec3d output;for (int i = 0; i<5; ++i) {osg::Vec3d output;if (!wgs84->transform(input[i], pceqc, output)) {std::cout << test << ": transform failed for test #" << i << std::endl;}else  {std::cout << "result = " << std::setprecision(24) << output.x() << ", " << output.y() << ", " << output.z() << std::endl;}}}return 0;
}

osgEarth示例分析——osgearth_srstest相关推荐

  1. osgEarth示例分析——osgearth_annotation

    前言 本章为osgearth_annotation示例分析,示例中采用osgEarth提供的类,绘制标签.线.billboard.遮盖图.墙等内容. 运行时,在生成的可执行路径下,打开命令框,输入: ...

  2. osgEarth示例分析——osgearth_skyview

    前言 本示例分析osgearth操作深空场景,或者是银河系场景,可以想象人拿着相机站在地球表面上观看天空/银河系的场景. 重点是相机操作器的使用. 在命令框输入执行程序,在data路径下有加载的图,且 ...

  3. osgEarth示例分析——osgearth_manip

    前言 本示例主要演示osgEarth的事件处理的用法,内容比较多,这部分功能也很重要. 输入命令依然采用china-simple.earth的示例,加上了模型,但是模型并没有看到,可能是因为模型没有放 ...

  4. osgEarth示例分析——osgearth_elevation

    前言 osgearth_elevation示例,展示了如何通过点击地球获取不同定义下的高程数据.包括:MSL高程.HAE高程.EGM96高程.点击按钮,可以移除高程图层. MSL高程:是mean se ...

  5. osgEarth示例分析——osgearth_graticule

    前言 本示例最具有借鉴的功能:绘制网格.网格上的文字显示.拾取地球的坐标.在地球网格示例中,可以设置4种网格.执行命令如下: // --geodetic osgearth_graticuled.exe ...

  6. osgEarth示例分析——osgearth_eci

    前言 osgearth_eci示例,展示了J2000的天体坐标系和ECEF地固系的转换,绘制坐标系,以及读取卫星参数绘制卫星的功能.绘制卫星轨迹,添加差值效果和未添加差值的效果. 关于卫星两行根数的数 ...

  7. osgEarth示例分析——osgearth_terrainprofile

    前言 osgearth_terrainprofile示例,涉及到一个新的类 TerrainProfileCalculator(地形轮廓计算器类),用来计算两个点连线之间的地形数据.左下角会根据点击的起 ...

  8. osgEarth示例分析——osgearth_features

    前言 osgearth_features示例,主要演示如何通过代码方式加载shp文件,并设置其样式.在执行时,通过不同 的命令,得到不一样的效果. cmd执行命令: // rasterize 光栅化, ...

  9. osgEarth示例分析——osgearth_los

    前言 osgearth_los示例,创建了模型动画路径.透视的用法.透视的顾名思义:两个点连线,从A到B,视线不被遮挡,则绘制绿色,视线被遮挡的部分,则设置为红色.此示例,加载earth文件时,需要加 ...

最新文章

  1. 中国信通院发布《区块链基础设施研究报告(2021年)》
  2. 如果 AI 和算法无罪,那么谁在杀死穷人?
  3. 产品经理的肾,是怎么坏的?
  4. Oracle中dmp/dmpdp导出,imp/impdp导入
  5. Vue.js 3 Step 创建一个组件
  6. Linux用户空间与内核空间(理解高端内存)
  7. php如何优雅地把数组传递给前端js脚本?
  8. 高性能的MySQL(8)优化服务器配置一安全与稳定
  9. tableexport 文件格式和扩展名不匹配_让信息检索更有效率!百度有哪些你不知道的隐藏玩法?...
  10. 【转】如何查找MySQL中慢查询的SQL语句
  11. 学习C语言编程,推荐你看这6本书
  12. google四件套之Dagger2。从入门到爱不释手,之:Dagger2基础知识及在Java中使用(2)
  13. 不要等到双十一,MathType公式编辑器提前降价!
  14. linux 找不到vmdk,找不到文件vmdk虚拟磁盘
  15. 三十功名尘与土,八千里路云和月
  16. 洛谷1156 垃圾陷阱
  17. Flex ANE介绍
  18. 浏览器支持base64编码
  19. web应用开发 -- 课堂作业 个人简介
  20. adb关闭系统自动更新

热门文章

  1. 数据分析-前置条件(采集、存储、治理)
  2. STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
  3. [渝粤教育] 浙江大学 2021秋冬微积分(一) 参考 资料
  4. python分析股票主力_python-个股聪明钱因子追踪
  5. 月薪40K起,什么是Python全栈工程师?全栈工程师薪资为何这么高?
  6. html判断苹果,js获取判断苹果手机机型
  7. jzoj 3426. 封印一击 (Standard IO)
  8. cisco Switching-三层交换配置路由
  9. html5 3d自动,html5 3D微信头像自动抽奖代码
  10. excel2007整体调整行间距