小白学osgEarth之路:添加ImageLayer和ModelLayer并定位至该图层

由于项目需要,从今年5份从零osg和零osgEarth基础的情况下,开始学习使用osgEarth,仅仅从配置环境就花了一周的时间(大神了偷摸笑~),废话不多说,切入正题,有不妥的地方希望各位道友批评指正。

1、环境配置(osg3.4+osgEarth2.8+VS2010);

2、在球上添加TIFF影像

osgEarth添加影像的方式主要有两种:(1)第一种是直接读取earth文件的方式,直接将earth文件读入作为osg场景中的一个节点。如下所示

//定义
osgViewer::Viewer*				mViewer;
osg::ref_ptr			mRoot;

//实现
mRoot = new osg::Group;
mViewer = new osgViewer::Viewer;
osg::ref_ptr mp = osgDB::readNodeFile("../../earthfile/china-simple.earth");
mRoot->addChild(mp);

(2)第二种方式就是通过osgEarth的API添加,一般地,添加影像所使用的驱动类型为GDAL,其类为osgEarth::Drivers::GDALOptions,接口为void osgEarth::Map::addImageLayer(osgEarth::ImageLayer* layer);其添加代码如下:

//变量定义及初始化
osg::ref_ptr		        mMapNode;
osgEarth::Map*				mMapPtr;   
mMapNode = dynamic_cast(mRoot->getChild(0));
mMapPtr = mMapNode->getMap();

osgEarth::Drivers::GDALOptions imageryGDAL;
imageryGDAL.url() = IMAGERY_URL;
osgEarth::Drivers::ImageLayer* tempImageLayer = new osgEarth::Drivers::ImageLayer( osgEarth::Drivers::ImageLayerOptions(layerName, imageryGDAL));
mMapPtr->addImageLayer(tempImageLayer);

上述两种情况均可以将TIFF影像添加到场景中,但是第一种方法需要用户修改编写earth文件,可实际操作性不强;第二种方式虽然可以将影像添加进去,但是同样存在一个问题,就是将影像加载进去后视点无法定位到该影像,当影像图幅较大的时候人眼可以分辨,当加载的影像图幅较小的时候,便很难辨认了,因此视点定位还是很有必要的,笔者在网上查阅了资料几乎没有发现这样的解决方案,于是自己找接口尝试了,终于找到了,特与道友分享一下。

3、获取影像边界范围

这个东西其实在osg里面就有,该类为 osg::BoundingBoxImpl,osgEarth公有继承了该类,osgEarth::Bounds : public osg::BoundingBoxImpl,其描述为“这是一个‘匿名’的边界范围”,为什么说是匿名呢,这是由于该类所计算得到的边界范围是不包含地理参考信息的。具体感兴趣的道友们可以去查阅源码看看。

那么如何获取影像边界呢?这里可能会有些误区,为什么呢?

tempImageLayer->getProfile()->getExtent().bounds();

这是第一种获取bounds的方法,但是这里是通过图层的getProfile()方法获取的,通过该方法是无法获取到影像图层的地理信息的,有道友已经尝试过了,如下图所示:

小白学osgEarth之路:添加ImageLayer和ModelLayer并定位至该图层_第1张图片

这里我们应该采用另外一个方法获取:

//loc to ImageLayer
osgEarth::Bounds bound = tempImageLayer->getTileSource()->getDataExtents().data()->bounds();

说实话,这种方法使得bounds藏的很深,我反正是找了好久才找到。道行不太够,具体原因也说不上,使用这种方式可以试试,可以获取得到影像的中心坐标,具体代码如下:

//loc to ImageLayer
osgEarth::Bounds bound = tempImageLayer->getTileSource()->getDataExtents().data()->bounds();
double x = bound.center2d().x();
double y = bound.center2d().y();
osgEarth::Viewpoint vp("",x,y,0.0, 0, -90.0,2000);
mEM->setViewpoint(vp,8);

至于添加三维模型,也是同样的道理,此处不做过多的说明了~

你可能感兴趣的:(ImageLayer,ModelLayer,Viewpoint)