
简介资源提供安徽省宿州市全域及部分周边区域的30米分辨率DEM数字高程模型并附带宿州市范围Shapefile边界文件适合GIS从业人员、城市规划师、环境研究人员及地理相关专业师生用于地形分析、坡度坡向计算、视域模拟、流域分析等场景。压缩包内共12个文件核心为TIF格式高程栅格配套TFW坐标配准文件保证影像地理定位准确同时包含SHP、DBF、SHX、PRJ、SBN、SBX等标准Shapefile组件可一键提取宿州市界并统一坐标投影便于不同数据叠加比较OVR金字塔文件可加速大影像显示多个XML元数据文件记录数据来源与属性信息。整套资源大小33.64MB目录结构规范导入ArcGIS、QGIS等软件即可直接读取分析和制图。该资源已有379人学习浏览适合需要直接获取宿州市及周边中精度地形数据快速投入区域空间分析的读者。1. 宿州市30米DEM数据包打开之前先搞清楚这三件事做GIS的人拿到一个标注“30m DEM shp”的压缩包第一反应大多是解压、拖进ArcMap看一眼图层能亮就觉得“数据没问题”。但真实项目里宿州市这种横跨平原和低山丘陵的地段30米分辨率的DEM数字高程数据和配套区域范围shp文件能不能直接用取决于三件事坐标系是否对齐、NoData值有没有处理、裁剪参数有没有设对。这个数据包解决的就是“拿到宿州市精确边界资料能直接裁剪、能统计、能出图”的问题里面一边是覆盖宿州市域的高程栅格一边是配套的行政范围矢量文件两者叠起来才能做坡度分析、填挖方估算、淹没模拟、站址初筛这些常态化工作。适合三类人用ArcGIS/QGIS做项目但缺边界与高程底图的新手偶尔做地形分析不想在找数据、对齐坐标系上花半天的工程师以及想在宿州市域做真实尺度地形练习的学生。2. 数据内容先从压缩包内部讲起30m高程DEM与区域边界shp的分工拿到zip之后我习惯先看包里有哪些后缀、多大体积再决定用哪个软件加载。这个包的核心内容是宿州市DEM数字高程数据文件一般是.tif或.img栅格格式30m分辨率意味着每个像元代表地面30米乘30米的面积比SRTM原始90m精度高一档比12.5m和1m的DSM低一些。对宿州市这种区域尺度的宏观分析30m刚好在“细节够用”和“数据量可控”之间。真正的重头戏是配套的shp矢量文件它决定了你所有分析的空间范围。2.1 包内结构高程栅格与矢量边界的搭配逻辑压缩包里至少能看到两类文件一类是DEM高程栅格另一类是宿州市区域边界的shp矢量。这里要提醒一句shp不是单文件而是由.shp、.shx、.dbf、.prj等一组文件构成的复合格式缺了任何一个都可能打不开。文件后缀作用关键点.tif / .imgDEM高程栅格高程单位一般是米需确认NoData值.shp宿州市边界与分区矢量作为裁剪、统计掩膜.shx空间索引文件必须与.shp同名且在同一目录.dbf属性表存行政区名称、面积等字段.prj投影信息决定坐标系统删了会出大问题这个文件结构说明了一件事数据包的设计意图不只是让你在地图上“看着像宿州”而是让你在一个确定空间范围内做定量分析。给DEM提供边界的是shp给shp提供高度信息的则是DEM。两者缺一个坡度、坡向、高程分带、汇水分析都做不完整。我一般拿到压缩包后会先把所有文件解压到一个独立英文路径比如D:\suzhou_dem避免中文路径在部分工具里出现编码问题。2.2 先核对坐标系CGCS2000、WGS84还是西安80开始裁剪之前我会先查DEM和shp的.prj文件或图层属性确认坐标系是否一致。宿州市本地工程常用CGCS2000高斯-克吕格投影3度分带39带中央经线117度宿州经度大约在116度到118度之间对应带号117。如果DEM文件写的是CGCS2000_3_Degree_GK_CM_117E而shp写的是WGS_1984_UTM_Zone_50N直接裁剪不会报错但结果会出现几米到几十米的偏移。这个偏移量在30m像元上不算灾难但如果拿去做等高线或填挖方边界处错位会非常碍眼。快速检查方式ArcGIS里右键图层打开属性看“源”选项卡里的投影信息QGIS里双击图层在“信息”页面查看。发现不一致时不要用“定义投影”工具强行给shp改坐标那样只会把坐标系标签改掉而几何坐标不变边界会整体扭曲。正确做法是用“投影”工具把矢量转到DEM的坐标系下栅格则用“投影栅格”工具。30m分辨率重投影时用双线性或三次卷积插值不要用最邻近法否则地形台阶感会加重。2.3 用GDAL快速体检DEM打开黑匣子再谈后续虽然GIS软件能直观看到图层但我建议拿到栅格后先用GDAL把元数据打出来。这一步能提前发现许多后期才会暴露的问题比如投影是乱码、值域异常、NoData值不是预期值等。from osgeo import gdal # 换成你的实际解压路径 dem_path rD:\suzhou_dem\dem_30m.tif ds gdal.Open(dem_path) if ds is None: print(文件无法打开检查路径或格式) # 栅格尺寸与波段数 width ds.RasterXSize height ds.RasterYSize bands ds.RasterCount print(f栅格尺寸: {width} x {height}, 波段数: {bands}) # 仿射变换左上角坐标与像元尺寸 transform ds.GetGeoTransform() print(像元宽度(m):, transform[1]) print(像元高度(m):, transform[5]) # 投影信息看前80个字符就够了 proj ds.GetProjection() print(投影:, proj[:80]) # 获取NoData值和统计 band ds.GetRasterBand(1) nodata band.GetNoDataValue() print(NoData值:, nodata) stats band.GetStatistics(True, True) print(min/max:, round(stats[0], 2), round(stats[1], 2)) ds None这段代码的核心价值在于把DEM元数据全部暴露出来而不是等GIS软件加载后才发现问题。输出参数里transform[1]表示水平像元宽度transform[5]通常是一个负数表示影像从上往下排列如果你看到它为正值说明影像按升序排列加载后地形上下颠倒。NoData值这一项要重点关注常见的是-9999、-32768或0不确认清楚就做坡度或统计边界外会出现一圈离谱的高程值。统计输出后如果min/max明显超出宿州海拔范围比如出现-9999那基本可以断定NoData没有处理好。3. 裁剪与地形分析实操掩膜提取、坡度坡向与等高线生成数据和边界都确认可用之后第一件事就是裁剪。裁剪动作说起来简单但30m栅格配上多个乡镇边界如果不注意输出像元大小和分析范围要么裁出一个几十GB的大文件要么重采样后地形特征被抹平。这一章把ArcGIS和QGIS两条主流操作链路都过一遍。3.1 ArcGIS中的掩膜提取两步完成宿州市边界裁剪ArcGIS里常用工具是【提取分析】→【按掩膜提取】掩膜就用压缩包里的shp。设置步骤输入栅格选dem_30m.tif输入掩膜数据选suzhou.shp输出路径指定为suzhou_dem_crop.tif其余保持默认。这里有个容易踩的坑ArcToolbox搜索框输入“掩膜”会出来多个工具很多新手会选成【按属性提取】。按属性提取是根据要素属性表里的字段条件做查询按掩膜提取是根据空间范围裁剪两者原理完全不同。选错的结果是要么没裁出任何数据要么得到全图范围的一个拷贝。裁剪完成后我习惯做个验证把裁剪后的DEM与原始DEM在相同位置随机取几个像元对比高程值确认数值没有被动过。ArcGIS的掩膜提取本身不改像元值但如果“环境设置”里的“输出单元格大小”没有锁定为30m裁剪工具可能按shp范围重新计算像元大小输出变成90m甚至100m地形细节直接丢失。检查方式很直接右键裁剪结果图层打开属性看“像元大小”是不是还写着30。3.2 QGIS中的裁剪替代方案Clip Raster by Mask LayerQGIS用户的路径是【栅格】→【提取】→【按掩膜图层裁剪栅格】。这个工具默认把裁剪结果加载为临时图层退出工程后就不见了需要手动右键另存为GeoTIFF。参数面板里的“为输出创建alpha波段”我一般不建议勾选因为alpha波段会把边界外像元设为透明而不是NoData后续做区域统计时很难区分真实0值高程和裁掉的空白区。正确的是勾选“将掩膜外设置为NoData”。说到NoData裁剪完之后不妨再做一步处理用栅格计算器把外边界的NoData统一改成-9999或保留NoData看你的后续需求。如果要做区域统计NoData保留会在结果中显示为空如果要导出二维图NoData在配色方案中显示为透明制图更干净。3.3 坡度、坡向与山体阴影参数设置与坐标系的关系坡度是最常用的派生数据。ArcGIS中工具是【3D分析工具】→【栅格表面】→【坡度】QGIS则是【栅格】→【分析】→【坡度】。坡度单位建议选“度”数值范围0到90直观且好分级不要选“百分比”平原地区坡度可能只有0.5丘陵区却跳到80色带拉伸后平原细节全部被压缩。坡度分析的前置条件很硬性输入DEM必须是投影坐标系且XY单位是米。如果你手上这份DEM还是经纬度坐标系ArcGIS也能执行坡度计算但输出数值的解释变成了“单位经度上的高程变化率”结果完全不可用。所以在第2章强调坐标系统一不是玄学是后续一切地形派生运算的前提。山体阴影Hillshade常用参数相对固定方位角315度太阳高度角45度Z因子设为1。Z因子只有在XY单位与Z单位不一致时才需要手动调整比如DEM高程单位是英尺而平面单位是米Z因子设0.3048两个单位一致时就为1不要手滑改大。山体阴影一般只用于制图底图不参与定量计算所以重采样方式用双线性即可。3.4 等高线提取DEM转等高线时注意边缘破裂很多项目成果需要等高线ArcGIS中通过【3D分析工具】→【栅格表面】→【等高线】来生成QGIS在【栅格】→【提取】→【等高线】。关键参数就两个。第一个是等距宿州平原地区高差小5米间距比较适合表现地形变化埇桥区南部、萧县那些低山丘陵区建议用10米或20米间距太小生成的线条会非常密集读取困难。第二个是Z因子如果你发现生成的等高线高程值是原始DEM高程的十倍甚至百倍多半是Z因子被填成了100。这种问题常发生在高程单位不是米的数据上比如厘米级DEM但这份宿州数据通常以米为单位填1即可。等高线还有个常见翻车点边缘出现大量破碎短线超出宿州边界。原因是裁剪后边界外部是NoData但等高线工具会把NoData当作0值参与处理于是边界上会生成一圈-几十米或0米的“假等高线”。解决方法有两种一是在裁剪阶段就勾选“将掩膜外设为NoData”保证输入栅格外部无有效值二是等高线生成后用shp边界做一次【按位置选择】把所有与边界相交或完全在边界外的线删除。4. 把DEM用起来做判断区域统计、汇水分析与可视域筛选下载DEM不只是为了画一张好看的地形图更多时候要解决工程判断问题整个宿州市的平均海拔是多少、某片区哪个位置高程最低、一条径流从哪座山流向哪条河、一个通信塔站到底能覆盖多少范围。这一章把DEM叠加shp后最常碰到的三个分析场景拆开。4.1 区域统计shp范围内的高程极值与均值统计一个区域内的高程分布ArcGIS里常用【区域分析】→【区域统计】。输入要素选shp输入栅格选DEM统计类型勾选MINIMUM、MAXIMUM、MEAN、STD。工具输出的是一张属性表里面按shp的每个图斑给出一行统计值。如果shp里既有宿州市整体边界又包含各县分区图斑统计结果会自动分出单位。需要注意的是统计结果受NoData影响严重。如果DEM里还存在-9999这样的无效值统计出的MINIMUM会直接变成-9999MEAN也会被拉低。所以在统计之前最好先执行一遍栅格计算器Con(IsNull(dem), 0, dem)把NoData替换为0或者用掩膜提取时把NoData排除到分析范围外。下面这段GDAL脚本可以批量输出各图斑的高程统计值适合shp属性表里有多个分区的情况from osgeo import gdal, ogr import numpy as np dem gdal.Open(rD:\suzhou_dem\dem_30m.tif) nodata dem.GetRasterBand(1).GetNoDataValue() shp ogr.Open(rD:\suzhou_dem\suzhou.shp) layer shp.GetLayer() for feature in layer: name feature.GetField(NAME) # 字段名以实际shp属性表为准 geom feature.GetGeometryRef() # 用gdal.Warp按要素裁剪到内存栅格 target gdal.Warp(, dem, formatMEM, cutlineDSNameshp.GetDescription(), cutlineWherefNAME{name}, dstNodatanodata) data target.GetRasterBand(1).ReadAsArray() valid data[data ! nodata] if valid.size 0: print(f{name}: min{valid.min():.1f}, max{valid.max():.1f}, fmean{valid.mean():.1f}, std{valid.std():.1f})这里核心是gdal.Warp的cutlineWhere关键字它允许按属性字段值逐图斑裁剪不用手动操作GUI一次一次选。formatMEM表示裁剪结果直接留在内存里不会写大量临时文件到磁盘。需要注意字段名必须与shp属性表的实际字段一致如果分区字段叫NAME2或XZQMC代码里的NAME要跟着改。4.2 汇水分析填洼、流向与流量阈值汇水分析的标准链路是填洼Fill→ 流向Flow Direction→ 流量Flow Accumulation。最常见的一个错误是跳过填洼直接算流向。30m分辨率DEM在平原区经常出现比周边低一两米的伪洼地这些洼地可能是数据噪声或插值残留不填掉的话水流会滞留在洼地中无法形成连续径流路径。ArcGIS中填洼工具在【空间分析工具】→【水文分析】。Z限值默认是“无限制”也就是所有洼地都会被填平。如果担心把真实坑塘、采石场也给填掉可以把Z限值设为2或3米只填掉深度在2米以内的伪洼地。平原地区和山区对填洼阈值的要求差别明显宿州北部平原区可以保守一些南部丘陵区适当放宽。流量栅格计算出来后需要设定一个阈值来提取河网。如果直接选择“大于1000”平原区会得到几万条碎线像蛛网一样没法用。常见做法是查看流量栅格的直方图找到明显的值变拐点宿州这种尺度一般在5000到20000之间。阈值的物理含义大致是“需要上游累积多少像元才开始形成河道”你可以选几个候选值分别生成河网目视对比后再定正式参数这个步骤没有一步到位的公式多试几次就有感觉。4.3 可视域分析基站选址与制高点筛选可视域Viewshed分析在城市规划和通信选址中很常见30m DEM精度不算高但用于初期站址初筛足够了。ArcGIS里的工具是【3D分析工具】→【可视性】→【视域】。输入观察点可以是shp点文件也可以直接输入坐标生成的临时点。两个参数最影响结果观察点高程偏移如果模拟的是铁塔天线偏移量填30到50米如果模拟的是人站在地面看远处填1.6米。第二个是分析半径宿州市尺度可以填50公里但要清楚30mDEM在长距离上的累积误差不小半径超过30公里之后可视结果只能作参考不能当精确结论。输出栅格是0、1、2这样的类别值1可见、0不可见、2可能可见。要转成面状统计图先做【重分类】再【栅格转面】。注意不要直接用多值栅格转面否则每个像元值都变成单独图斑属性表会非常混乱后续想按“可见/不可见”渲染都无处下手。5. 避坑指南宿州DEM和shp搭配使用的五个常见报错与处理这章内容都来自实际项目里的踩坑记录每一条按“现象→原因→解决”来写不出意外你在使用这个数据包时也会遇到。5.1 解压后shp文件打不开提示缺少数据现象从zip里解压出shp文件后ArcGIS或QGIS提示“无法读取数据集”或“找不到.shp文件”。原因shp是复合格式必须同时具备.shp、.shx、.dbf三个基础文件。很多压缩包在解压时被杀毒软件拦截或解压工具静默跳过部分文件导致副档名文件没落地。另外网上传播的zip偶尔会做伪加密双击提示输入密码其实数据并未真正加密。解决先打开压缩包确认里面同时存在.shp、.shx、.dbf三个文件再解压。如果包内文件齐全但仍提示打不开换7-Zip解压右键选择“取消伪加密”后在再次解压不要用系统自带的“压缩文件夹”功能解压这类数据包。解压后把整套文件放在同一个文件夹里不要单独挪动.shp文件。5.2 DEM裁剪后边界出现规则锯齿状边缘现象按掩膜提取后宿州边界上的高程像元呈锯齿状沿着行政边界出现一排参差不齐的方格。原因栅格本质是矩形网格矢量边界是连续折线。ArcGIS按掩膜提取时以像元中心判断归属边界处中心落在范围外的像元会被裁掉形成台阶状边缘。这不是数据错误是栅格与矢量叠加的必然结果。解决如果想出图把NoData设为透明边界锯齿就会隐形如果做定量分析请保留裁出来的像元值不要为了图面好看去平滑边缘。对成果要求高的场景可以导入shp边界叠加制图让矢量线盖住锯齿。5.3 区域统计结果出现大量负值均值和最小值严重失真现象Zonal统计后高程最小值显示-9999把所有分区整体均值都拉成了不合理的数值。原因DEM的NoData值没有被排除。许多DEM数据将无效区域编码为-9999或-32768但区域统计工具并不是默认忽略这些无效值。统计表里没有做条件过滤负值就被当成高程参与了计算。解决在统计前先用栅格计算器把无效值改成统一的NoData值或者用Con(IsNull(dem), -9999, dem)把NoData显式写为-9999然后在区域统计工具的“忽略NoData”选项里勾选。最稳妥的方式是在第2.3节GDAL体检阶段就确认NoData值并显式设置后面所有分析都会自动避开。5.4 等高线在乡镇边界处出现零散短线或高程跳变现象生成的等高线在shp边界附近出现不自然折返有些线直接超出边界延伸到外部空白区。原因裁剪后的DEM边界外原本是NoData但等高线工具默认把NoData区域当0值参与处理。相当于边界外侧凭空生成一片海拔0米的“假地形”等高线为顺着假地形转弯就产生了折返和悬空短线。解决生成等高线之前确保输入DEM的NoData值设置正确生成后用shp边界执行【按位置选择】把完全在边界外部和穿过边界的线全部删除。这个方法比反复重设等高线参数快得多。5.5 栅格转点时高程全部变成整数精度被截断现象用【栅格转点】把DEM转成点要素后属性表里的高程字段只有128、129这样的整数看不到小数。原因栅格转点工具的默认输出字段类型是整型30m DEM的浮点高程在转换时被四舍五入精度直接丢失。用这个点集去做插值或三维显示时地形就会出现阶梯状。解决在栅格转点工具的输出字段设置里把字段类型改为双精度Double如果用的是ArcPy脚本创建FeatureClass后添加字段时指定esriFieldTypeDouble再写入像元值就不会截断。6. 进阶技巧用gdalwarp批量裁剪宿州各乡镇DEM并出地形底图项目里常常要做“分乡镇出图”如果手上一份宿州市域DEM要按乡镇拆成多个文件再逐一出地形渲染图在ArcGIS里一个镇一个镇地执行掩膜提取、设置环境变量、配色导出重复劳动量很大。我习惯直接写一个gdalwarp循环一条命令把裁剪、重投影、压缩一次完成。先建一个文本文件按行写乡镇名埇桥区 砀山县 萧县 灵璧县 泗县然后用bash循环执行。注意这里的乡镇名单只是示意实际以shp属性表里“NAME”字段的取值列表为准for city in 埇桥区 砀山县 萧县 灵璧县 泗县; do gdalwarp \ -t_srs EPSG:4545 \ -cutline suzhou.shp \ -cwhere NAME${city} \ -dstnodata -9999 \ -co COMPRESSDEFLATE -co TILEDYES \ dem_30m.tif dem_${city}.tif done这段命令的逻辑是gdalwarp把原始DEM重投影到EPSG:4545也就是CGCS2000 3度带高斯-克吕格投影符合宿州市本地的工程坐标系习惯然后以suzhou.shp为裁剪线通过-cwhere参数循环匹配乡镇名称只保留对应图斑范围内的栅格输出时用DEFLATE压缩和TILED分块便于后续在GIS软件里快速加载。需要注意EPSG:4545合法适用区域是中央经线117度覆盖宿州没有问题如果换成EPSG:3857也就是Web Mercator适合在在线地图上叠底浏览但不适合做坡度和面积计算。批量裁剪完用QGIS打开任意一个乡镇的tif把原始shp叠加在上面做目视校验边界是否贴合、区域内有没有黑块这些都是检查流程里必做的一步。更严谨的验证方法是写一个gdalinfo脚本读头文件信息把投影、像元大小、NoData逐项打印出来核对。每次拿到一批新的30m DEM我会强制自己走一遍这套流程GBDL读元数据确认投影与NoData同步检查shp伴随文件是否齐全统一坐标系后交切最后用区域统计抽样验证高程值。整条链路下来真正开GIS软件的时间反而少了处理成果也更经得住别人拷问。地图数据这个东西栽跟头通常不是栽在分析上而是栽在边缘处理和数据体检上希望这篇能帮你省掉这些冤枉路。本文还有配套的精品资源点击获取