看到不少人在群里问QGIS怎么把DEM变成三维看,其实这个问题我在项目里折腾过不少次。最开始做地形分析时,用ArcScene加载DEM搭场景,又重又慢,换个视角还会卡。后来换成QGIS自带的3D Map View,配合一点数据预处理,流畅度和效果都出乎意料。这篇文章就把我从数据下载、坐标系处理到三维场景参数调优的完整路径写清楚,顺便把我踩过的坑一并记录下来。
QGIS本身是个开源桌面GIS软件,支持栅格和矢量的常规分析,三维方面其实长期不算它的强项。但从2.18开始加入的3D Map View已经相当能打,搭配2.5D渲染和Qgis2threejs插件,基本能满足地形展示、坡度分析结果可视化、项目汇报这类需求。关键是它免费、跨平台、不需要额外的三维运行环境,这对很多做规划、地质、环境相关工作的朋友来说,省掉了申请商业软件许可的时间成本。
如果你手头只有一景DEM数据,想快速看山头走向、沟谷分布,或者要给别人演示某个区域的地形变化,这篇文章的思路应该是目前最省事的一种做法。就算你之前完全没接触过三维GIS,只要按步骤操作,也基本能在这个周末内做出可交互的三维地形场景。
1. 内容整体设计与思路拆解
1.1 先搞清楚DEM数据展示三维最核心的问题
DEM(数字高程模型)本质是一个单波段栅格,每个像元记录的是地面高程值。你在二维视图里看到一张灰不溜秋的图,视觉上只有灰度差异,很难直观感受地形的起伏。所谓三维展示,就是要把这个“高程值”映射到三维空间的Z轴上,再用颜色或光影叠加出立体感。这里最关键的不是渲染特效,而是坐标系统和Z轴拉伸比例这两个基础参数,它们决定了三维地形是否变形、是否符合实际尺度。
很多初学者一上来就把DEM丢进QGIS,然后打开3D Map View,发现地形是个平板或者被拉成一根刺,第一个反应是软件坏了,实际上就是投影坐标系和垂直拉伸没设置好。我自己的经验是:在做三维之前,一定要把数据统一到合适的投影坐标系(比如UTM),Z轴的单位和X、Y轴单位保持一致,否则三维还原必然失真。
1.2 三条技术路线能实现三维DEM展示
在QGIS里做三维DEM展示,主流有三条路:
| 实现方式 | 操作难度 | 交互程度 | 适合场景 |
|---|---|---|---|
| 2.5D渲染(图层属性里直接选) | 极低 | 只能静态看图 | 快速出效果图、排版配合 |
| 3D Map View(自带三维地图视图) | 低 | 可旋转、缩放、导航 | 日常分析、动态演示 |
| Qgis2threejs插件导出Web三维 | 中 | 导出的HTML可交互 | 成果分享、报告附件、局域网展示 |
值得注意的是,2.5D渲染和3D Map View的逻辑完全不同。2.5D是把二维图层的每个要素按照高度拉伸,适合给建筑面、地块之类做假三维立起来看;而3D Map View是真正以DEM的栅格高程值生成地形表面,精度上更接近真实,这也是我下面第二、三部分重点展开的内容。
1.3 为什么我最终选择QGIS而不是其他三维软件
拿ArcGIS Pro做对比的话,Pro的Scene功能确实更强,能做地下体和垂直剖面,但正版许可不便宜,学习成本也高。用专门的游戏引擎(比如Unity)导入DEM再做地形,自由度大但是对于非计算机背景的人来说实在不友好。QGIS走的是“够用就好”的路线:你只需要一个交互式三维地形,用于看趋势、对方案、做汇报,那它在10分钟内就能解决问题。如果是要出出版级山体阴影图,那另说,那个重点不在三维,而在2D制图。
所以我的结论是:如果你只是想在GIS工作流里加一个地形的空间认知环节,QGIS的三维完全够用,不需要额外引入重型软件。
2. 数据准备:从哪下载DEM、怎么导入才不出问题
2.1 DEM获取渠道与分辨率取舍
做三维展示的第一步是拿到一块完整、干净的DEM数据。目前最常用的几个来源:
- OpenTopography:这个网站可以直接在网页框选范围下载SRTM、ALOS等全球DEM,支持输出GeoTIFF格式。热搜词里被反复提及的“opentopography dem downloader”就是它。
- 地理空间数据云:国内访问快,有ASTER GDEM 30米和部分12.5米数据,不过注册有时要等审核。
- NASA Earthdata:原始数据源,但下载流程比较繁琐,新手容易在授权的环节卡住。
分辨率选择上,12.5米数据(比如ALOS PALSAR)放在中小尺度区域做三维已经非常细腻,30米数据做全国范围或省级范围足够,太高分辨率(比如1米LiDAR)对于QGIS三维展示反而会带来极大的渲染负担。建议先下载大范围低分辨率的DEM做底,确定区域后再考虑加密。
2.2 导入QGIS前必须处理的三个细节
第一步是坐标系。国内用户经常拿到的是WGS84地理坐标(经纬度),直接做三维会出现一个严重问题:X、Y单位是度,Z单位是米,系统强制拉伸后地形会严重变形。我的做法是先用QGIS的“重投影”工具,把DEM转到当前区域的UTM投影坐标系(比如北半球中纬度用UTM 50N之类的带号)。操作路径在工具箱搜索Warp (Reproject),输出设置里选好目标CRS即可。
第二步是检查数据范围和空值。DEM数据经常在边界处有大片黑边(NoData区域),这些NoData在三维场景里会被渲染成窟窿,很难看。可以用栅格计算器将NoData赋成一个统一值,或者在三维场景里通过设置透明度过滤掉。实操中发现很多人在这一步栽跟头:明明三维场景有地形,但边界洞洞坑坑,就是NoData没处理干净。
第三步是数据预处理中的分割与合并。热搜词里有“gis中dem如何分割”,实际意思是如果一个市域范围DEM太大,一次加载内存吃不消,需要按行政区划或研究区裁剪。QGIS的Clip Raster by Extent或者Clip Raster by Mask Layer都可以,裁剪后用Build Virtual Raster把多块DEM虚拟合并成一个,并不需要实际拼接大文件。
2.3 DSM和DEM不要混用
热搜词里反复出现“dsm生成dem”,这是另一个常见误区。DEM是地表高程模型,纯地形;DSM是表面高程模型,包括树木、建筑。如果你用DSM做三维展示,山谷可能被树顶抬高、城市地块比实际地形突出几十米,会误导判断。如果生产项目里只有DSM,需要先做滤波处理生成DEM,再用DEM做三维。优先级上,DEM永远比DSM更适合做地形三维底图。
3. 实操:QGIS里把DEM变成三维的完整流程
3.1 快速出图:2.5D渲染的使用场景
如果你只是想在报告里放一张“假三维”的静态图,2.5D渲染是效率最高的方案。
在图层上右键打开图层属性,选择“符号系统”,渲染类型从“单波段假彩色”切换到“2.5 D”。这里需要设置高程属性为栅格值本身,在“Height”里选择DEM波段。给一个适当的垂直拉伸比例,比如50%,意思是Z方向拉伸为实际比例的50%,视觉效果会更夸张,适合表达平坦地区微小的地形变化。再把颜色用色带渲染(如高程分级色带)叠加一下,立体感和色彩层次就都出来了。
但2.5D的局限是它本质上是把栅格按高度拉伸成的“柱状物”,渲染出来其实更像一块实心蛋糕,并不是真实的地形曲面。适合快速出效果图,不适合做精细分析。要真正的三维表面,还需要往下看。
3.2 核心功能:3D Map View生成交互三维地形
QGIS的3D Map View是我目前常用的主力方案,步骤不复杂:
- 点击菜单“视图(View)”→“新建三维地图视图(New 3D Map View)”。会弹出一个新的三维面板。
- 在三维面板左侧工具栏上找到“配置”按钮(齿轮图标),进入地形参数设置。
- 在“地形(Terrain)”选项卡中,把“类型(Type)”选择为
DEM (Raster Layer),然后在下面选择你的DEM图层。 - 关键参数“高程精度(Elevation)”建议设置为
0.0,也就是直接用原始像元分辨率,不做抽稀,保证显示精度。如果数据量巨大,可以适当增大这个值,让渲染更快。 - “垂直拉伸比例(Vertical scale)”先设成
1.0,看地形平缓就逐步调到2.0甚至4.0。
完成上述设置后,三维面板就会生成一个立体的地形表面,鼠标左键旋转视角,右键平移,滚轮缩放。此时如果觉得地表颜色太素,可以把DEM图层在普通二维视图中用山体阴影渲染,这样三维面板也会实时联动显示山体阴影效果。
3.3 垂直夸张值:理解Z因子为什么重要
很多人不理解为什么三维地形显示出来跟想象中不一样,其实问题多半出在垂直拉伸这个参数上。这里的原理涉及单位匹配:如果DEM是UTM投影坐标,X、Y单位是米,而高程单位也是米,那么垂直比例1.0代表一个完全真实、毫无夸张的地形。但真实地形在平缓地区(比如海拔高差只有两三百米)的起伏用肉眼看并不明显,所以视觉上需要放大Z轴。
我的经验数据:在平原地区(高差小于200米)展示地形时,垂直拉伸设为3.0效果比较好;在丘陵地区(高差200-1000米)设为1.5左右;在高山地区(高差超过1500米)就保持1.0或0.8,否则峡谷会被拉得过于深邃,影像观看。
注意,Qgis2threejs插件里也有一个类似的“Vertical Exaggeration”(垂直夸大)参数,它和三维地图面板里的垂直拉伸是一个概念。这里没有固定的标准答案,建议用三维面板反复拖动数值,找到视觉上最舒服的比例即可。重要提醒:如果你要把三维场景导出保存或者统计数据,这样的夸张比例仅用于可视化,不能用于定量测量,这一点需要在报告里注明。
3.4 用Qgis2threejs导出Web三维场景
如果你需要把三维场景发给没装GIS软件的同事或客户,Qgis2threejs插件是首选。它是QGIS的官方插件之一,功能是把当前QGIS的二维和三维内容导出成一个独立的HTML文件,浏览器打开即可交互查看。
安装方法很简单:菜单“插件”→“管理和安装插件”,搜索Qgis2threejs,点击安装。装好后在“网页”菜单中会多出一个“Qgis2threejs”入口。
操作要点:
- 先加载DEM,并设置好符号颜色。该插件在导出时会把当前图层的外观带进Web三维场景,所以在二维视图里把颜色渲染好很重要。
- 在Qgis2threejs界面中,把DEM图层勾选为“对于侧面显示(Side)”或“作为地形(DEM)”的模式。这个选择决定DEM是作为地面被贴图,还是作为生成的块状要素。
- 设置“垂直夸大值”,参考上面3.3的选择逻辑。
- 点击“导出”按钮,指定输出HTML文件位置。导出完成后用浏览器(Chrome、Edge)打开验证。实测下来场景加载速度与文件大小挂钩,一个县域30米DEM导出的HTML通常在20-80MB之间,浏览器打开时最好用本地文件,不要拖进在线网盘直接预览。
如果导出后看不到线条或颜色,先在QGIS主界面重新把项目保存一次,再重新导出。另外,这个插件对中文路径有时候会出现兼容问题,建议导出路径不要包含中文和空格。
3.5 二三维联动:把二维分析结果叠加到三维场景
三维DEM不一定只放裸地形,你还可以叠加上等高线、坡度分级、土地利用等矢量或栅格分析结果。比较实用的操作是:先在二维视图中把坡度图做好,然后让三维场景也显示这个坡度图层(只需在图层列表中勾选可见性)。
操作上,三维地图面板默认会同步显示主画布中所有勾选的矢量图层。所以只要在二维视图把需要展示的要素加上颜色标注,三维面板就会自动叠加显示,不需要手动一个个添加。这里有个小技巧:如果你加了标注文字,三维里文字的朝向不一定跟随地图方向,视觉上会乱,建议在展示时把标注先关掉。
4. 常见问题与排查技巧实录
4.1 DEM加载后三维面板里显示成一块平板
很多人第一次打开三维地图视图,发现地形完全没起伏,就是一整块色块。这个问题的原因通常是:地形类型没有选择DEM,还是默认的“平面(Flat)”。需要到三维配置面板的“地形”选项卡里,把类型从Flat切换成DEM (Raster Layer),再选中对应的DEM栅格图层。这不是软件bug,纯属操作不熟。
另外一种可能是你选择的DEM分辨率太大、数据范围太大,QGIS自动做了抽稀,导致细节丢失。检查“高程精度”参数,如果值大于10,就把它调成0.0,让每个像元都参与渲染。
4.2 三维场景出现黑洞或破碎面
如果你看到地形表面局部像被挖掉一块,大概率是原始DEM里有NoData空洞。这种空洞往往发生在水域、传感器遮挡区域或地形陡峭的雷达阴影区域。解决思路有两个:第一,用栅格计算器把NoData区域赋值为周围平均高程;第二,更简单——在图层属性透明度里,把NoData的颜色设置为完全透明,这样至少视觉上不是黑色的坑。我建议项目精度要求不高时用第二个方案,省时。
4.3 三维显示非常卡顿,拖动视角一帧一帧的
DEM数据量太大是首要原因。一个省域范围30米DEM,像元数量可能在几千万甚至上亿级别,单纯让CPU实时构建整个网格很吃力。解决办法通常有这几条:
- 在三维配置中把“最大屏幕误差(Maximum allowed screen error)”从默认值调大,比如调到2.0或4.0。QGIS会自动在放大时加载高细节、缩小时加载低细节,流畅度提升明显。
- 先把DEM按研究区裁剪缩小范围,再加载进三维场景。
- 关闭三维面板的“高质量显示(High quality)”选项,在演示时可以牺牲一些画质换流畅操作。
4.4 三维场景颜色非常灰暗,不立体
这个需要区分是渲染问题还是视觉问题。如果DEM用的渐变色带类别太少,比如只有5个分类,颜色过渡会有断层感,看起来就不立体。建议用“单波段假彩色”渲染,色带选择Spectral或Terrain,类别至少分10段以上。如果觉得还不够立体,可以在DEM下方叠加一个半透明的山体阴影图层,三维面板里会形成“彩色叠加阴影”的效果,视觉上立刻有了起伏感。
4.5 导出Qgis2threejs的HTML打开以后不能缩放
不要慌,这是浏览器安全策略的问题。如果你的HTML文件存放在某个云盘中,通过在线链接打开,有些浏览器会限制本地文件权限,导致交互事件被阻止。正确做法是把HTML下载到本地,或者在服务器上部署为静态页面。如果在本地打开没有问题,那就说明场景文件本身是好的,问题出在在线预览方式。
4.6 常见问题速查表
| 现象 | 可能原因 | 快速修复 |
|---|---|---|
| 三维面板平板一块 | 地形类型未选DEM | 配置→地形→类型选DEM(Raster Layer) |
| 地形边界破洞 | 原始数据NoData未处理 | 设置NoData为透明,或补值 |
| 地形严重失真、像刺一样 | 投影坐标未处理为投影系 | 重投影到UTM坐标系后再展示 |
| 平缓区域看不出地形起伏 | 垂直拉伸比例太小 | 把垂直拉伸调到2.0-3.0 |
| 拖拽视角卡顿 | 数据分辨率过高/范围过大 | 增大最大屏幕误差或裁切数据范围 |
| 导出的HTML在浏览器打不开 | 文件路径含中文/云盘访问权限 | 保存到本地纯英文路径,用浏览器打开 |
| DEM加载后全黑 | 渲染拉伸方式不对 | 在图层属性中改为“单波段假彩色”,选择“线性拉伸” |
5. 数据配色、场景优化的进阶技巧
5.1 善用山体阴影叠加提升三维质感
裸DEM三维显示如果用单一色带,看久了感觉像塑料模型。要想在三维里呈现“立体光影”的效果,最简单的方式是在二维视图中给DEM叠加一个山体阴影图层,然后把山体阴影图层设为半透明(比如透明度50%)。三维面板会同步显示这个半透明阴影,地形表面的山脊线、沟壑走向会变得非常明显。这个技巧我几乎每次出地形图都会用,效果立竿见影,而且不增加任何额外计算负担。
具体操作:在工具箱搜索Hillshade(山体阴影),参数里的光源高度因子设置为45度,方位角默认315度即可。生成后把山体阴影图层放在DEM上方,右键图层“属性”里调透明度。三维面板里能看到透明阴影和彩色DEM叠加的最终效果。
5.2 矢量数据叠加进三维场景的“贴地”问题
实际上很多项目不仅需要展示DEM,还需要在三维地形上叠加道路、河流、建筑面等矢量信息。这部分我试过很多次,踩过不少坑。比较稳定的做法是把矢量图层叠放在DEM图层之上,但在三维可视化时,矢量要素默认是浮在地面之上的,需要勾选图层属性的“绘制要素在3D上”相关选项,否则线条会悬浮在半空中。
更稳妥的方案是通过Qgis2threejs插件导出前,先对矢量图层做“拉伸”处理。比如建筑面可以用数据定义的“高度”属性生成一个类似白色模型的效果,这就是热词里提到的“qgis建白模”的简化实现:把建筑底面根据楼层数拉伸成立方体,再叠加到DEM三维地形上,就能生成一个城市级的三维场景。虽然精细度不如专业三维软件,但胜在操作简单、数据量轻、还能保持空间参考一致。
5.3 大场景下用金字塔与缓存策略加速展示
当你需要展示整个流域或省域范围DEM时,即使裁剪过,数据量依然不小。我的做法是先在QGIS中把原始DEM生成“概览金字塔(Overviews)”,方法是图层属性→“金字塔”选项卡→点击生成。这样QGIS在三维场景缩小视野时,会自动调用低分辨率范围的概览,避免实时读取超大原始数据。生成金字塔后,三维漫游的流畅度会有质的提升。这个步骤很多人会忽略,实际上它比改任何三维参数都有效。
6. 关于QGIS三维DEM展示的个人心得
在实际项目里,我总结了一套适合自己的流程:先用OpenTopography下载小范围DEM,用QGIS重投影到UTM,顺手做好山体阴影和配色,然后用3D Map View做日常的判读和检查,最后用Qgis2threejs导出让同事在浏览器里复核。整个过程30分钟到一个小时基本能走通,比起以前用商业三维平台动辄半天的数据转换,效率提升不是一星半点。
最后想单独提一点:很多人在三维场景里纠结于颜色好不好看,花大量时间去调色带,实际上对于DEM三维展示来说,色调的准确性和地形细节的纹理清晰度远大于色调的鲜艳程度。你先保证数据准确、坐标正确、拉伸合理,再考虑视觉风格。如果你在做的过程中遇到新的奇怪问题,不妨先重启QGIS清一下缓存,再检查数据范围,大部分问题都能在数据层面找到原因。这套流程我现在已经形成肌肉记忆了,希望写出来对你也有参考价值。