osgEarth各个示例分析目录

概述

由于数字地球项目需要osgEarth的代码知识,故决定学习osgEarth的示例,示例中有很多可以借鉴的内容。以下是分析目录,完全是随机进行的,并没有什么上下文逻辑。

每一篇代码边学习边分析,如果有错误,请各路大佬斧正!

目录 

osgEarth示例分析——osgearth_annotation​​​​​​

 osgearth_annotation,示例中采用osgEarth提供的类,绘制标签、线、billboard、遮盖图、墙、圆、实体等标绘内容,其中可编辑点仅涉及到圆形、椭圆形、矩形、遮盖图这4类标绘。推测,可以仿照圆形的编辑点类,编写label等其他的编辑点类。将标绘添加到地球上时,先获取地球mapNode节点,然后调用addChild()方法,将标绘节点加入到地球上,同时需要获取到mapNode的坐标系SRS。

osgEarth示例分析——osgearth_cluster

 osgearth_cluster,示例中展示了绘制很多模型且模型密度较大、存在遮挡的问题时,如何合适设置模型合并来减少遮挡的混乱情况。示例绘制10000个飞机和牛的模型,并且为两种模型均添加icon图标。当距离较远时,会显示图标。拉进后,才现实模型。 相同的图标可以合并为1个,并且显示此图标代表的个数。 图标和模型也可以消失,仅呈献像玻璃碎渣似的白色噪声点。

当模型过多时,可以创建 osgEarth::Util::ClusterNode 节点对象,然后创建 osg::NodeList,将需要绘制的节点 node 们,都 push_back 到 osg::NodeList 中,然后将 osg::NodeList 添加 addChild 到 osgEarth::Util::ClusterNode 中,通过控制 osgEarth::Util::ClusterNode 的半径范围,来控制节点node们的显示密集程度。
 

osgEarth示例分析——osgearth_colorfilter

 osgearth_colorfilter颜色过滤器示例。示例中,主要展示了6种颜色过滤器的使用,分别是:HSLColorFilter、RGBColorFilter、CMYKColorFilter、BrightnessContrastColorFilter、GammaColorFilter、ChromaKeyColorFilter。通过颜色过滤器可以设置地球影像的颜色。
 

osgEarth示例分析——osgearth_controls

 osgearth_controls示例,展示了各种控件的添加以及控件的事件相应。包括:图片控件、滑块控件、复选框控件、标签控件、按钮控件(在osgearth_colorfilter示例中)、box控件、grid控件等。

osgEarth示例分析——osgearth_drawables

 osgeath_drawables,示例展示了osgearth如何绘制线LineDrawable 、点PointDrawable及其特性的设置,并且设置回调,使得线条像时钟一样运动。可以通过示例进一步理解透视投影和正射投影的关系。学习node节点序列化存储、读取、绘制。

osgEarth示例分析——osgearth_eci

osgearth_eci示例,展示了J2000的天体坐标系和ECEF地固系的转换,为地球绘制坐标轴,读取卫星两行根数并绘制卫星的功能。绘制卫星轨迹时,添加差值效果和未添加差值的效果。获取时间并通过控件展示时间、通过滑块调节时间。轨迹会随着时间的推移,变长。太阳光照、星空背景均有显示。

osgEarth示例分析——osgearth_elevation

osgearth_elevation示例,展示了如何通过点击地球标签获取不同定义下的高程数据。包括:MSL高程、HAE高程、EGM96高程。绘制控制面板,面板上有标签用于显示信息和按钮。双击地形某处,或获取到高程等信息,并展示再ui面板上,同时会添加一个坐标模型。点击按钮,可以移除高程图层。

  

osgEarth示例分析——osgearth_ephemeris

osgearth_ephemeris示例,展示了深空场景下,控制仿真时间运动和停止功能。左下角应该是sky自带的控制面板,通过滑块,可以调节年、月、日,可以设置环境光亮度。可以获取太阳和月亮的世界坐标,再转化为经纬度坐标,并将其投影到地球上,用PlaceNode实时代表太阳和月亮的位置。

后续可以优化,加上仿真时间反向、仿真时间速率等功能。目前没有找到支持时间反转、时间速率调整的接口方法。也没有找到如何关闭左下角的ui控制面板。

 osgEarth示例分析——osgearth_featurefilter

