ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

宿州30米DEM数据包实操:GDAL投影转换、边界裁剪与坡度分析

宿州30米DEM数据包实操:GDAL投影转换、边界裁剪与坡度分析 简介安徽省宿州市30米分辨率DEM数字高程数据包面向GIS开发者、城市规划与地灾评估人员解决区域地形建模与空间分析需求。数据以GeoTIFF格式存储核心高程栅格同时附带行政边界Shapefile全套文件便于裁剪、投影转换和属性挂接。压缩包共12个文件主要包含tif栅格、shp矢量、dbf属性表、prj投影定义、tfw地理配准及xml元数据等总大小33.64MB结构简洁可直接导入ArcGIS、QGIS等主流平台。数据范围以宿州市行政边界为基准并延伸至周边区域有利于跨边界对比与缓冲区分析。已有379人学习下载适合需要中等精度地形数据开展坡度坡向计算、汇水区提取、可视域模拟或洪水淹没研究的用户。获取后可立即获得完整DEM栅格与配套范围矢量文件避免自行下载拼接和坐标转换的繁琐步骤显著提升项目前期数据准备效率是地理信息类课题与工程应用的可靠基础数据源。1. 先说结论一个zip包解决宿州DEM从哪里来的问题拿到“安徽省宿州市DEM数字高程数据30m含区域范围shp文件.zip”这个包意味着你不用再打开地理空间数据云一帧一帧地下载、拼接宿州市范围的瓦片。30m分辨率的数字高程模型在市级层面做高程分析、坡度坡向、流域划分是最常用的粒度包里附带的区域范围shp文件直接给了你一个行政区划边界省去自己勾画宿州界线的麻烦。你可以用它做农田平整评估、规划选址、通信基站视距分析也可以把它当作后续水文模型的输入底图。接下来的内容按“数据体检→格式转换→按边界裁剪→常见踩坑→延伸分析→成果验证”的顺序展开。新手能照着把数据放进ArcGIS或QGIS熟练工也能直接跳到第三节看命令和参数。2. 打开包之前先搞懂DEM的坐标系、分辨率和shp边界2.1 30m分辨率为什么不是12.5m也不是90m30m这个分辨率放在宿州的地形上是“够用且不拖后腿”的中间值。宿州北部和西部分布着少量低山丘陵中东部是大片平原地形起伏从十几米到几百米都有。30m格网能清楚看到河流下切、岗地垄岗和人工沟渠造成的微地形变化算坡度坡向时不会像90m那样把陡坡抹平又不会像12.5m那样让数据量增加好几倍。如果你只做全市尺度的洪水淹没评估或光伏选址30m完全够如果你要做村庄内部排水渠走向那才需要12.5m或更高精度。很多人下载DEM时一上来就搜“dem数据下载”结果下了90m的全球数据拿到宿州一算平原区的坡度普遍小于0.5度根本分不清哪边高哪边低。30m数据至少能把宿州东西向的地势变化和淮河支流的廊道切出来。另一个考量是计算成本。一个宿州市30m分辨率DEM大约上百万像素普通笔记本用GDAL处理也就几秒到十几秒填洼、流向计算等水文分析也很少超过几分钟。12.5m数据量大约是4倍填洼的耗时和内存占用会明显增加。对于团队内部“先看趋势、后做精细分析”的工作流30m是默认首选。2.2 用gdalinfo读dem参数三行命令看清NoData和投影解压之后先不要急着把文件拖进GIS。我一般会在命令行跑一句gdalinfo用最快速度确认三件事像素分辨率、坐标系、NoData值。这里假设解压后文件叫su_dem.tif实际按你包里的文件名替换。gdalinfo su_dem.tif输出里重点看这几行Size is 1220, 850栅格行列数可以和宿州的经纬度范围做个粗算确认30m分辨率是否可信。Coordinate System is如果显示GCS_WGS_1984或WGS 84说明数据是经纬度坐标像素单位是度后续计算坡度前必须重投影如果显示UTM zone 50N或某个CGCS2000投影那像素单位是米可以直接用。NoData Value很多时候是-9999也可能是0或-3.40282e38。这个值会直接影响后续裁剪和填洼必须记下来。如果你发现文件没有投影信息gdalinfo只会显示Coordinate System is: undefined。这种情况常见于从某些原始DEM里直接转出的文件。别慌先用下面的命令看一下文件内部有没有坐标解算需要用的角点坐标再用gdal_translate补投影详见下一章。很多朋友搜“dem安装包”找到这类zip以为要先安装什么驱动其实它只是个数据压缩包。dem文件本身不是可执行程序它是一个或多个栅格格网文件解压后需要用GIS软件或GDAL读取。2.3 区域范围shp文件边界、掩膜和行政区统计的起点包里的区域范围shp文件是这次数据最值钱的附加件。它不是简单的一条边界线而是宿州市的行政区划范围可能包含区县面要素。你需要确认两件事坐标系和属性字段。shp文件是一组文件的集合至少包括.shp、.shx、.dbf一般还有.prj。拷贝或压缩时如果单独拷一个.shp后面打开会提示缺少文件这是最常见的低级错误。拿到zip后解压时建议单独建一个文件夹保持这几个伴随文件在一起。在ArcGIS里可以用“Catalog”窗口预览shp的投影在QGIS里更简单直接把shp拖进来底部状态栏会显示坐标单位。如果shp是WGS84经纬度而DEM是UTM投影两者叠在一个视图中会因为坐标系不一致而自动重投影但如果你用GDAL命令行裁剪就必须显式指定坐标系不能指望GIS自动帮你转换。这个shp文件在后期有三个实际用途作为gdalwarp的掩膜边界一步把DEM裁剪到宿州市范围内。作为QGIS“分区统计”的图层按区县统计高程、坡度、面积。作为制图时的外边界蒙版让出图范围严格贴合行政区界线。3. 把宿州DEM变成能用的TIFF转换、投影统一和按shp裁剪3.1 gdal_translate转TIFF并压缩保留原始值的注意点原始DEM文件可能是.img、.bil、.dem或裸格网格式第一步先统一转成GeoTIFF。为什么转TIFF因为GDAL后续的gdalwarp、gdaldem对GeoTIFF支持最稳而且在ArcGIS中也能直接读。gdal_translate -ot Float32 -a_srs EPSG:4326 -co COMPRESSLZW -co BIGTIFFIF_NEEDED su_dem.raw su_dem_30m.tif参数说明-ot Float32高程值保留为32位浮点避免Int16把小数高程或负值截断。-a_srs EPSG:4326如果原文件没有投影信息用这个参数强行写入WGS84。注意这个参数只是“声明”坐标系不会做重投影如果原文件实际上已经是UTM坐标这个操作会酿成大错所以必须先用gdalinfo确认原始坐标单位。-co COMPRESSLZW无损压缩比ZIP压缩率更高读写速度也不会慢太多。-co BIGTIFFIF_NEEDED当文件超过4GB时自动切换为BigTIFF宿州30m数据一般不会触顶但写上更稳妥。转完后建议再跑一次gdalinfo su_dem_30m.tif确认Pixel Size那行的单位和数值。如果是经纬度你会看到类似0.0002777778, -0.0002777778这是1弧秒的弧度大约对应30m如果是米会看到30, -30。后者说明原数据已经投影好了可以直接跳到裁剪。3.2 gdalwarp按宿州市界裁剪-cutline和-crop_to_cutline的配合有了shp边界裁剪这一步用gdalwarp一个命令就能完成并且同时可以重投影。宿州经度范围大约在116.9°E到118.1°E最合适的投影是UTM 50NEPSG:32650或CGCS2000高斯3度带。这里我用UTM 50N举例因为它跨带风险最小也是GDAL默认支持最完善的一套投影之一。gdalwarp -cutline suzhou_border.shp -crop_to_cutline -dstnodata -9999 -t_srs EPSG:32650 -of GTiff su_dem_30m.tif suzhou_dem_utm50.tif参数说明-cutline suzhou_border.shp指定边界矢量文件。-crop_to_cutline让输出栅格的范围严格贴合shp的边界而不是仅用shp的外接矩形。-t_srs EPSG:32650把输出转为UTM 50N像素单位变成米这是后续做坡度、流向计算的前提。-dstnodata -9999统一设置输出栅格的NoData值。如果你上一步的NoData是0这里不重设之后的填洼会把整个宿州平原的低海拔区域当成“无数据”导致大片黑块。这一步执行完你会得到一个真正贴合宿州边界的UTM投影DEM。打开QGIS看一眼边界应该是尖锐的折线而不是带白边的矩形。3.3 高程单位和NoData先补洞再裁剪还是先裁剪再补洞很多教程会让“先裁剪、后填洼”但我在处理宿州这类平原区域时会反过来先处理NoData和负值再裁剪。原因是裁剪之后边界附近的无效洞往往被硬切掉导致你误以为数据已经干净了而实际上宿州境内的一些采煤沉陷区或水体边缘原始DEM里可能藏着负值或黑洞裁剪后仍然存在。因此我一般会在gdalwarp之前先用gdal_calc.py把无效值统一成-9999把异常负值也一并处理掉gdal_calc.py -A su_dem_30m.tif --outfilesu_dem_clean.tif --calcwhere(A0, -9999, A) --NoDataValue-9999 --typeFloat32逻辑说明where(A0, -9999, A)的含义是当原始像素值小于等于0时把它替换成NoData否则保留原值。--NoDataValue-9999让输出栅格明确用-9999表示无效值。这个命令在平原地区尤其重要。宿州地面高程一般在15~50米之间不会出现负数但湖泊、采煤塌陷区或雷达数据噪声可能产生小于等于0的像元。如果不处理后续gdaldem slope会把负值当作真实高程生成荒谬的高坡度区填洼算法也可能把负值区域当成巨大的洼地最后填出一个无边无际的平湖。有一点必须提醒-a_srs和gdal_calc.py都不会改变原始数据的高程单位。宿州DEM高程单位通常是米但某些ASTER或SRTM衍生数据会有“m”和“cm”混乱的情况。怎么验证最直接的方法是采样几个已知点的高程对照宿州市地形图或卫星影像中的高程标注。如果整体量级差100倍说明单位是厘米需要用gdal_calc除以100。别觉得这个提醒多余我见过不止一个项目拿着“CM级高程”成了全城山地。4. 宿州DEM常见的5个坑解压失败、叠不齐、黑图、断流、锯齿4.1 zip伪加密和下载不完整看似损坏其实有救现象双击zip文件提示“文件已损坏”或“需要密码”你明明没有设过密码。原因这类数据包在网盘或中转站传输时可能被工具改过加密标志位形成“zip伪加密”。只修改了加密标志没有实际加密内容但Windows资源管理器仍会拦截。另一种可能是文件下载不完整zip包缺少末尾的“中心目录”记录。解决先用7-Zip打开看看能不能列出文件。如果7-Zip能列出说明文件结构完整只是伪加密。你不需要找什么“zip密码移除”工具直接把zip包用文本模式打开修改第4~5字节的加密标志或者干脆用7-Zip的命令行重打包7z x suzhou_dem.zip -o./unzipped7-Zip对伪加密的zip包通常能直接解压。如果这一步也提示“头部错误”再用zip -F尝试修复zip -F suzhou_dem.zip --out fix.zip-F是修复损坏zip的常用参数但它只修复“中心目录”缺失的问题不能修复数据空洞。如果修复后仍解压失败重新下载一次是比较稳妥的选择。很多人花半小时找解压工具其实重下更快。4.2 dem和shp叠不上投影参数在作怪现象在QGIS里把dem和shp都拖进去shp在宿州正确位置dem却偏到海里或者两图层叠在一起但边界错了好几公里。原因两个图层的坐标系不统一。最常见的是shp使用CGCS2000 3度带DEM却是WGS84经纬度或者DEM缺失.prj文件QGIS默认当成WGS84加载。解决用gdalinfo确认DEM的坐标系用QGIS查看shp的坐标系然后以shp为准重投影DEM。假如shp是CGCS2000 3度带先不要硬套UTM 50N用gdalwarp转换到与shp相同的EPSG。坐标参考不一致时任何裁剪、分区统计都是自欺欺人。检查时还要注意单位CGCS2000经纬度与CGCS2000投影虽然坐标值相似但差了几十万米一眼就能看出来。4.3 渲染一团黑拉伸范围和NoData没设置现象DEM加载到ArcGIS里整片黑色或者只有河流边界有亮色平原区全是黑的。原因浮点型DEM默认情况下会使用全局最小最大值做黑白拉伸。如果NoData值还是-3.4e38这种极端值它会占据整个拉伸范围导致有效高程区被压缩成一片黑如果NoData是0平原低海拔区域又会与NoData混合看起来也是黑的。解决在QGIS图层属性里选择“Min/Max”拉伸并勾选“按累计计数裁剪”把2%和98%的离群值去掉。在ArcGIS里则使用“符号系统→拉伸→直方图拉伸”并设置NoData为透明。更重要的是治本的办法是回到第3章用gdal_calc.py提前把NoData统一成-9999这样任何GIS软件都能正确识别。4.4 平原区填洼后水流乱跑需要先处理NoData并设置阈值现象用填洼工具处理宿州DEM后提取出来的水系全是平直线或者出现大量平行于人工渠道的乱流。原因平原区真实地形起伏只有1~2米30m分辨率下很多格网高程值相同填洼算法会把大面积平坦区连通成一个“湖”水流方向完全由像素序号决定出现假河道。这也是很多人说“双线河”的原因。解决填洼前先处理NoData和负值再用带“深度阈值”的填洼算法。例如SAGA的Fill Sinks (Wang Liu)可以设置陡坡阈值只填充浅于某深度的洼地而不是全部填平。阈值一般取1~3米宿州平原区建议从1米开始试如果填完后水系仍然乱跑检查是不是高程数据垂直精度不够需要换12.5m或5m数据。4.5 裁剪边界锯齿严重这是分辨率的锅备好两套方案现象用shp裁剪后DEM边界是一格一格的锯齿看上去非常不专业。原因30m格网与矢量边界天然无法完全贴合每个边界像素表达的是“该格网与边界有交叠”因此锯齿是正常现象不是裁剪错误。解决如果只是出图建议保留一份未经裁剪的全图DEM再叠加shp边界线用“置灰”或“图层蒙版”的方式显示外部区域这样视觉上边界平滑。如果确实需要栅格边界干净可以在gdalwarp时增加-crop_to_cutline但用它自带的-wo CUTLINE_ALL_TOUCHED参数会产生不同行为一般不是更好而是更差。更实际的做法是接受锯齿或者把DEM重采样到10m后再裁剪但会引入不必要的插值误差。我通常保留两份一份原始30m裁剪结果一份用QGIS“按掩膜提取”加0.5像素缓冲的版本后者用于成图。5. 做坡度、坡向、山体阴影和水系提取30m数据能继续推多远5.1 先重投影到UTM再算坡度gdaldem slope的参数第3章已经生成了UTM 50N的su州_dem_utm50.tif接下来就可以用gdaldem一键生成坡度和坡向。gdaldem slope suzhou_dem_utm50.tif suzhou_slope.tif -s 1 -p参数说明-s 1坡度计算中的垂直高程单位与水平单位的比值。因为是UTM投影水平和垂直单位都是米比值就是1。如果数据还是经纬度-s通常要设成对应的米换算系数但不同纬度差别很大所以我才反复强调先转UTM再算。-p输出百分比坡度而非度数。工程上做边坡和排水设计时百分比更直观如果习惯看度数去掉-p即可。坡向命令就更简单gdaldem aspect suzhou_dem_utm50.tif suzhou_aspect.tif生成后可以用QGIS叠加宿州shp查看墁河、浍河两侧的坡向分布是否与地形走向一致快速判断结果合理性。gdaldem默认使用8方向的坡向编码对月见表做光照朝向分析够用了。5.2 填洼和流向提取SAGA与WhiteboxTools的不同策略坡度和坡向是基础要进一步做水系提取必须先填洼。这里我推荐两种工具都比ArcGIS的Fill更灵活。在QGIS中打开SAGA的下游工具选择Terrain Analysis - Hydrology - Fill Sinks (Wang Liu)参数里有一项Elevation Threshold宿州平原建议先设1.0观察填洼后的DEM与原始DEM的差值。如果填出来的区域全是河道说明阈值太低如果大片农田都被填平说明阈值太高。这个值没有固定答案要以“填洼只消除孤立洼地不改变主河道”为准则。命令行场景下WhiteboxTools是一个更轻量的选择它的FillDepressions工具默认不会填平真正的洼地结构。大致命令如下whitebox_tools --runFillDepressions --inputsu州_dem_utm50.tif --outputsu州_dem_filled.tif --flat_increment0.01参数说明--flat_increment平坦区域中每个像素增加的高程值用于消除水流方向随机性。0.01~0.001米是常见范围设太大可能扭曲地形。该工具会保留边缘处的凹陷避免人工边界产生“虚拟水坝”。填洼之后再用SAGA Wetness Index或D8 Flow Accumulation提取累积流量最后用阈值提取河网。阈值一般从几百到几千不等需要结合宿州实际河网判断。比如 1000 个像素以上成为河道的阈值在平原区会得到比较密的水系网但含很多人工沟渠如果你只关心骨干河流把阈值提到2000~5000。5.3 山体阴影和等高线出图前最后一套组合拳做分析报告时山体阴影是DEM最好的可视化底图。这个命令直接用在最后的UTM版DEM上gdaldem hillshade suzhou_dem_utm50.tif suzhou_hillshade.tif -azimuth 315 -altitude 45 -z 1.3参数说明-azimuth 315光源方位角315度是西北方向光常见制图标准。-altitude 45光源高度角45度能兼顾平原和丘陵的可视性。-z 1.3垂直夸张因子。宿州地形起伏不大增加一点夸张能让微地形在出图上更明显如果你想严格忠实于地形设1。等高线可以用gdal_contour生成矢量线gdal_contour -i 25 suzhou_dem_utm50.tif suzhou_contour_25m.shp-i 25表示每25米一根计曲线宿州平原区高差小25米间隔已经能反映宏观趋势。如果做精细化农田整治可以改用10米或5米间隔但对30m原始数据过细的等高线会显得锯齿化严重不建议低于5米。从等高线生成dem的方向相反不是这里的目标如果你看到“等高线生成dem arcgis”之类的教程那是从矢量等高线插值栅格适合做精细设计不适用于本包。6. 验证成果用shp做分区统计看一眼高程数据是否可信拿到裁剪和重投影后的DEM别急着出图先做一个分区统计验证。打开QGIS加载su州_dem_utm50.tif和su州_border.shp使用“栅格分析→分区统计”工具按shp里的区县字段统计每个区县的平均高程、最低海拔、最高海拔和面积。宿州市的平均高程大致从北往南递减北部萧县、埇桥北部靠近丘陵的地方平均高程会明显偏高中部平原在20~30米附近南部与怀远交界处更低。如果统计结果出现整个宿州市平均高程几百米说明高程单位或坐标系出了问题马上停掉后续分析。我自己的习惯是再拉一条剖面线验证。在QGIS里用“分析工具→剖面工具”绘制一条从萧县到宿州市区的线看看剖面是否与地形感觉一致北段有起伏进入平原后平滑下降。如果剖面线呈“毛刺”状说明原始DEM没有去噪如果剖面完全是一条直线则要怀疑裁剪时误把NoData区域填成了恒定值。最后一个技巧把裁剪后的DEM导出成GeoTIFF时顺手用gdalinfo -hist生成一份高程直方图存成文本方便写报告时引用。高程分布有强峰值通常代表大区域平坦符合淮北平原特征。如果直方图在0或-9999处有异常尖峰说明NoData还没处理干净。这是我被投影坑过一次后才养成的检查习惯所有DEM文件无论哪个渠道下载先跑gdalinfo再跟shp叠一次最后才交给分析流程。希望帮到你。本文还有配套的精品资源点击获取
返回列表