实用工具SDK

Osgerath 乌迪斯 名称空间包括各种用于与映射交互的有用类。这些都不是使用OSGearth所必需的,但它们确实使执行一些常见操作变得更容易。

DataScanner

这个 DataScanner 将递归地搜索本地文件系统上的目录树,以查找可以加载为的文件 ImageLayer 物体。这是一种快速而简单的方式来加载一个完整的图像目录作为层。

NOTE 只有 MP地形引擎 支持无限数量的图像层,因此将该引擎与数据扫描程序结合使用是明智的。

像这样使用数据:

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

然后可以将图像层添加到 Map 对象。

这个 extensions 参数允许您按扩展名筛选文件。例如,传入“tif,ecw”以仅考虑具有这些扩展名的文件。用逗号分隔多个扩展名。

DetailTexture

DetailTexture 是一个将在整个地形上应用非地理空间纹理的地形控制器。这是一个古老的技巧,可以用来生成“噪波”,使低分辨率地形看起来更详细:

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

试试这个例子。放大相当接近地形的效果:

osgearth_detailtex readymap.earth

对数深度缓冲器

在全地球应用中,当你在远处看到地球及其地平线时,你通常想近距离地看到一些东西(比如高空的飞机)。这给现代图形硬件带来了一个问题,因为标准的深度缓冲精度非常倾向于靠近相机的对象,并且查看如此广泛的对象会导致“z-fighting”伪影。

这个 LogarithmicDepthBuffer 是解决这个问题的一种方法。它使用一个明暗器重新映射GPU的深度缓冲区值,以便在这种类型的场景中更好地使用这些值。

易于安装:

LogarithmicDepthBuffer logdepth;
logdepth->install( view->getCamera() );

或者你可以从 osgearth_viewer 或其他示例:

osgearth_viewer --logdepth ...

因为它确实会在绘制时更改几何体的投影空间坐标,所以您需要小心,不要在剪辑空间中的自定义明暗器中执行任何与此冲突的操作。

(2014年7月10日:一些OSGerath功能与测井深度缓冲区不兼容,即GPU夹持和阴影。但深度偏移工作正常。)

使用格式器

使用 使用格式器 将地理空间坐标格式化为字符串。有两个股票格式化程序, LatLongFormatter 以及 MGRSFormatter . 格式化程序需要 GeoPoint 返回一个 std::string 像这样::

LatLongFormatter formatter;
GeoPoint point;
....
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 根据 Military Grid Reference System . 从技术上讲,MGRS坐标表示 区域 而不是一个精确的点,因此您必须指定 精度 用于控制表示区域大小的限定符。例子::

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

MouseCoordsTool

这个 MouseCoordsTool 报告鼠标(或其他定点设备)下的地图坐标。安装回调以响应报告。 MouseCoordsTool 是一个 osgGA::GUIEventHandler 可以安装在 Viewer 或任何 Node ,像这样::

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

创建自己的回调以响应报告。下面是一个将鼠标下的x,y打印到 Qt 状态栏:

struct PrintCoordsToStatusBar : public MouseCoordsTool::Callback
{
public:
    PrintCoordsToStatusBar(QStatusBar* sb) : _sb(sb) { }

    void set(const GeoPoint& p, osg::View* view, MapNode* mapNode)
    {
        std::string str = osgEarth::Stringify() << p.y() << ", " << p.x();
        _sb->showMessage( QString(str.c_str()) );
    }

    void reset(osg::View* view, MapNode* mapNode)
    {
        _sb->showMessage( QString("out of range") );
    }

    QStatusBar* _sb;
};

为了您的方便, MouseCoordsTool 还附带了一个库存回调,将coords打印到 osgEarth::Util::Controls::LabelControl . 你甚至可以通过 LabelControl 使其更容易。