osgearth_featurefilter 特征过滤器示例,在程序中注册自定义属性过滤器,earth文件中,添加对应的属性设置,当加载earth文件后,被设置的特征内容会进行更改。示例中是将所有的城市名称换成同样一串字符。

osgEarth示例分析——osgearth_featurequery

osgearth_featurequery示例,分析了如何拾取地球上的特征,并对特征信息进行提取与显示。创建的地球加载shp文件,绘制了国界线和省界线,当鼠标滑动到某条线时,会在左上角的控制面板上显示该线条的信息。也可以将鼠标滑到事件换为鼠标点击事件。功能类似的示例 osgearth_pick。

osgEarth示例分析——osgearth_features

osgearth_features示例,主要演示如何通过代码方式加载shp文件,并设置其样式。在执行时,通过不同的命令,得到不一样的效果。之前的示例,都是通过earth文件的方式加载shp文件和更改其属性内容。

 osgEarth示例分析——osgearth_geodetic_graticule

osgearth_geodetic_graticule示例,是展示三维地球经纬网格控制的案例。通过左上角控制面板上的按钮,可以控制网格的显隐、 控制经纬度文本的显隐及更改颜色、以及当地球占满整个页面时,让经纬度label靠边缘显示、整个网格图层(线和文本)的显隐控制。

 osgEarth示例分析——osgearth_graticule

osgearth_graticule,示例展示了绘制网格、网格上的文字显示、拾取地球表面的坐标并展示在左上角的标签上。在地球网格示例中,可以设置4种网格样式和对应格式的坐标值,即使获取的同一地点的坐标,由于网格样式不同,左上角显示的内容也不相同。

osgEarth示例分析——osgearth_horizon

osgearth_horizon示例,在地球上绘制了一大一小两个白色半球。随着转动地球,白球会被遮挡或显示,此时右下角会提示:白色球的可见状态,以及当前地图图层加载到第几层级。

osgEarth示例分析——osgearth_htm

osgearth_htm示例,围绕US绘制线框,且线框组成的三角形内,会放置一个“模型”,当拉进距离时,线框会1分裂4,同时模型也会分裂,如果最外层是个单角,则删去。不太明白htm模式有什么用处。

osgEarth示例分析——osgearth_http

osgearth_http示例,展示 HTTPClient 客户端类 通过url获取HTTP服务的数据并解析。

osgEarth示例分析——osgearth_imageoverlay

 imageroverlay示例,在地球上贴图。左下角有控制面板,面板上有mini图标、复选框、标签、滑动条。支持更换图标、拖动图片的编辑点移动位置、通过滑块更改透明度、edit标签控制编辑点的显隐。当编辑点隐藏后,则不可编辑位置。

osgEarth示例分析——osgearth_infinitescroll

osgearth_infinitescroll示例,通过earth文件,加载二维地图,且二维地图无限拖动。在earth文件中,有线条和图片两个标绘特征,添加earth文件时,此标绘会添加到地图上。在示例中,可以控制黄色的线一直显示,两张覆盖图默认显示,但拖动地图的时候,有时候显示有时候不显示。

osgEarth示例分析——osgearth_lights

osgearth_lights示例,模拟仿真了白天黑夜,添加了星空背景(太阳、月亮、其他天体),支持通过左下角控件更改时间进而改变光照,支持随机更新图层颜色。earth文件中,需要添加<sky>标签,否则无法加载skyNode节点。此示例与osgearth_ephemeris示例示例功能上有些相似之处。

osgEarth示例分析——osgearth_los

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

 

osgEarth示例分析——osgearth_manip

 osgearth_manip示例,讲了事件处理的用法,内容比较多,重点是 回调事件和按键事件。切换操作器的透视矩阵、视角绑定移动的模型并并跟踪或取消跟踪(跟踪有3种状态,参见t)、定位到可以看到一组节点的视点位置、在屏幕上绘制两条交线。

 

osgEarth示例分析——osgearth_measure

 osgearth_measure测量示例,展示了如何测量两点间距离。当点击第一个点后,随着鼠标移动,红线跟着移动,直到点下第二个点,测量结束。测量值会显示在左上角的ui界面上,且可以设置直线测量或大圆弧测量,实时更新鼠标坐标。还可以测量连续直线,双击后结束测量。

 

osgEarth示例分析——osgearth_minimap

