
简介这套基于MSVC2017编译的OSG 3.6.3与OsgEarth 2.10集成包面向需要在Qt5.14/QtCreator下开发三维地球、地形渲染或GIS应用的C工程师。资源共2000个文件、约530MB以hpp/h头文件、dll动态库、lib导入库和exe示例程序为主体同时包含earth场景定义、shader着色器、shp矢量数据及tif影像等可完整支撑项目配置与二次开发。已有532人学习关注适合正在搭建OSGOsgEarth环境的开发者参考。压缩包内附带一个简单Qt工程展示GraphicsWindowQt、QWidgetImage等关键类的接入方式并给出mainwindow.cpp等示例代码配合作者博文可快速复现环境、理解osg与Qt窗口融合流程省去手动编译和版本匹配的麻烦。 自从在 Windows 上把 OSG 3.6.3 和 osgEarth 2.10 挂到 Qt 5.14.7 下跑通之后身边已经有好几个朋友问我这套环境是怎么搭起来的。坦白说这套组合不算新OpenSceneGraph 3.6.3 独立发布已经有些年头osgEarth 2.10 也是相对成熟稳定的分支Qt 5.14.7 更是 LTS 周期里口碑不错的一个版本。但问题在于网上能找到的教程大多散落在各个论坛的犄角旮旯要么只讲 Linux 下的编译要么就是拿旧版本组合硬套真正把 Windows MSVC2017 这套工具链讲完整的非常少。所以这篇博文就把我自己的完整操作过程重新梳理一遍。无论你是准备从零搭建三维 GIS 开发环境还是已经编译过 OSG、只是想补上 osgEarth 这个地图渲染层这篇内容都可以直接参考。我要讲的不只是“下载什么、点哪里编译”还有我在这个过程中踩过的坑——版本不匹配导致 C 标准库报错、CMake 缓存残留导致 osgEarth 找不到 Qt 模块、运行期 DLL 路径不对导致程序闪退……这些都是文档里不会写、但实际动手时必然会撞上的问题。1. 这套环境组合到底解决什么问题1.1 为什么选择 MSVC2017 工具链Linux 下用 GCC 编译 OSG 已经是标准操作但 Windows 下 C 开发者的选择就复杂得多。MinGW 虽然能用但和 Qt 官方预编译库的 ABI 兼容性一直是个隐患。MSVC2017 的优势在于它和 Qt 5.14.7 官方安装包中提供的 msvc2017 预编译库完全对应这意味着你不需要从源码编译 Qt直接下载官方二进制即可省掉一大块工作量。另一个实际原因是 Visual Studio 2017 的 C 标准支持已经足够完善。OSG 3.6 系列使用的 C11/14 特性在 MSVC2017 下都能正常编译不需要像老版本那样打各种补丁。而且 VS2017 的 CMake 集成做得比较好对新手而言用它做 cmake-gui 的生成器比命令行操作直观很多。我个人的建议是如果你电脑上已经装了 VS2019 或 VS2022其实也可以编译这套组合——MSVC 的向后兼容性做得不错但工程文件生成时记得选对 v140/v141 工具集避免 ABI 错位。如果完全没有 Visual Studio那就老老实实装 VS2017 Community不用额外装其他工作负载只要 C 桌面开发那一个组件就够了。1.2 OSG 3.6.3 与 osgEarth 2.10 的版本匹配关系OSG 和 osgEarth 的关系很像浏览器和网页——OSG 负责底层的场景图组织、渲染状态管理、节点遍历osgEarth 则是在这套底层之上实现地理坐标、地形分块、影像瓦片调度、矢量数据叠加。所以 osgEarth 对 OSG 的 API 有强依赖版本选错编译几乎是必挂。从官方兼容性矩阵来看osgEarth 2.10 明确支持 OSG 3.6 系列2.9 则主要针对 3.4/3.5 做适配。选择 OSG 3.6.3 而不是 3.6.5 或 3.6.6是因为 3.6.3 是当时 osgEarth 2.10 发布时官方测试最充分的版本社区反馈的问题也最少。虽然理论上 3.6 系列内部 api 差异很小但如果你想减少不必要的编译报错就严格按照这个版本组合来。Qt 5.14.7 的选择同样有讲究。5.15 之后 Qt 修改了开源版本的发布策略某些模块不再提供预编译二进制。5.14.7 是最后一个完整提供各平台预编译库的 LTS 之一而且 osgEarth 2.10 的 Qt 集成代码主要是 osgQt 相关模块不需要太新的 Qt API5.14 完全够用。1.3 这套组合的典型应用场景搞定这套环境之后最直接的好处就是可以用 Qt 做界面框架内嵌三维场景视图再用 osgEarth 加载全球影像和地形数据。比如做一个飞行仿真程序的二维仪表板加三维地形窗口或者做一个实时的 GIS 态势显示系统又或者是给已有的 Qt 业务系统增加一个三维场景预览模块。我自己的项目背景是做电力巡检的路径规划需要在地形起伏明显的山区场景里检查杆塔位置、通道树障和航线坡度。这套组合一个月跑下来很稳QMainWindow 负责整体布局左侧是巡检任务列表右侧是 osgEarth 的 MapNode点击列表项时场景飞到对应杆塔位置。另一个典型的场景是离线地图。osgEarth 支持本地文件作为影像和高程数据源不依赖在线服务。对于某些内网环境下不能连外网的应用来说这套组合几乎是标配。用 osgEarth 内置的 earth 文件语法几行配置就能把一个文件夹下的影像切片和高程 DEM 组合成一个三维地形场景。2. 编译前必须搞清楚的几个核心问题2.1 依赖库清单不只是 OSG 和 Qt很多人以为编译 osgEarth 只需要 OSG 和 Qt 就够了这是最大的误区。osgEarth 在 CMake 配置阶段会检查大量的第三方库有些是硬依赖有些则没有也能编译但会禁用对应功能。我整理了一份关键清单GDALosgEarth 读取影像和高程数据的底层支撑几乎是必须的。建议用 3.2.x 或 3.4.x 版本太新的 GDAL 改了一些内部接口老版本 osgEarth 可能编译报错。Windows 下可以下载 GISinternals 编译好的二进制包也可以自己从源码编。CURL用于读取 HTTP 瓦片服务如果你不用在线地图数据源可以跳过但建议还是编上保不齐以后要用。GEOS矢量几何运算库做要素叠加分析时用。属于推荐依赖——没有 GEOSosgEarth 的矢量模块会少掉不少功能。SQLite3 / SpatiaLiteosgEarth 的缓存机制依赖 SQLite对象空间索引会用到 SpatiaLite。这个也是推荐装上。ZLIB / LIBPNG / JPEG / TIFF图像格式支持通常 OSG 编译时就已经依赖这些库如果你之前编过 OSG直接在 OSG 安装目录里就有对应的头文件和库文件。Protobuf较新版本 osgEarth 对 Protobuf 的依赖已经弱化但 2.10 还在用 Protobuf 做序列化所以还是需要。在开始编译之前我建议先把这些库的安装目录统一放到同一个文件夹下比如D:\3rdparty每个库一个子目录include 和 lib 分开存放。后续配置 CMake 时只需要把D:\3rdparty添加到搜索路径里就能一次性找到大部分依赖。2.2 编译顺序为什么必须先 OSG 后 osgEarth这个顺序问题看着简单但确实有人先编译 osgEarth 然后被一堆找不到头文件的错误劝退。osgEarth 编译时必须看到 OSG 的头文件和库文件这是最硬性的依赖。所以必须先把 OSG 编译安装完毕——注意是 install 到某个目录而不是只在 build 目录里生成 .lib 和 .dll——然后再开始配置 osgEarth。OSG 的 install 过程其实就是把生成好的头文件、导入库、动态库、还有一堆插件 dll 拷贝到一个干净的目录。这个目录就是 osgEarth 编译时要引用的OSG_DIR或者叫OPENTHREADS_INCLUDE_DIR之类的 CMake 变量。还有一个细节OSG 的插件机制很特殊它运行时通过OSG_LIBRARY_PATH环境变量寻找插件 dll。所以编译完 OSG 后一定要手动把安装目录下的bin\osgPlugins-3.6.3这个文件夹路径加到环境变量里否则以后跑程序时会出现“不能读取 .ive 文件所有插件加载失败”的情况。2.3 构建目录管理的经验Windows 下的 CMake 构建有一个很让人头疼的问题同一份源码可以生成多种配置的工程文件而 MSVC 的 Debug 和 Release 库不能混用。也就是说如果你用 Debug 方式编译了 OSG那 osgEarth 的 Debug 构建也必须链接 OSG 的 Debug 库否则运行时会报各种无法解析的外部符号错误或者更隐蔽的堆损坏问题。我建议的做法是在源码目录旁边创建一个build文件夹里面再按build_release和build_debug分成两个子目录。这样 CMake 缓存完全隔离开关哪个配置都不会干扰另一个。如果你只需要一个配置那就直接全部用 Release——因为调试方式下 osgEarth 的某些第三方依赖比如 GDAL也要 Debug 版本但 GISinternals 只提供 Release 二进制所以 Debug 版本配置起来会麻烦许多。我自己最后是把 OSG 和 osgEarth 都编成 ReleaseQt 也选择 Release 构建调试时用 Qt 的 QDebug 输出日志和断点来看问题。实践证明只要做好日志输出不依赖 Debug 库也能精准定位大部分 bug。3. OSG 3.6.3 编译实操记录3.1 源码获取与目录规划OpenSceneGraph 的源码在 GitHub 上有官方仓库不要直接下载最新的 master 分支而是切到对应的 tag。3.6.3 对应的 tag 是OpenSceneGraph-3.6.3可以使用 git clone 加 checkout也可以在 GitHub 页面直接下载 zip 包。zip 包的方式更省事但要记得解压时不要带中间层目录比如解压到D:\src\OpenSceneGraph。我习惯把源码编译和安装分得很清楚源码在D:\src\OpenSceneGraph编译中间文件在D:\build\OpenSceneGraph\build_vs2017_x64最终安装到D:\install\OSG。这样做的好处是如果 CMake 配置出问题直接删掉 build 目录重来源码目录永远干净不污染安装目录。3.2 cmake-gui 配置要点解析用 cmake-gui 配置 OSG 时有几项必须仔细对待否则后面编译会浪费很多时间。第一项是BUILD_OSG_PLUGINS默认是 ON一定要保持。OSG 的插件系统通过 Qt 界面看到的那些格式支持读 ive、读 osgb、读 jpg全都是插件做的。如果关掉编译出来的 OSG 连自带的地形文件都打不开。第二项是OSG_USE_QT。在搜索框输入 qt会看到很多以OSG_USE_QT开头的选项比如OSG_USE_QT5、OSG_USE_QT_QOPENGL_WIDGET。如果这里不打开OSG 虽然能编译但缺少 osgQt 模块osgEarth 的 Qt 集成功能也就没法用了。建议把OSG_USE_QT5打开OSG_USE_QT_QOPENGL_WIDGET也打开。同时需要修改QT_QMAKE_EXECUTABLE指向 Qt 的 qmake.exe自己指定路径不要依赖 cmake 自动查找避免找错 Qt 版本。第三项是ACTUAL_3RDPARTY_DIR这是 OSG 查找第三方依赖库的根目录。我建议在 D 盘建一个D:\3rdparty里面放置 zlib、libpng、libjpeg、tiff、curl、gdal 这些库的 include 和 lib。这个变量设置好后cmake 会自动匹配很多依赖项不用一个个手动指。全部配置完成后点击 Generate选择 Visual Studio 15 2017架构选 x64。生成成功后用 VS2017 打开生成的解决方案在“生成”菜单里选择“批生成”把 INSTALL 项目的 Release 勾上再点生成。3.3 OSG 编译中的常见 C 报错OSG 3.6.3 在 MSVC2017 下编译一般在 Release 模式不会出问题。但如果是 Debug 模式我遇到过几次std::map插入迭代器不匹配的错误后来发现是_ITERATOR_DEBUG_LEVEL宏引起的。这个宏由编译选项自动控制当你的第三方库是 Release 版时Debug 编译会把它置为 0这时 STL 容器某些校验就失效了后续行为不可控。这类问题的最好规避方式就是前文说的Debug 和 Release 分开目录编译并且不要把 Debug 版和 Release 版的第三方库混放在一起。还有一个小坑是编译时提示找不到pthread.h。OSG 在 Windows 上实际不需要 pthread但部分头文件仍会条件包含它。解决办法是确保 cmake 检测到了正确的线程库也就是在 cmake-gui 里查看CMAKE_USE_PTHREADS应该为 OFF。如果为 ON手动关掉再重新生成。编译完成后记得跑一下cmake --build . --target install --config Release或者直接在 VS 里生成 INSTALL 项目。然后检查D:\install\OSG\bin下是否有osgversion.exe运行它如果能输出版本号说明安装成功。4. 关键的 osgEarth 2.10 编译过程4.1 编译前准备依赖库检查清单osgEarth 的编译比 OSG 更曲折因为它的 CMake 脚本对第三方库的检查更严格找不到库直接报错退出不会自动跳过。在开始 cmake 之前先手动确认以下库是否齐备GDAL。GISinternals 的包包含一个gdal\bin文件夹里面有 gdal.dll 和一堆辅助 exe。把它加到 PATH 环境变量中osgEarth 的 CMake 脚本会自动找到它。如果你特意指定了路径记住在 cmake-gui 中需要设置GDAL_INCLUDE_DIR和GDAL_LIBRARY两个变量前者指到 gdal 头文件目录后者指到 gdal_i.lib 的完整文件路径。CURL。curl 的 Windows 二进制可以从 curl 官网或者 vcpkg 获得。同样要指定CURL_INCLUDE_DIR和CURL_LIBRARY。SQLite3。SQLite 比较简单只有两个文件需要关注sqlite3.h和sqlite3.lib。网上有编译好的二进制也可以自己从源码编译一分钟搞定。GEOS。GEOS 在 Windows 下编译稍微费点劲建议直接用 vcpkg 装vcpkg install geos:x64-windows会自动把头文件和库文件都放在 vcpkg 的 installed 目录里。如果某个库实在找不到可以考虑在 cmake-gui 里搜索对应模块名直接禁用相关选项。比如OSGEARTH_USE_GEOS设为 OFF 就能关闭 GEOS 支持。但注意GDAL 不要关否则 osgEarth 连最基础的影像读取都做不了那就失去意义了。4.2 CMake 配置osgEarth 的构建选项osgEarth 的依赖库编译齐全后打开 cmake-gui源码目录指向D:\src\osgearth构建目录新建D:\build\osgearth\build_vs2017_x64。点击 Configure选择 Visual Studio 15 2017 x64此时 cmake 会开始扫描依赖。这里最实用的变量排序是先搜索OSG_DIR或OPENSCENEGRAPH_DIR设置成 OSG 的安装目录D:\install\OSG。osgEarth 依赖的 OpenThreads、osgDB、osgUtil 等组件会从这个根目录自动推导。然后搜索QT确认QT_QMAKE_EXECUTABLE指向 Qt 5.14.7 的qmake.exe。把OSGEARTH_BUILD_TESTS关掉这个只影响测试代码不关的话会额外多编译一堆东西。OSGEARTH_BUILD_SAMPLES建议保留为 ON官方提供的示例程序是学习 osgEarth API 最好的资料编译出来后直接可以运行看效果。点击 Configure 直到红色变量基本消失再点 Generate 生成 VS 工程。如果你的依赖库路径设置正确整个过程会在几分钟内结束不再弹新的错误。4.3 解决 osgEarth 找不到 Qt 模块的问题如果你在编译 osgEarth 时出现过Could NOT find Qt5Widgets或者类似的提示这说明 cmake 在查找 Qt 时用了默认路径而不是你安装的 Qt 5.14.7 常用路径。这是因为 Qt 的安装目录不是标准路径CMake 默认只查C:\Qt和 PATH 中定义的路径。解决办法是在 cmake-gui 中手动增加一个缓存变量CMAKE_PREFIX_PATH设为D:\Qt\5.14.7\msvc2017_64然后再重新 Configure。这个变量非常关键。它告诉 CMake 到哪个根目录下找 Qt 的库和组件。设置后所有以Qt5开头的Qt5Widgets_DIR、Qt5Core_DIR、Qt5OpenGL_DIR变量都会自动被解析。也可以在系统环境变量里添加CMAKE_PREFIX_PATH这样以后编译其他 Qt 项目也能用上。如果你发现 Configure 后提示找不到Qt5WebEngineWidgets这个也不要慌。osgEarth 的某些示例会用到 Web 引擎但核心库不需要它。在 CMake 中找到OSGEARTH_USE_QTWEBENGINE选项关掉就行。4.4 编译运行示例程序osgEarth 的编译如果顺利会在 VS 中生成几十个项目。用批生成方式把示例项目全部编译 Release 版也可以只编译你关心的那一个。编译完成后安装INSTALL到D:\install\osgEarth目录。然后打开命令行切换到D:\install\osgEarth\bin运行一个最简单的示例osgEarth.exe D:/install/osgEarth/bin/../share/osgEarth/examples/earth/simple.earth如果一切正常会弹出一个三维地球窗口按住左键拖动旋转视角滚轮缩放视角。如果程序提示找不到 DLL把 OSG 的bin目录和 Qt 的bin目录都加入到 PATH 中再试一次。如果提示找不到 GDAL 数据设置一下GDAL_DATA环境变量为 gdal 安装目录下的gdal-data文件夹。看到地球窗口的那一刻你的环境就算真正跑通了。5. 把 osgEarth 嵌入 Qt 程序5.1 最简 Qt 窗口集成方案现在你有一个能跑起来的 osgEarth 命令行窗口下一步就是把它嵌进直接的 Qt 程序里。最直接的方式是利用 osgEarth 内置的 Qt 视图组件。在 CMakeLists.txt 中需要同时找到 osgEarth 和 Qt5 的包find_package(osgEarth REQUIRED) find_package(Qt5 COMPONENTS Widgets OpenGL REQUIRED)然后在代码中包含 osgEarth Qt 相关的头文件。osgEarth 2.10 中与 Qt 集成相关的模块有osgQt和osgEarthQt直接用 osgEarthQt 中的ViewerWidget是最省事的方案——它封装了地球视图的创建和管理你只需要把一个osgEarth::MapNode传递给它。简单的示例代码如下#include QApplication #include osgEarth/MapNode #include osgEarthQt/ViewerWidget int main(int argc, char** argv) { QApplication app(argc, argv); osgEarth::Map* map new osgEarth::Map(); osgEarth::MapNode* mapNode new osgEarth::MapNode(map); osgEarth::QtGui::ViewerWidget* viewer new osgEarth::QtGui::ViewerWidget(mapNode); viewer-setGeometry(100, 100, 800, 600); viewer-show(); return app.exec(); }这样一个简单的程序已经把 osgEarth 的三维地形渲染窗口嵌入到 Qt 界面中了。不过真实项目中还会涉及影像图层的加载。想要加载本地影像需要在创建 Map 之后添加图层这里涉及的具体 API 会根据 osgEarth 2.10 版本稍有不同但基本思路是构造一个ImageLayerOptions指定 URL 指向一个本地影像文件然后通过map-addLayer()添加到地图上。5.2 编译链接的几处关键设置链接 osgEarth 和 OSG 的库到 Qt 程序时有几个坑要特别注意。第一个是/MD与/MT的切换。Qt 5.14.7 官方二进制默认使用/MD动态运行时库osgEarth 和 OSG 的库编译时也是默认/MD。如果你的项目设置被改成了/MT链接时会出现LNK2038 检测到 RuntimeLibrary 不匹配的错误。解决办法是确保 VS 项目属性中“运行库”选“多线程 DLL/MD”。第二个坑是“找不到 osgPlugins”。当程序运行时报错Failed to load plugin时十有八九是OSG_LIBRARY_PATH没设置好。可以直接在代码里写死路径也可以说在程序的入口函数main里做设置#include osgDB/Registry osgDB::Registry::instance()-getLibraryFilePathList().push_back(D:/install/OSG/bin/osgPlugins-3.6.3);这个方法比设置环境变量更保险因为不依赖部署环境。不过我也见过有的团队在正式项目中用环境变量来管理其实各有优劣代码里写路径适合打包成绿色软件环境变量则方便统一管理多个版本。看你自己的想法。第三个坑是程序退出时崩溃。这个问题很隐蔽表现为窗口正常关闭但进程没有立即终止或者 debug 模式运行结束时弹出堆损坏警告。这往往是因为 osgEarth 内部还有后台线程在跑Qt 的主事件循环退出时这些线程没有来得及停止。解决方法是app.aboutToQuit.connect([]() { viewer-stopThreading(); });在退出前显式调用stopThreading()避免析构顺序混乱导致崩溃。5.3 常见问题加载不出影像、地球是黑的第一次运行集成程序最常见的问题就是地球有轮廓但没有任何影像贴图。这种情况通常是数据源问题——你给的影像路径没有正确命中。可以先在 osgEarth 自带的命令行工具osgearth_package里验证一下这个影像文件能不能正常读取如果命令行也读不出来那就要检查 GDAL 是否配置正确了。有时候 GDAL 没问题但影像的坐标系统超出 osgEarth 预期会导致纹理贴图错位或干脆不显示。碰到这种情况可以先尝试在 earth 文件中显式指定影像的 srs 信息例如map nameMyMap typegeocentric options profileglobal-mercator/profile cache typesqliteD:/test_cache/cache /options image nameimagery drivergdal urlD:/data/imagery.tif/url /image /map然后再加载这个 earth 文件。这里要特别留意profileglobal-mercator/profile这种写法如果影像本身是 WGS84 经纬度投影写成 global-mercator 会导致变形错乱但有的数据源不写 profileosgEarth 就会根据地形文件自己推算。总之搞清楚数据投影信息和 profile 的对应关系是调通 osgEarth 显示的第一步。6. 运行时问题排查与性能调优6.1 部署到别的电脑时 DLL 缺失问题很多人在开发机上跑得好好的换到别的电脑上就立刻闪退这是 Windows 下 C 应用的经典灾难。首次排查直接把 osgEarth 示例程序拷到目标机器上运行如果提示缺少各种 DLL可以用 Dependencies 工具或者老牌的 Dependency Walker检查依赖列表看看具体缺哪个库。解决办法非常简单编写一个批处理脚本把以下这些目录全部加到 PATH 中set PATHD:\install\OSG\bin;D:\install\osgEarth\bin;D:\Qt\5.14.7\msvc2017_64\bin;%PATH%另外还需要确保目标机器上安装了 VC 运行库也就是 vcredist_x64.exe。MSVC2017 编译出的程序依赖 VC 2015-2019 运行库目标机器如果没有程序会在启动阶段弹出“缺少 VCRUNTIME140.dll”的提示。直接把 vcredist 一起打包进部署目录里安装时一并装上。6.2 多线程渲染卡顿与帧率优化用 osgEarth 做三维 GIS 开发时帧率低是最常见的性能投诉。实际上osgEarth 2.10 本身默认启用了一些线程优化比如多线程数据库分页osgDB::DatabasePager和多线程渲染。如果你的程序明显卡顿先检查一下是不是用了 Debug 配置。Debug 下 OSG 的 STL 校验和迭代器检查消耗非常大帧率直接掉一半以上。另一个影响性能的重要因素是视锥体裁剪和 LOD 策略。在大范围地形浏览场景中应该把MapNode的setNearFarRatio调大一点让远平面裁剪得更加激进。同时确保地形图层设置了合适的max_range和min_range让较远区域不用加载高精度数据。示例如下map nameMyMap typegeocentric options lightingtrue/lighting skytrue/sky terrain max_range100000/max_range /terrain /options /map这些设置能显著降低绘制负担。不过具体的数值要根据你的场景大小来调整我在自己的项目里是通过配置项暴露给用户而不是写死在代码里。6.3 判断点是否在 FeatureNode 内的处理思路热门搜索词里有一条“osgearth如何计算点是否在 featurenode 内”我也顺手讲一下自己用过的方法。osgEarth 的矢量数据一般以 FeatureNode 的形式组织每个 FeatureNode 包含一个或多个 feature要素每个要素有几何形状和多边形顶点。要用代码判断某个坐标是否落在某个 FeatureNode 内最简单的做法是利用 osgEarth 的查询接口遍历要素的几何体并调用几何运算库GEOS完成空间包含关系检测。当要素数量很大时建议先用 osgEarth 的空间索引做粗查缩小候选范围再做精细判定。伪代码大致如下for (auto feature : featureNode-getFeatureSource()-getFeatures()) { osgEarth::Bounds bounds feature-getGeometry()-getBounds(); if (bounds.contains(point)) { if (osgEarth::Symbology::Utils::pointInPolygon(point, feature-getGeometry())) { // 点在多边形内 } } }如果点落在多边形边界上不同精度下容差设置会不一样实际项目里可以统一做一层 buffer 再判断免得边上那几米一直被忽略。特别提醒这类几何计算中的经纬度浮点误差容易被忽略在高纬度地区尤其明显条件允许的话先把坐标投影到平面米制坐标系再做判断。7. 我这套环境的最终配置与踩坑总结7.1 版本组合明细表下面把我环境里最终跑起来的组合整理成一个表方便你对照检查组件版本说明操作系统Windows 10 专业版 22H264 位编译器Visual Studio 2017 Community使用 v141 工具集CMake3.20.53.16 以上即可Qt5.14.7msvc2017_64 预编译库OSG3.6.3Release 编译插件完整osgEarth2.10关闭 WebEngine开启 GDAL/CURL/GEOSGDAL3.2.3GISinternals 编译版本CURL7.71.1普通 Windows 版本即可SQLite3.34.0编译时用默认选项这套组合在 Release 模式下运行稳定不管是加载本地地形还是从 WMTS 服务拉取影像基本不会出幺蛾子。7.2 时间成本预估如果你是第一次编译这套环境我大概预估一下时间OSG 全量编译 Release 大约需要 30 到 50 分钟视机器配置浮动osgEarth 的编译在 10 到 20 分钟之间。最耗时间的其实不是编译本身而是环境配置和第三方库的调试。如果之前没有在 Windows 下用 CMake 编译过大型 C 项目第一天可能都在折腾 GDAL 和 CURL 的路径匹配上。所以我的建议是不要一上来就想把全部依赖库都编译一遍。优先用现成的二进制包把时间花在 OSG 和 osgEarth 本身的编译上。等这套组合完全跑通了再考虑是不是需要定制某些第三方库的编译选项。7.3 个人实战心得环境配置最忌讳完美主义最后说一点自己的体会。三维渲染这种技术栈入门最难的不是概念理解而是环境搭建的这一关。太多人卡在“第三方库版本不对”“CMake 配置有误”“DLL 找不到”这些环节上反反复复折腾几天仍然没有进展于是放弃了。我的经验是环境配置这件事最忌讳完美主义。你不需要关心 GDAL 是不是最新版curl 用了哪个版本的 OpenSSLgeos 用的是动态库还是静态库——只要 osgEarth 的 CMake 能检测通过、编译链接不出错那就先往下走。去调整渲染效果、优化帧率、集成到 Qt 界面每一步都先达成一个“能跑”的版本再朝最终目标推进。还有一点是做好笔记。编译失败时不要改一个参数就重新 Configure那是赌运气。最好把错误信息完整复制下来在上面标注是哪个依赖库、哪个 CMake 变量导致的然后把解决过程写进去。等第二次编译时你会发现这套笔记比任何网上教程都管用。我的 D 盘里现在就有一份二维渲染编译笔记每次重装系统或者换机器时都照着它来基本一次通过。补充一条如果只想快速验证这套组合能不能跑可以先不编译 osgEarth 的全部示例只编译osgEarth主库和osgEarthQt插件就够了。示例代码完全可以等主库跑通之后再慢慢编译。这一条能帮你节省至少 10 分钟时间。本文还有配套的精品资源点击获取