简介:安徽省宿州市DEM数字高程数据30m(含区域范围shp文件).zip提供宿州市及周边部分区域的数字高程模型,30米分辨率可满足大范围地形分析、坡度计算、排水模拟、城市规划与地质灾害评估等GIS应用。面向地理信息从业者、城市规划师及环境研究人员,数据既包含宿州市市界内地形,也覆盖部分邻接区域,便于边界空间分析。压缩包共12个文件、约33.64MB,核心为宿州市DEM.tif高程栅格,并配套tfw坐标定位文件;区域范围采用Shapefile组织,含shp几何、shx索引、prj投影、dbf属性及xml元数据,另有ovr金字塔加快影像浏览。所有文件可由主流GIS软件直接加载,无需额外配置,导入后可直接开展坡度、坡向、汇水区提取等分析。目前已有380人学习下载,适用于对宿州市及周边开展地形研究、空间叠加与专题制图。
1. 宿州30m DEM数据包:从解压到真正能用的第一道坎
拿到“安徽省宿州市DEM数字高程数据30m(含区域范围shp文件).zip”,第一反应通常是解压、拖进GIS看一眼颜色,然后就没然后了。这个反应我见过太多次,某开发者当初也是这样,直到他用这份数据算宿州平原区的坡度,发现到处是几十度的“坡”,后来才明白问题出在坐标系没统一、无效值没屏蔽,而不是数据本身错了。30m分辨率DEM覆盖宿州市域,加上配套的区域边界shp文件,足够支撑土地利用分析、洪涝淹没模拟、光伏选址这类中等尺度的空间分析,前提是你把它当成一份需要校验和预处理的基础数据,而不是拿来即用的成品地图。这篇笔记就顺着解压到应用的完整链路,讲清楚文件怎么认、参数怎么设、坑在哪里。
2. 数据包里到底装了什么:30m分辨率、无效值和区域shp的三重理解
2.1 30m分辨率不是“精度30米”,它决定你能做什么比例尺的图
DEM的分辨率指像元间距,一个像元代表地面上30m乘30m的范围,不是高程测量精度。宿州位于平原区,地形起伏小,30m分辨率对市域尺度的分析是够用的,但对单地块、村庄级别的排水分析就偏粗。常见开源DEM里,SRTM 30m和ALOS 12.5m是大家最常用的两类,这份zip里的数据如果标注30m,大概率属于前者一级别的产品,特点是覆盖完整、缝隙少、平面位置基本可靠,但局部高程存在系统噪声。
在平原区,30m DEM的高程误差通常表现为±2m到±7m的随机波动。这个数值看上去不大,算坡度时会非常致命,因为平原真实坡度往往只有1到3度,而DEM噪声会被差分算法放大成十几度的假坡度。所以拿到数据后,第一个要确认的永远是数据源和元数据,而不是急着出图。用90m分辨率也能做宿州这种尺度,但30m能更清楚表现沟渠、老河道和缓坡微地形,这也是这个数据包最核心的落地价值。
选择30m而不是12.5m的原因也很实际:12.5m数据在城市和重点区域虽然更好,但全市域拼接数据量大、处理时间长,对配置普通的电脑很不友好;而30m数据在ArcGIS或QGIS里做填洼、流向、坡度计算时,速度和稳定性都明显更好。一句话,30m是市级平原区分析性价比最平衡的选择,不要一上来就追求更高分辨率。
2.2 区域范围shp在数据包里扮演什么角色:裁剪边界、统计分区还是属性挂接
zip里配套的shp文件,通常是宿州市行政边界或研究区范围,它在这个数据包里的作用不只是一个“裁剪框”。常见用途有三个:一是作为掩膜边界,把DEM裁到正好覆盖研究区,减少后续计算量;二是作为分区统计的单位,比如按乡镇边界算平均高程、最大高差;三是用作制图时的范围线,压盖在等值线或坡度图外围。
用shp做裁剪前,先检查它的坐标系和简化程度。很多区域shp为了省存储,边界点被抽稀得很厉害,放大看是折线,裁剪出来的DEM边界会呈现明显的多边形折角。如果后续要和1:1万的地形图或影像叠合,必须确认shp的边界精度是否满足要求;如果只是做市级宏观分析,原始shp就够用,不需要重新平滑。
另一个容易忽略的点是:shp的属性表里通常有行政区名称和代码,这些字段在后续分区统计时非常有用。如果属性表是中文且出现乱码,多半是编码问题,常见做法是用QGIS重新设置数据源编码,或用ogr2ogr转换一次,而不是直接删掉重做。
2.3 打开zip前先查的三项元数据:文件格式、坐标系、无效值
解压后第一件事不是双击打开,而是用命令行工具或者GIS软件的属性面板查三类信息:栅格格式是GeoTIFF还是IMG、坐标系是WGS84经纬度还是CGCS2000投影、NoData值是什么。这三项决定了所有后续操作的正确性。
ls -lh 宿州市DEM/ unzip -l 安徽省宿州市DEM数字高程数据30m(含区域范围shp文件).zip gdalinfo 宿州市DEM.tif# 查看压缩包内容但不解压 unzip -l 安徽省宿州市DEM数字高程数据30m(含区域范围shp文件).zip # 解压到指定目录 unzip -o 安徽省宿州市DEM数字高程数据30m(含区域范围shp文件).zip -d ./demo_data/ # 读取栅格元数据 gdalinfo ./demo_data/suzhou_dem.tif参数说明:-l只列出压缩包内容清单,不实际解压,适合先确认里面有几个文件、是否有shp、目录结构是否混乱;-d指定解压目标目录;gdalinfo输出的关键字段里,Size是栅格宽高像元数,Coordinate System是坐标系定义,NoData Value是无效值,Band 1下面的Minimum和Maximum能初步判断高程范围是否合理。宿州平原高程一般在几十米,如果最大最小值里出现-32767或32767这类极端值,说明无效值没被正确识别,后续所有坡度、等高线分析都会被它污染。
提示:如果gdalinfo输出的坐标系是
WGS 84且单位是Degree,这是一份经纬度坐标的DEM。算坡度、面积、距离之前必须转成投影坐标系,这是整篇笔记里最重要的一个预处理动作。
3. 从zip到可用DEM:坐标系统一、投影转换与裁剪的落地操作
3.1 先跑通最小处理流程:解压、检查、转平面
上一步查完元数据,接下来的工作流我一般固定为四步:解压归位、统一投影、裁剪掩膜、派生分析。不要跳过任何一步,尤其是在宿州这种平原区,跳过投影转换就直接算坡度,结果会离谱到你怀疑数据坏了。
先把文件按目录整理好,避免所有数据堆在一个文件夹里。一个简单可复用的目录结构是这样:
mkdir -p ./suzhou_dem/{raw,proj,cut,analysis} mv ./demo_data/*.tif ./suzhou_dem/raw/ mv ./demo_data/*.shp ./suzhou_dem/raw/逻辑说明:mkdir -p一次性创建多级目录,{raw,proj,cut,analysis}是花括号展开语法,生成四个子目录。raw放原始数据,proj放投影转换后的结果,cut放裁剪后的数据,analysis放坡度、等值线等派生成果。这样做的原因是后续处理过程会产生大量中间文件,如果不归档,几天后你自己都分不清哪个是最终的。
整理完目录,执行投影转换。宿州市域经度大约在116度到118度之间,适合用中央经线117度的高斯-克吕格投影,基准面选CGCS2000或WGS84都行。常见做法是在QGIS里选择“CGCS2000 / 3-degree Gauss-Kruger CM 117E”这个CRS,命令行里用gdalwarp实现。
gdalwarp -t_srs "EPSG:4547" -r bilinear -co COMPRESS=DEFLATE \ ./suzhou_dem/raw/suzhou_dem.tif ./suzhou_dem/proj/suzhou_dem_117.tif参数说明:-t_srs指定目标坐标系,EPSG:4547对应CGCS2000基准、中央经线117°E的高斯-克吕格投影;-r bilinear是重采样方法,DEM是连续表面,双线性插值比最邻近法更平滑,且不会像三次卷积那样产生过度震荡;-co COMPRESS=DEFLATE压缩输出,30m的全市域DEM转投影后通常有几百MB,DEFLATE无损压缩能显著减小体积。转换完成后用gdalinfo再确认一遍坐标系字段,看到PROJCS开头说明已经转成投影坐标。
3.2 投影转换的细节:为什么经纬度DEM不能直接算坡度
很多人不理解,DEM高程单位是米,经纬度坐标单位是度,坡度算法是怎么把这些单位混在一起算的。以gdaldem slope为例,它计算每个像元与相邻像元的高差除以水平距离,如果水平距离的单位是度,而高程单位是米,得到的“坡度”会是毫无意义的数值。在WGS84经纬度下算宿州的坡度,一个像元的水平距离是0.0003度左右,换算成米大约是30米,但算法不知道这个换算关系,它只会把0.0003当0.0003米用,坡度值瞬间放大上百倍。
解决办法只有一条:先转投影,再算坡度。但也有例外,如果只是做简单的剖面浏览、看高程分层设色,不涉及水平距离计算,经纬度DEM也能直接出图;一旦进入坡度、坡向、填洼、汇流累积这些水文和地形分析,就必须保证XY方向单位与高程单位一致。
转换后还有一个检查习惯:把DEM和shp同时加载进GIS,确认两者边界基本重合。如果shp和DEM差了上百米,多半是shp还是WGS84经纬度,用gdalwarp或QGIS里的“导出-另存要素类”把shp也转到EPSG:4547,再做后续裁剪。
3.3 用区域shp裁剪DEM:cutline裁剪与无效值设定
投影统一后,用zip里附带的shp把DEM裁剪到宿州市域范围,这一步能大幅减少坡度、等高线分析的计算量。裁剪的命令不复杂,但参数里藏着两个坑。
gdalwarp -cutline ./suzhou_dem/raw/suzhou_boundary.shp \ -crop_to_cutline -dstnodata -9999 \ -co COMPRESS=DEFLATE \ ./suzhou_dem/proj/suzhou_dem_117.tif \ ./suzhou_dem/cut/suzhou_dem_cut.tif参数说明:-cutline指定shp作为裁剪范围;-crop_to_cutline让输出栅格的范围严格等于shp外接矩形并裁掉边界外像元,不加这个参数的话,输出范围会沿用输入DEM的范围,shp只参与掩膜,文件大小不变;-dstnodata -9999把裁剪后边界外的像元统一设置为-9999,方便后期统一处理无效值。裁剪完成后打开看,边界呈锯齿状是正常的,30m像元不可能精确贴合矢量边界线,这属于栅格数据的固有特性。
注意:如果裁剪后DEM在边界外显示为黑色,不是数据坏了,而是-9999被渲染成黑色。在QGIS图层属性里把NoData值设为透明,或把-9999加入透明像元列表即可。
4. 用30m DEM做出坡度、等高线与水文分析:参数怎么定才有意义
4.1 坡度与坡向:单位选择和平原区的特殊处理
投影完成、裁剪到位,这才轮到真正的应用环节。坡度分析是DEM最常用的派生数据,在宿州这种平原地带,坡度图的用途集中在建设用地适宜性评价、农田平整度判断和排水路径模拟上。
gdaldem slope ./suzhou_dem/cut/suzhou_dem_cut.tif \ ./suzhou_dem/analysis/suzhou_slope_deg.tif gdaldem slope ./suzhou_dem/cut/suzhou_dem_cut.tif \ ./suzhou_dem/analysis/suzhou_slope_pct.tif -p逻辑说明:第一条命令输出单位为度的坡度栅格,像元值范围是0到90;第二条加-p参数,输出单位为百分比,适合用来做后续栅格重分类。平原区做坡度分析很容易出现“满屏都是坡”的现象,这不是数据错了,而是30m DEM的噪声在平坦区域被算法放大。解决方法是先对DEM做一次轻度的低通滤波,或者在重分类时把0到2度统一归为平地,而不是死抠小数点后的数值。
坡向命令与坡度类似:gdaldem aspect,输出0到360度的方位角,-9999表示平坦区域。在宿州用坡向的场景不多,主要是光伏选址里的南坡朝向筛选。需要注意一点:平原区很多像元高程差为0,坡向会显示为-9999,这是正确行为,不是漏洞。
4.2 山体阴影与可视化:别用默认参数出图
把DEM叠加山体阴影做底图,是展示地形最直观的方式。默认情况下,gdaldem hillshade使用方位角315度、太阳高度角45度、垂直夸大系数1,这套参数在山区效果很好,在宿州这种平原区几乎看不出地形起伏,因为高差只有几十米,阴影反差太小。
gdaldem hillshade ./suzhou_dem/cut/suzhou_dem_cut.tif \ ./suzhou_dem/analysis/suzhou_hillshade.tif \ -azimuth 135 -altitude 30 -z 3参数说明:-azimuth 135把光源放在东南方向,让西北-东南走向的沟渠产生更明显的阴影;-altitude 30降低太阳高度角,阴影拉长,微地形更明显;-z 3把垂直方向夸大3倍,是平原区出地形效果最关键的参数,很多人不出效果就是漏了这个。实际使用中,我会把DEM的分层设色叠加在hillshade上,透明度设为60%,既保留高程色彩信息,又能看到立体感,这是最常用的制图组合,没有之一。
4.3 等高线生成:等高距怎么选才不会暴露噪声
等高线是很多非GIS专业的人拿到DEM后第一个想生成的东西。gdaldem contour可以一步生成矢量等值线,但平原区等高线的质量直接取决于等高距的设置。
gdaldem contour ./suzhou_dem/cut/suzhou_dem_cut.tif \ ./suzhou_dem/analysis/suzhou_contour_5m.shp \ -i 5 -a elev -nln contour_5m参数说明:-i 5指定等高距为5米;-a elev给每条等高线添加名为elev的属性字段,记录高程值;-nln contour_5m指定输出图层名称。在宿州这样的平原区,5米等高距是比较稳妥的起步值,能表达主要地形骨架又不会太密;如果做2米等高距,DEM的±2米到±5米噪声会让等高线变得扭曲破碎,画出来的图像一团乱麻。想看到更细的地形,建议先用焦点统计或中值滤波对DEM做平滑,再生成等高线。
等高线生成后,在QGIS里用“简化”工具做一次轻度平滑,算法选Douglas-Peucker,容差10米到30米,能把锯齿状折线修直,又不至于丢失地形骨架。这一步是制图阶段最容易忽略的,直接决定了最终图面是否专业。
4.4 水文分析的入门操作:填洼阈值和流向方向的坑
平原区做水文分析,30m DEM的价值在于识别排水格局。流程固定是填洼、流向、流量累积三步,在QGIS里对应“Fill sinks”“D8 flow direction”“Flow accumulation”工具。填洼这一步在平原区要格外小心,因为宿州很多洼地是真实存在的蓄涝区,如果无脑把所有洼地全填平,分析结果会显示洪水根本无处可积,这与实际情况严重不符。
常见做法是给填洼工具设置一个最大填充深度阈值,比如只填掉小于3米的洼地,保留更深的地形洼地作为蓄洪区。这个阈值需要结合当地地形反复试,没有统一公式。分析完成后,把流向栅格和卫星影像叠在一起看,如果河流和沟渠的流向与影像上明显的水系方向相反,检查一下流向算法是D8还是多流向,平原区推荐用D8,多流向在平坦区域会产生大量扇状扩散路径。
5. DEM数据避坑指南:宿州平原区5个高频翻车点与排查方法
5.1 黑斑与空洞:栅格里出现大片无值区
现象:DEM在渲染时出现黑色斑块,这些区域没有高程数据,颜色和周边明显不同,放大看像被挖掉一块。 原因:原始数据在获取时就有无效值,常见无效值包括-32767、0、-9999;也有可能是拉伸渲染时把0值当成有效高程。宿州地形平坦,水体和低洼地附近最容易出现这类无效像元。 解决:处理前先gdalinfo确认NoData值,然后在栅格转栅格或应用分析工具时统一指定-dstnodata。如果黑斑范围较小,可以用gdal_fillnodata按周围像元插值填补,但面积超过总范围的5%就要考虑换数据源,插值出来的高程在水文分析里不可靠。
5.2 条带与拼接缝:图像上出现规律的横向条纹
现象:DEM渲染后有明显的横向或纵向条带,像百叶窗一样,一条高一条低,在坡度图上尤其显眼。 原因:这是多景DEM镶嵌拼接后没有做色调匹配的典型症状。如果原始文件覆盖宿州全市,它可能由多景数据拼接而成,接边处高程存在系统偏差。还有一个常见诱因是原始数据在平坦区域量化时产生的阶梯状分布,高程值被四舍五入成整数米。 解决:先用焦点统计滤波把高频噪声抹掉,窗口设5×5或7×7,再做坡度分析;如果条带依旧明显,就需要把原始DEM分块检查,确认是不是某一景文件整体偏高或偏低,这种系统偏差靠滤波是救不回来的。
5.3 边界锯齿与毛刺:裁剪后边界呈楼梯状
现象:用shp裁剪完,市界处出现明显锯齿,河流、道路等矢量要素与DEM边界错位明显。 原因:30m像元是正方形,矢量边界是任意角度折线,栅格化后必然产生锯齿。这不是裁剪参数设错,而是分辨率决定的物理限制。 解决:制图出图时用shp把锯齿边界盖住,这是最省事的方法;如果做分析,可以把DEM转成点云后再按矢量边界提取,或者用更高分辨率的DEM做边界缓冲区的局部替换。不要试图通过缩小像元解决,除非你有12.5m或更高精度的数据,否则插值出来的边界细节都是假的。
5.4 shp与DEM对不上:区域边界整体偏移数百米
现象:把shp叠在DEM上,发现边界整体往某个方向偏移,两个图层就是合不上。 原因:坐标系不统一是最常见原因。shp可能是CGCS2000,DEM是WGS84,或者投影带选错,比如中央经线117度的数据被定义成111度或123度,整个图幅就错位了。 解决:用gdalinfo分别查两个文件的坐标系,确认基准和投影带完全一致。如果shp需要转换,用ogr2ogr加-t_srs重投影一次,不要直接用QGIS里的“临时CRS”功能,那只改变显示,不改变实际几何坐标。检查无误后重跑裁剪。
5.5 平原区坡度值普遍偏大:平地显示成坡地
现象:宿州明明是平原,坡度分析结果却大范围出现10度甚至20度以上的值,和实际地面完全不符。 原因:最大的可能是直接在经纬度DEM上计算坡度,XY单位是度,高程单位是米,算法没有统一单位换算;也有可能是投影转换时用了near最邻近重采样,造成高程值阶梯化,陡增了局部高差。 解决:回到第3章,先确认操作系统里所有DEM和shp都已转成投影坐标,再执行坡度计算;如果投影没问题,试着对DEM做5×5的均值滤波,把随机噪声压平再算坡度。在平原区,坡度分析成果里90%以上的区域应集中在0到3度,如果结果明显分布更散,多半是前面某一步省了。
6. 给30m DEM验明正身:实测点对比和多源交叉验证的土办法
这一章讲一个很多人忽略但极其关键的收尾工作:数据精度验证。30m DEM到底能不能用,不是看渲染图多漂亮,而是要用实测点给它“挑毛病”。我自己常用的验证方法有两条,成本都不高。
第一条是实测点高程对比。在宿州这样的平原区,手持GPS单点定位的平面精度是米级,高程误差可能反而比DEM还大,所以更可靠的做法是找已有测量控制点或水准点,把点位坐标落到DEM上提取高程,再和已知高程值做差。统计指标只关注三个:平均误差、均方根误差RMSE、P90绝对误差。平原区30m DEM如果RMSE在5米以内,做市级宏观分析就够用;如果超过8米,坡度分析结果就不要写进正式报告了。这里有一个细节:提取DEM高程时,不要直接用“采样”工具读单像元值,而是用双线性插值提取,能减少像元定位造成的误差。
第二条是多源数据交叉验证。用12.5m高分辨率DEM或同区域的影像地形服务做参照,在GIS里重采样到30m,和这份DEM逐像元做差值栅格。差值栅格能直接显示系统偏移的分布:如果整个区域差值都在正负2米内,说明数据质量稳定;如果出现一半正一半负的明显分界,说明拼接接边有问题,需要按差值分区修正。这个方法不需要外业,一个小时就能完成,适合作为任何DEM项目验收前的必经工序。
最后说一个我自己的习惯:验证完把结果写进元数据文件,和原始zip放同一目录。这样等几个月后回过头来用数据,不需要重新踩一遍坑,也知道这份数据能不能支撑当前的分析精度。做数据的人多花这半小时,后面用数据的人就能少走很多弯路。希望这篇笔记帮到你,也帮你在宿州30m DEM上少交几次学费。
本文还有配套的精品资源,点击获取