实用工具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
使其更容易。