osgEarth的Rex引擎原理分析(八十一)获取的高程图像为什么除了设置纹理还要设置栅格

本文探讨osgEarth的Rex引擎在加载高程图像时,为何除了设置渲染纹理外还需要设置高程栅格。设置纹理用于渲染绘制,而设置栅格则服务于分析计算,两者目的不同。文章列举了一系列关于osgEarth Rex引擎的待分析问题,涉及引擎的各个组件和功能。

目标:(八十)中的问题158

在加载高程图像后,除了设置渲染纹理外还设置了高程栅格,如下:

osgEarthDrivers/engine_rex/TileNode.cpp
void
TileNode::merge(const TerrainTileModel* model, const RenderBindings& bindings)
{
    // Elevation:
    const SamplerBinding& elevation = bindings[SamplerBinding::ELEVATION];
    if (elevation.isActive() && model->elevationModel().valid() && model->elevationModel()->getTexture())
    {
        osg::Texture* tex = model->elevationModel()->getTexture();

        // always keep the elevation image around because we use it for bounding box computation:
        tex->setUnRefImageDataAfterApply(false);

        _renderModel._sharedSamplers[SamplerBinding::ELEVATION]._texture = tex;
        _renderModel._sharedSamplers[SamplerBinding::ELEVATION]._matrix.makeIdentity();

        setElevationRaster(tex->getImage(0), osg::Matrixf::identity());

        newElevationData = true;
    } 
}

设置高程纹理是为了渲染绘制,设置高程网格是为了分析计算,目的是不一样的。

 

待继续分析列表:

9、earth文件中都有哪些options((九)中问题)

10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

11、rex地理信息引擎的四梁八柱((九)中问题)

12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

14、地形变形(Terrain morphing)((十二)中问题)

15、地球瓦片过期门限的含义((十二)中问题)

16、高分辨率优先的含义((十二)中问题)

17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

18、活跃瓦片寄存器的作用((十二)中问题)

19、资源释放器子节点的作用((十二)中问题)

20、共享几何图形池子节点的作用((十二)中问题)

21、分页瓦片加载器子节点的作用((十二)中问题)

22、分页瓦片卸载器子节点的作用((十二)中问题)

23、栅格化器子节点的作用((十二)中问题)

24、地形子节点的作用((十二)中问题)

25、绑定渲染器的作用((十二)中问题)

26、地图回调函数的作用((十二)中问题)

27、如何将地图图层添加到r

<think>根据用户的问题,用户想要了解在osgEarth中加载TMS地形瓦片时如何设置最大瓦片级数。结合提供的引用,特别是引用[3]中提到了瓦片分级(rex引擎的21级和Google的23级),我们可以推断设置最大瓦片级数可能与瓦片地图服务本身的能力以及osgEarth的配置有关。 在osgEarth中,通常通过Earth文件(.earth)中的配置项来设置瓦片层的属性。对于TMS地形瓦片,我们可以在对应的图层(ImageLayer或ElevationLayer)中设置最大层级(max_level)。 具体步骤: 1. 在Earth文件中,找到对应的地形图层(可能是ElevationLayer)。 2. 在图层内添加`<max_level>`标签,设置最大层级数值。 示例Earth文件片段: ```xml <elevation name="my_tms_terrain" driver="tms"> <url>http://example.com/tms/terrain</url> <max_level>18</max_level> </elevation> ``` 注意: - `max_level`的值应该根据你的TMS服务实际支持的最大级别来设置。如果设置的级别超过服务实际提供的级别,可能会导致加载失败或空白。 - 引用[3]中提到rex引擎默认最大为21级,而Google为23级,这可能是不同瓦片服务采用的级别不同,所以需要根据实际情况设置。 另外,如果是在代码中动态设置,可以使用osgEarth的API。例如: ```cpp osg::ref_ptr<osgEarth::ElevationLayer> layer = new osgEarth::ElevationLayer(); layer->setName("my_tms_terrain"); layer->setURL("http://example.com/tms/terrain"); layer->options().maxLevel() = 18; ``` 但是用户的问题中并没有明确是使用Earth文件还是代码,通常Earth文件配置更常见,所以优先给出Earth文件的配置方法。 如果用户遇到设置后无效的情况,可能需要检查: 1. TMS服务是否支持该级别。 2. 是否在正确的图层(地形图层)中设置。 3. 是否有其他设置覆盖了最大层级(比如在Map选项中设置了全局最大层级)。 引用[3]中提到的rex引擎的默认21级,这可能是osgEarth内部引擎的限制。如果用户需要超过21级,可能需要检查osgEarth的版本和配置。不过,通常TMS服务的最大级别不会超过23级(如Google地图)。 总结:在Earth文件中对应的地形图层内添加`<max_level>`标签并设置所需的最大层级。 </think> 在 osgEarth 中加载 TMS 地形瓦片时,可通过以下方法设置最大瓦片级数: ### 1. **在 Earth 文件中配置** 在 TMS 图层的定义中添加 `<max_level>` 标签指定最大级别: ```xml <elevation name="tms_terrain" driver="tms"> <url>http://tileserver/{z}/{x}/{y}.terrain</url> <max_level>18</max_level> <!-- 设置最大加载级别 --> </elevation> ``` ### 2. **通过代码动态设置** 在 C++ 代码中使用 `ElevationLayer::setMaxLevel()` API: ```cpp #include <osgEarth/ElevationLayer> #include <osgEarth/TMS> // 创建 TMS 地形层 TMSOptions tmsOptions; tmsOptions.url() = "http://tileserver/{z}/{x}/{y}.terrain"; // 设置最大瓦片级别为 18 tmsOptions.maxLevel() = 18; // 添加到地图 ElevationLayer* layer = new ElevationLayer("tms_terrain", tmsOptions); map->addElevationLayer(layer); ``` ### 关键注意事项: 1. **级别范围** 最大级别需在 TMS 服务支持的范围内(通常 `0` 为最低分辨率,`18-23` 为最高),超出实际级别会导致加载失败[^3]。 2. **性能平衡** 高级别瓦片(如 `>20`)会显著增加内存和渲染负载,需根据硬件能力调整。 3. **引擎限制** osgEarthRex 引擎默认最大支持 21 级,若需更高(如 23 级),需修改引擎配置。 4. **坐标系匹配** 确保瓦片坐标系(如 `EPSG:3857`)与 osgEarth 的 `SpatialReference` 设置一致。 > **示例效果**:设置 `max_level=18` 后,当地形缩放级别超过 18 时,将自动停止加载更精细的瓦片,改用下级瓦片插值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值