osgearth_minimap示例。在示例中,拖动三维地图,二维地图上的label标签会移动。二维地图支持拖动和缩放。代码的目的是:让标签始终跟随三维视点的坐标进行更新。但是,运行过程中,label标签的位置有时候会不对。例如当三维地球放大到中国地图内时,理论来讲label应该定位在中国区域内,但是并没有。目前还没有梳理清楚坐标转换的关系。此示例代码的借鉴意义即显示小地图。

 

osgEarth示例分析——osgerth_mrt

osgearth_mrt示例,展示了一个带呼吸灯光环的地球,地球背景图被设置为玫红色,鼠标点击地球,会获取到一些视点信息。此示例暂时并没有分析太清楚,等更深入了解了OPenGL 和 osg的相机部分内容,再来看,应该会容易一些。 

 

osgEarth示例分析——osgearth_noisegen

osgearth_noisegen示例,展示生成噪音图。也就是根据设置生成声音曲线,在绘制到图上。但是写入文件总是报错。此示例并没有学习太明白。 

 

 osgEarth示例分析——osgearth_occlusionculling

 osgearth_occlusionculling示例,分析了declutter清理器功能。即当有多个同类型的对象同时覆盖在同一个区域时,会隐藏一部分对象。如果想更深入学习declutter功能,推荐 osgearth_cluster 示例。此示例效果一般,就当它只是实现了随机在规定区域生成一些PlaceNode标签。

 

osgEarth示例分析——osgearth_pick

 osgearth_pick示例,展示了鼠标移动(或者鼠标单击)时,触及到的矢量特征、绘制的线、遮盖图等内容,特征线会变为红色,同时将拾取到的特征的信息打印输出到左上角ui控件上。此示例与osgearth_featurequery示例不同之处在于,此示例左下角有小地图,且小地图仅显示特征内容,不显示影像。

 

osgEarth示例分析——osgearth_scenegraphcallbacks

osgearth_scenegraphcallbacks示例,定义了一个图层的回调方法,继承自 osgEarth::SceneGraphCallback. 获取场景事件通知的回调方法。并打印输出当前所有图层的名称,包括高程图层、影像图层、国界线图层、省界线图层等。并没有看懂此回调方法是如何使用的。

 

osgEarth示例分析——osgearth_sequencecontrol

 osgearth_sequencecontrol示例,应该是会实现每一帧更新一个东西,但是尝试了很多earth文件,都报错:Your earth file does not contain any sequenced layers...bye! 掌握如何获取图层列表,图层的继承关系。

osgEarth示例分析——osgearth_shadercomp

 osgearth_shadercomp示例,这是osgEarth着色器合成框架的一组单元测试。主要分析OpenGL着色器语言和方法的使用。是OpenGL与osgearth的结合。通过OpenGL的着色器设置地球的各种颜色状态。一共9个示例:添加雾特效、通过回调方法设置地球放大时一个颜色,缩小时还原颜色、红色的地球、安装卸载着色器程序设置地球的闪烁、两个三角形、左下角4个地图且颜色各异,主视图却没有内容、将绘制的内容写入out.osg文件、读取out.osg文件并显示、红色方块模拟瓦片一级一级的添加。

 

osgEarth示例分析——osgearth_shadergen

osgearth_shadergen示例,加载一个earth文件,出现一个地球,然后通过StateSetCache::dumpStats() 方法输出一些信息。并不太理解这个例子的目的。

 

osgEarth示例分析——osgearth_skyview

本示例分析osgearth操作深空场景,或者是银河系场景,可以想象人拿着相机站在地球表面上观看天空/银河系的场景。 需要通过earth文件添加特别的图片。

 

osgEarth示例分析——osgearth_splat

 osgearth_splat示例,展示如何加载图片贴在地球上,且通过分类,贴文理绘制森林、草地等。整个地球的影像,加载的一张贴图。黑白点点,是不同的贴图。当拉进放大后,才可以看清楚加载的是哪张纹理图。代码设置了15级。通过xml文件加载以及通过代码加载。

  

osgEarth示例分析——osgearth_srstest

osgearth_srstest示例,主要涉及到两个坐标系转换,wgs84→egm96  wgs84→plate-carre。 其中重要的是wgs84到平面坐标系的转换。代码中是采用的极值进行的测试。转换后的结果是XYZ数据而不是经纬度。 

 

