使用SDK

osgEarth Utils命名空间包含多种多样有用的类来与地图进行交互。这些都不是osgEarth所必需的,但是它们确实使执行一些常见操作变得容易。

数据扫描装置DataScanner

DataScanner对本地文件系统的目录进行递归搜索来寻找可以加载ImageLayer对象的文件,是加载影像图层完整目录快速又简单的方法。

注意 只有MP地形引擎(MP Terrain Engine)支持无线数量的影像图层,所以最好将这个引擎与DataScanner一同使用。

像这样使用DataScanner:

  1. DataScanner scanner;
  2. ImageLayerVector imageLayers;
  3. scanner.findImageLayers( rootFolder, extensions, imageLayers );

接下来捏可以在Map对象在添加影像图层。

extensions参数允许您按拓展名筛选文件。例如,输入“tif,ecw”仅关注这些拓展名的文件,用逗号分隔多个拓展名。

细节纹理DetailTexture

DetailTexture是一种地形控制器,在地形中应用一种非地理纹理。这是一种可以用来生成“噪声”得到低分辨率地形显示的传统方法:

  1. DetailTexture* detail = new DetailTexture();
  2. detail->setImage( osgDB::readImageFile("mytexture.jpg") );
  3. detail->setIntensity( 0.5f );
  4. detail->setImageUnit( 4 );
  5. mapnode->getTerrainEngine()->addEffect( detail );

试试这个例子,放大到接近地形来查看效果:

  1. osgearth_detailtex readymap.earth

对数深度缓冲区Logarithmic Depth Buffer

在全地球应用程序中,您通常希望近距离观察某些物体(如高空飞行器),同时在远处看到地球及其地平线。这给现代图形硬件带来了问题,因为标准深度缓冲精度非常有利于靠近相机的物体,并且观看这样大范围的目标会导致“深度冲突(z-fighting)”问题。

LogarithmicDepthBuffer是解决此问题的一种方法,它使用着色器重新投影GPU的深度缓冲区数值,以便在此类场景中更好地使用它们。

它设置起来很简单:

  1. LogarithmicDepthBuffer logdepth;
  2. logdepth->install( view->getCamera() );

你也可以从osgearth_viewer或其它例子中启动它:

  1. osgearth_viewer --logdepth ...

由于它确实会在绘制时改变几何体的投影空间坐标,因此需要注意,在自定义着色器中的剪辑空间中没有做任何与此冲突的其它事。

(2014年7月10日:一些osgEarth功能与日志深度缓冲区不兼容,即GPU置入和阴影。虽然深度偏差(Depth Offset)很正常。)

格式器Formatters

使用Formatters将地理空间坐标格式化为字符串。有两种格式器LatLongFormatterMGRSFormatter。格式器使用一个GeoPoint并返回一个std::string,如下所示:

  1. LatLongFormatter formatter;
  2. GeoPoint point;
  3. ....
  4. std::string = formatter.format( point );

经纬度格式器(LatLongFormatter)

LatLongFormatter将坐标转换为一个字符串。它支持以下格式:

FORMAT_DECIMAL_DEGREES:

34.04582

FORMAT_DEGREES_DECIMAL_MINUTES:

34.20:30

FORMAT_DEGREES_MINUTES_SECONDS:

34:14:30

您还可以为输出字符串指定选项:

USE_SYMBOLS: 使用度分秒符号

USE_COLONS: 在各部分间使用冒号

USE_SPACES: 在各部分间使用空格

军事网格参考系统格式器(MGRSFormatter)

MGRSFormatter根据军事网格参考系统构造字符串。从技术上讲,MGRS坐标表示一个区域而不是一个精确的点,因此必须指定一个精度限定符来控制所表示区域的大小。例如:

  1. MGRSFormatter mgrs( MGRFormatter::PRECISION_1000M );
  2. std::string str = mgrs.format( geopoint );

鼠标坐标工具MouseCoordsTool

MouseCoordsTool记录鼠标下的地图坐标(或其它指向设备),设置一个回调来响应记录。MouseCoordsTool是一个osgGA::GUIEventHandler,可以在一个Viewer或任意Node中设置,如:

  1. MouseCoordsTool* tool = new MouseCoordsTool();
  2. tool->addCallback( new MyCallback() );
  3. viewer.addEventHandler( tool );

创建自己的回调来响应记录。这是一个在Qt状态栏显示鼠标下X,Y例子:

  1. struct PrintCoordsToStatusBar : public MouseCoordsTool::Callback
  2. {
  3. public:
  4. PrintCoordsToStatusBar(QStatusBar* sb) : _sb(sb) { }
  5. void set(const GeoPoint& p, osg::View* view, MapNode* mapNode)
  6. {
  7. std::string str = osgEarth::Stringify() << p.y() << ", " << p.x();
  8. _sb->showMessage( QString(str.c_str()) );
  9. }
  10. void reset(osg::View* view, MapNode* mapNode)
  11. {
  12. _sb->showMessage( QString("out of range") );
  13. }
  14. QStatusBar* _sb;
  15. };

为方便起见,MouseCoordsTool还附带了一个回调函数,可以将坐标显示到osgEarthUtil::Controls::LabelControl。您甚至可以将LabelControl传递给构造函数,以使其更容易。