osgEarth的rex地理引擎的工作原理

本文详细解析了三维地理信息系统中图形节点的加载流程,包括程序初始化时的基础图形节点构建,更新遍历时的图形节点加载与场景树整合,渲染遍历时的图形节点请求及数据库线程处理过程。

1、程序初始化时

构建基础的图形节点

 

2、更新遍历时(updateTraversal)

加载请求的图形节点到场景树中

通过调用DatabasePager.cpp中的addLoadedDataToSceneGraph函数实现,需要添加的节点存放在_dataToMergeList列表中

3、渲染遍历时(renderingTraversals)

请求新的图形节点,并将请求交给dabasepager的请求队列_fileRequestQueue(文件加载地理信息)或_httpRequestQueue(网络加载地理信息)

4、dabasepager线程运行时

处理3中图形节点请求(主要是从文件、网络、缓存中读取地理信息),形成请求列表_dataToMergeList,在更新遍历时由2处理该请求列表

//DatabasePager.cpp

755:osg::ref_ptr<DatabaseRequest> databaseRequest;

756:read_queue->takeFirst(databaseRequest);

//......从文件、网络、缓存中读取地理信息

972:databaseRequest->_loadedModel = loadedModel;

990:_pager->_dataToMergeList->addNoLock(databaseRequest.get());
osgEarth 中配置自定义投影类型,主要依赖于 `<map>` 配置文件中的 `<profile>` 元素,它用于指定地图的投影方式和空间参考系统。osgEarth 支持多种内置投影配置,包括 `global-mercator`(Web Mercator)和 `eqc-wgs84`(Equirectangular)等,同时也允许开发者通过定义空间参考系统来实现自定义投影[^3]。 要实现自定义投影,首先需要在地图配置文件中将 `type` 设置为 `projected`,然后在 `<profile>` 标签中指定所需的投影名称或 EPSG 编码。例如,若要使用等距投影(Equirectangular),可以在配置文件中使用 `eqc-wgs84` 作为 profile 名称[^2]。若需要使用其他投影,如 EPSG:3857(Web Mercator),则可以使用 `global-mercator` 作为 profile 名称[^3]。 以下是一个使用等距投影的地图配置示例: ```xml <map name="EquirectangularMap" type="projected" version="2"> <options> <terrain driver="rex"/> <profile>eqc-wgs84</profile> </options> <image name="World Image" driver="gdal"> <url>world.tif</url> </image> </map> ``` 如果需要定义一个 osgEarth 不直接支持的自定义投影,可以通过创建自定义的空间参考系统(SpatialReference)来实现。这通常涉及调用 `osgEarth::SpatialReference::create` 方法并传入对应的 EPSG 编码或 WKT 定义。例如: ```cpp osgEarth::SpatialReference* srs = osgEarth::SpatialReference::create("EPSG:XXXX"); ``` 其中 `"EPSG:XXXX"` 替换为实际的 EPSG 编码或 WKT 描述字符串。随后,可以将该空间参考系统应用到地图的 profile 设置中,以实现特定的投影需求。 在配置过程中,还需确保数据源的空间参考与地图的投影一致,否则需要进行坐标转换。osgEarth 提供了 `osgEarth::GeometryUtils::transformGeometry` 等工具方法用于处理不同坐标系统之间的几何数据转换。 此外,osgEarthRex 引擎支持基于投影的地形渲染,因此在配置文件中指定 `<terrain driver="rex"/>` 可以更好地适配不同的投影方式[^2]。 ### 相关问题 1. osgEarth 中如何配置 EPSG:3857 投影? 2. 如何在 osgEarth 中实现等距投影地图的高效渲染? 3. osgEarth 是否支持通过 WKT 定义自定义空间参考系统? 4. osgEarth 中如何实现不同图层使用不同投影的叠加显示? 5. osgEarthRex 引擎在处理非 Mercator 投影时有哪些优化策略?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值