osgEarth示例分析——osgearth_terrainprofile

 osgearth_terrainprofile示例,涉及到一个新的类 TerrainProfileCalculator(地形轮廓计算器类),用来计算两个点连线之间的地形数据。左下角会根据点击的起点和终点进行计算,并更新显示地形信息。左下角的地形线和高度值会根据点击两点的连线进行调整。

 

osgEarth示例分析——osgearth_tilesource

osgearth_tilesource示例,展示如何创建自定义瓦片源并添加到图层,可以自行绘制几何图形,呈献不同的形状。此示例对于加载瓦片,并没有提供更明确的指导。比如本机有一些瓦片图,实际应该怎么加载,依然还没有想到方案。

 

osgEarth示例分析——osgearth_tracks

 osgearth_tracks示例,演示了所有图标沿着路径进行移动(路径是不可见的)。左下角有控制面板,复选框和滑块分别控制移动的周期时间、图片变大变小、图片透明度、是否显示图标的文本内容、图片从无到有与从有到无的时间变化等。

 

osgEarth示例分析——osgearth_transform

osgearth_transform示例,是控制三维坐标轴模型的示例。通过控制面板的滑块,进而控制坐标轴的经度、纬度、高度、俯仰角、偏航角、旋转等操作。 

 

osgEarth示例分析——osgearth_wfs

osgearth_wfs示例,展示的如何创建wfs驱动,通过http服务加载wfs数据。由于本示例中的链接无效,所以并没有执行出应有的效果。

 

osgEarth示例分析——osgearth_windows

 osgearth_windows示例,展示了如何创建多个视景器,在多个窗口或者在同一个窗口。可以实现一个窗口二维图一个窗口三维图,或者一个窗口一边二维图一边三维图。只是没有做操作器同步功能。

 

 osgearth_magnify:漏掉的示例,回头补上。

另外有些示例没有进行分析:

city: 需要http网络数据,但是http链接无效,未通过测试。
computerangecallback:运行后,没啥结果,也没有距离、半径等内容输出。
datetime: 因为没有kml文件,所以运行程序后,并没有看到什么效果。
map: 需要http网络数据,但是http链接无效,未通过测试。
video:需要http网络数据,但是http链接无效,未通过测试。

  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在 Visual Studio 2022 中使用 osgEarth示例: 1. 安装 osgEarth 首先需要在你的系统中安装 osgEarth。可以从官网下载安装包进行安装,也可以使用 CMake 进行源码编译安装。 2. 创建一个 osgEarth 应用程序 在 Visual Studio 2022 中创建一个新的 C++ 控制台应用程序项目。然后,将 osgEarth 的 include 和 library 路径添加到项目中: - 右键单击项目,选择“属性”。 - 在“VC++ 目录”中添加包含路径和库路径。 - 在“链接器 -> 输入”中添加 osgEarth 的库文件。 3. 创建一个 osgEarth 地图节点 在应用程序中创建一个 osgEarth 地图节点,并将其添加到场景图中: ```cpp #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> int main(int argc, char** argv) { // 初始化 osgEarthosgEarth::initialize(); // 创建一个 osgEarth 地图节点 osg::ref_ptr<osgEarth::MapNode> mapNode = osgEarth::MapNode::create(osgEarth::MapNodeOptions()); // 创建一个 osgEarth 视图并添加地图节点 osg::ref_ptr<osgViewer::View> view = new osgViewer::View; view->setSceneData(mapNode); // 设置地球操纵器 osg::ref_ptr<osgEarth::Util::EarthManipulator> manipulator = new osgEarth::Util::EarthManipulator; view->setCameraManipulator(manipulator); // 显示视图 osgViewer::Viewer viewer; viewer.addView(view); return viewer.run(); } ``` 以上代码创建了一个 osgEarth 地图节点,并使用 EarthManipulator 对其进行控制。注意要在程序结束前调用 osgEarth::shutdown(),以释放资源。 4. 运行应用程序 点击“生成”按钮编译应用程序,并运行应用程序。如果一切正常,应该可以看到一个 osgEarth 地球视图。 以上是在 Visual Studio 2022 中使用 osgEarth 的简单示例。根据需要,还可以使用 osgEarth 的其他功能来创建更复杂的地图应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值