从earth读取图层之后,根据图层的实际属性,需要进行格式转换。
一、方法一:直接使用dynamic_cast强制转换
转换的常用思路,Layer是XXX_Layer的父类,换言之XXX_Layer都继承自osgEarth::Layer,如此就自然而然想到利用dynamic_cast或者static_cast进行格式强制转换,如下
osg::ref_ptr<osgEarth::ImageLayer> test_layer=dynamic_cast<osgEarth::ImageLayer*>(mapNode.get()->getMap()->getLayerByName("test"));
这样是可以实现的。
二、方法二:使用osgEarth::MapModelChange的模块转换
直接看代码
osgEarth::MapModelChange mMapModelChange(osgEarth::MapModelChange::ADD_LAYER,osgEarth::Revision(),mapNode.get()->getMap()->getLayerByName("China_boundaries"));
osg::ref_ptr<osgEarth::ImageLayer> test_layer=mMapModelChange.getImageLayer();
从他的代码看,其实这个模块的功能实现,也是基于dynamic_cast实现的。
MapModelChange的头文件部分内容如下:
MapModelChange( ActionType action, Revision mapModeRev, Layer* layer =0L, int firstIndex =-1, int secondIndex =-1 )
: _action(action), _layer(layer), _modelRevision(mapModeRev), _firstIndex(firstIndex), _secondIndex(secondIndex) { }
ImageLayer* getImageLayer() const { return dynamic_cast<ImageLayer*>(_layer.get()); }
ElevationLayer* getElevationLayer() const { return dynamic_cast<ElevationLayer*>(_layer.get()); }
ModelLayer* getModelLayer() const { return dynamic_cast<ModelLayer*>(_layer.get()); }
MaskLayer* getMaskLayer() const { return dynamic_cast<MaskLayer*>(_layer.get()); }
由此可见,该函数的优点,一个是可以快速转换成多种类型,另一个是可以指定图层的批量转换。

本文介绍了在osgEarth中进行图层格式转换的两种方法。方法一是直接使用dynamic_cast进行强制类型转换,适用于简单场景。方法二是利用osgEarth::MapModelChange模块,它提供了一种更灵活的方式,可以快速转换多种类型的图层,并支持批量转换。这两种方法都在实际代码中得到了展示。
770

被折叠的 条评论
为什么被折叠?



