赞
踩
在Blender和Godot中显示真实区域3D地形。
用QGIS处理和导出真实区域的高度图。
在Blender中利用高度图制作3D地形模型。
通过Godot Terrain3D插件,将高度图导入Godot中进行处理和显示。
比如福州市范围是北纬[25°15′, 26°39′]、东经[118°08′, 120°31′]。
地球长半轴6378.137千米(参考《GB 22021》附录A),可得福州市东西向距离约240.0千米、南北向距离约155.8千米。
要在分辨率为1920*1080的一屏内完整地显示福州市俯瞰图,那么东西向125.0米每像素、南北向144.3米每像素。
当分辨率为3840*2160时,东西向62.5米每像素、南北向72.1米每像素。
一般选用与实际显示分辨率相当或略高的地图数据。
本例选用最佳开源DEM——哥白尼DEM,数据下载参考最佳开源DEM全国、省、市、县DEM数据分享。
只需下载“哥白尼全国dem\原始数据\全国原始DEM数据(float32)”中的原始数据。
其中每个文件包含经纬度范围6°*6°的数据,每个像素对应地球表面的1角秒*1角秒,或称地面分辨率为30米。
小知识:角度单位秒,又称角秒、弧秒(arc second),1秒=(1/3600)度=(1/60)分。
在以地球长半轴为半径的大圆上,圆心角1秒对应大圆上的弧长30.92米,1度对应111.3千米。
安装QGIS,后续将使用它处理地图数据。
本例中使用QGIS 3.36。
把原始地图数据文件逐个(用鼠标拖拽)导入QGIS图层(Layers)窗口,能完全覆盖所需区域即可。
为检查区域覆盖情况,需导入行政区划界线数据。
可参考民政部:行政区域界线资源、阿里云DataV.GeoAtlas地理小工具、EasyMap或ruiduobao/shengshixian.com等获得行政区划数据文件。
本例从阿里云DataV.GeoAtlas下载json格式的福州市区划文件。
使用合并(merging)功能(在ArcGIS中称为镶嵌mosaicking,菜单项Raster->Miscellaneous->Merge…,或Processing Toolbox->GDAL/Raster miscellaneous/Merge),合并多个地图文件以覆盖目标区域,方便后续处理。
福州市可被单个地图文件(115E21N_COP30)覆盖,可以跳过这一步。
如果是福建省,就要使用两个地图文件(另加115E27N_COP30)进行合并。
本步骤完成后:
卫星遥感数据一般采用WGS84地理坐标系(参考《GB/T 17798》附录C)。
地理坐标系不适合直接用于制图,制图要采用投影坐标系。
地图投影方式参考《GB 35650》第6章 数学基础,根据地图比例尺:
显示比例尺S可根据《GB 35650》表7、表8大致确定范围,也可参考《GB/T 35634》第4章 分级来计算:
S = 1:(Gr*Sr)/0.0254
其中,
哥白尼DEM的地面分辨率约为30米每像素,对应比例尺为1:113386。
因此,本例中福州市的投影坐标系要采用“Gauss-Kruger CM 117E”坐标系。
使用重投影(reproject)功能(菜单项Raster->Projections->Warp(reproject)…,或Processing Toolbox->GDAL/Warp (reproject)),在“Target CRS”输入框选择合适的投影坐标系,将地图数据从地理坐标系变换到投影坐标系。
本例中“Target CRS”选择:“EPSG:4509 - CGCS2000 / Gauss-Kruger CM 117E”:
重投影后(调整了图层顺序和显示开关):
注意:图层窗口中重投影后的图层(Reprojected)的数据值范围与重投影前相差很大。
这是因为图层属性信息是通过二次采样数据得到的,并没有遍历全部数据。
在图层属性信息窗口中,也会显示“STATISTICS_APPROXIMATE=YES”表示统计信息是基于部分数据得到的近似值。
使用裁剪(clip)功能,可选择按范围(by extent)或按掩码层(by mask layer)等方法对地图区域进行裁剪。
如果按行政区划界线进行按掩码层裁剪,要注意公开地图内容表示的要求和风险(参考《GB/T 35764》)。
本例采用福州市行政区划的外接长方形进行范围裁剪:
裁剪后:
如果原始数据的分辨率过高,使得最终每个像素要代表多个采样数据,那么最好使用重采样(resample)来合并优化数据。
重采样也使用重投影(reproject)功能来实现。
在重投影弹出窗口中为“Resempling method to use”选择合适的重采样算法,推荐Lanczos Windowed Sinc方法(参考:投影重采样),并设置合适的输出分辨率“Output file resolution in target georeferenced units”。
如果不使用QGIS而使用ArcGIS,重采样算法可采用三次卷积(cubic)或双线性(blinear)方法。
本例有继续放大显示图像的需求,可以跳过这一步。
地图数据处理最终输出的高度值将采用16位无符号二进制数表示,取值范围是[0, 65534](65535保留给可能的NoData使用)。
将地图数据变换到给定的取值范围,就称为重设比例(rescale)。
使用GRASS插件的r.rescale重设比例功能:
重设比例后:
从图层属性窗口的“Symbology”页可知,高度[-29, 1799]米变换为高度值[0, 65534]。
通过r.rescale这种方法生成的图最终在Godot Terrain3D中使用会出错。
还可以采用栅格计算器来重设比例:
处理结果:
上一步处理后的地图数据仍是Float32类型,而高度图要采用16位无符号二进制数表示高度值,因此需要进行类型变换。
使用变换(translate)功能:
完成:
利用上一步输出的高度图,使用Blender制作3D地形模型。
本例使用Blender 4.0.2。
具体步骤可参考3D渲染地图教程或Creating Shaded Relief in Blender。
以高度图分辨率=7335*5330为例,设置以下属性:
在Blender着色器编辑器中修改平面材质对应的着色器。
参考配色方案:
材质预览
渲染(和灯光、环境等设置有关)
河流上游、水库和湖泊等水体的海拔可能较高,甚至高于下游陆地,因此不能完全依赖高度来确定是否水体。
采用去云处理后的卫星光学影像。
在着色器中增加图像纹理节点替换颜色渐变节点。
略。
Godot Terrain3D插件要求使用exr或r16/raw格式的高度图,参考Terrain3D: Height map。
将QGIS导出的TIF格式的高度图转换为OpenEXR格式,有几种办法:
GIMP
用GIMP打开TIF文件,选择菜单项“文件->导出为”,导出文件名后缀改为exr。
OpenImageIO中的iconvert工具
在MSYS2/MinGW64中:
pacman -S --needed mingw-w64-x86_64-openimageio
iconvert.exe --compression zip G:/download/game/DEM/ht_3501.tif G:/download/game/DEM/ht_3501_oiio.exr
因为本例没有做重采样降低分辨率,所以高度图分辨率和原始数据的地面分辨率相近,为29.55米每像素;也可在QGIS的图层属性信息窗口查看“Pixel Size”。
高度范围[-29, 1799]m,按真实高度比例可设置“Import Scale”=(1799+29)/29.55=62。
用Godot Terrain3D插件导入:
百家号:一文了解DEM数字地形“全家桶”
百度网盘:哥白尼全国dem
163:常用免费DEM数据汇总
微信:常见卫星图源下载教程
知乎:常用卫星参数及数据获取网站介绍
微信:GIS基础教程之坐标系
民政部:行政区划代码
国家统计局:统计用区划代码和城乡划分代码
百家号:2个免费下载全国行政边界数据网站
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。