焦作市30m DEM数据裁剪与地形分析实操指南
简介一套覆盖河南省焦作市全域的30米分辨率DEM数字高程数据集以30米网格精度记录地表起伏适合GIS学习者、城乡规划、灾害风险评估及环境评估从业者用于区域尺度地形分析与专题制图。压缩包共12个文件核心为TIFF格式高程栅格另附市级范围Shapefile边界、投影信息、空间索引、元数据XML等配套文件整体仅11.79MB文件组织规范可直接在主流GIS平台中加载使用其中Shapefile边界还可用于数据裁切、叠加统计与出图整饰。目前已有649人学习下载。借助该数据可进行坡度计算、流域划分、可视性分析、剖面提取等典型地形操作也可结合行政边界与人口、土地利用等属性数据进行综合研究服务于国土空间规划、水资源管理、生态保护及灾害隐患识别。对希望掌握中等分辨率DEM应用、理解GIS数据组织方式的读者而言这份资料既是实用工具也是理解数字高程模型与矢量边界配合使用的良好示例。1. 焦作市 DEM 数据包先别急着打开先确认三件事看到「焦作市 DEM 数字高程数据 30m 含市级范围 shp」这个压缩包大多数人第一反应是解压、拖进 ArcMap、看一眼彩色晕渲然后……就没有然后了。其实 30m 分辨率 DEM 在焦作这类山水交错的地带能做的事远比看山形多坡度坡向提取、等高线生成、汇水与淹没分析、工程选址粗筛、土方量估算以及跟国土三调、地类图斑、地质灾害隐患点做空间叠加评估。但所有这些下游操作都建立在一个前提上数据本身干净、坐标系正确、边界咬合。我经手过不少从网上下载的省级、市级 DEM 包十个里有三四个存在坐标系缺失、负值异常、边界外扩或压缩损坏的问题。所以这篇直接按一线干活顺序来先做数据体检再讲怎么用 shp 裁剪 DEM然后讲派生分析最后把最容易翻车的五个坑摆出来。适合谁刚拿到数据不知从哪下手的初学者以及要拿这份 DEM 出图、出表、出分析结果给甲方看的从业者。2. 拿到数据包后的第一道工序数据体检与坐标系核对2.1 用 GDAL 快速查看 DEM 的坐标系、像元大小与范围解压后别急着拖进 ArcMap建议先打开命令行用 GDAL 看一眼元数据。常见做法是执行gdalinfo它能一次性给出你要确认的所有关键信息坐标系、投影参数、像元大小、影像四至范围、数据类型、有无 NoData 值。gdalinfo jiaozuo_dem_30m.tif输出里重点看这几行Driver: GTiff/GeoTIFF Size is 4680, 3180 Coordinate System is: PROJCS[CGCS2000 / 3-degree Gauss-Kruger CM 114E, GEOGCS[China Geodetic Coordinate System 2000, DATUM[China_2000], SPHEROID[CGCS2000,6378137,298.257222101]], UNIT[metre,1]] Origin (494434.705,3929658.705) Pixel Size (30.000000000000000, -30.000000000000000)这里有两个点要敲黑板第一坐标系是 CGCS2000 高斯克吕格投影还是 WGS84 地理坐标如果是经纬度坐标单位是度后期算坡度坡向必须先投影到米制不然算出来的坡度会偏离实际第二Pixel Size 是不是 30.000 米——注意看负号(30, -30)表示北向上为正的常规排列如果 y 方向是正 30说明影像可能上下颠倒也要警惕。像元大小如果带了很多小数位比如 30.00000001说明数据经历过重投影或重采样30m 名义分辨率要打个折扣。再看数据类型和 NoDataTypeFloat32 -32767 NoData Value-32767DEM 常见存储类型是 Float32 或 Int16。Int16 的 DEM 最高只能存 32767焦作地形高差大概从黄河滩区的 80 多米到北部太行山的 1300 多米Int16 完全够用但如果数据来源于 SRTM 之类填洼处理后可能出现负值或 32767 填充的空洞这类需要单独处理。我一般会顺手跑一条gdalinfo -stats看高程最小最大值如果是 -32767 到 1300 这种跨度几乎可以断定有空值没洗干净。2.2 shp 文件里到底装着什么字段看一眼再决定怎么裁压缩包里那个「市级范围 shp」是一份面状矢量边界作用有两个一是限定分析范围二是做掩膜提取的模板。但 shp 不是拖进来就能直接用先看属性表是最基本的职业素养。用 ogrinfo 可以快速列出字段信息ogrinfo -so jiaozuo_boundary.shp jiaozuo_boundary输出类似INFO: Open of jiaozuo_boundary.shp using driver ESRI Shapefile successfully. Layer name: jiaozuo_boundary Geometry: Polygon Feature Count: 1 Extent: (494545.587360, 3895450.587360) - (529000.587360, 3935450.587360) Layer SRS: PROJCS[CGCS2000 / 3-degree Gauss-Kruger CM 114E, GEOGCS[China Geodetic Coordinate System 2000, ...]]这里重点看两件事Feature Count 是不是 1。如果市界 shp 里只有一个面要素那说明是合并好的完整边界如果拆成了多个面比如按县区分割后面掩膜提取时就要注意是否要合并。再看 Extent 跟 DEM 的四至是否大致咬合——如果 shp 范围明显大于 DEM 覆盖范围说明边界数据比 DEM 新可能是县界调整导致的不一致如果 shp 范围小了一大圈那裁出来的图幅就会缺角。属性字段方面市界 shp 一般会有 PAC行政区划代码或 NAME 字段。如果字段里有多个区县后续还想分县统计就保留这个字段如果只要全市一张图按 NAME 合并后再裁。这里有个常见坑有些网上下载的市界 shp 缺少投影定义文件.prj在 GIS 里会显示为 Unknown Coordinate System。遇到这种情况最简单的解决方式是用 ogr2ogr 给矢量指定坐标系前提是你确定这份 shp 的实际投影参数。ogr2ogr jiaozuo_boundary_reproject.shp jiaozuo_boundary.shp \ -s_srs EPSG:4547 -t_srs EPSG:4547参数说明-s_srs表示源数据的坐标系代码-t_srs表示输出坐标系代码。EPSG:4547 是 CGCS2000 / 3-degree Gauss-Kruger CM 114E焦作市经度在 112.5°E 附近按 3 度带算落在 114E 中央经线这一带。如果无法确认原始坐标系最稳妥的办法是先把 shp 和 DEM 同时加入 ArcMap 或 QGIS肉眼比对两者是否重合再决定用哪个坐标系的代号做转换。注意坐标系不确定时强行赋错代码比不赋代码更麻烦属于典型的废掉数据操作。2.3 数据体检清单4 项必查项整理一份我在拿到任何 DEM 数据包后都会过的检查清单第一文件完整性。解压时如果报「文件损坏」或「CRC 错误」先别赌运气重新解压一次用 7-Zip 的「测试压缩包」功能校验一遍。压缩包里的 tif 通常有几百 MB下载中断、存储介质坏道都可能造成静默损坏而 gdalinfo 不一定能发现所有坏块——它只读头部信息真正的损坏往往在读像元值时才暴露。第二有效覆盖范围。用 QGIS 打开 DEM把拉伸方式设为「按累积计数」检查影像边缘有没有大面积 NoData 空洞。省级拼接数据最常出现的问题是覆盖范围标称是全省、实际上个别县区缺一块这种缺陷在缩放到市界级别时几乎看不出来一裁剪就露馅。所以裁剪前先看全局。第三坐标系一致性检查。DEM 和 shp 必须在同一坐标系下工作否则裁剪出来位置对不上。判定方法简单粗暴在 GIS 里把两个图层叠加市界和 DEM 的高程晕渲如果错开几十米到几百米那就是坐标系不一致或同一坐标系但不同中央经线的经典症状。第四分辨率真实性。名义 30m 的数据实际检查像元大小可能在 28.5 米到 32 米之间浮动这是因为不同来源ASTER GDEM、ALOS AW3D30、SRTM 重采样在重投影过程中插值造成的。核对方法很简单量一下同一段山脊线在两个版本上提取的等高线走位差异如果偏移在半米到一米以内可忽略超过一个像元就要考虑换数据源。30m 分辨率名义上够用但遇到地形剧烈变化的太行山前缘地带一个像元偏移就足以让水文分析的流向判断翻车。3. 用市级范围 shp 裁剪 DEM 栅格ArcGIS 掩膜提取与 Python 两条路3.1 ArcGIS 中依靠面图层裁剪 DEM按掩膜提取工具的参数细节ArcGIS 里用面图层裁剪栅格主要有四个工具裁剪Clip、按掩膜提取Extract by Mask、栅格选择Select by Attribute后导出、以及空间分析工具箱里的「提取 → 按掩膜提取」。绝大多数人会用「裁剪」工具但我要明确告诉你裁剪工具做的是外接矩形裁剪得到的是矩形栅格shp 边界之外的区域虽然显示为 NoData但像元仍然保留在文件里。而按掩膜提取Extract by Mask才是真正把边界外的像元丢弃掉、只保留边界内部数据的那把刀。工具位置在 ArcToolbox → 空间分析工具 → 提取分析 → 按掩膜提取。输入栅格选 DEM输入掩膜数据选市界 shp输出栅格命名好路径。这里有两个参数值得说清楚第一「NoData 值」参数。工具默认要求输入掩膜区域内如果有 NoData 像元输出对应位置仍为 NoData。如果你后续要用邻域分析如焦点统计边界处的空值会造成半径范围内的统计结果异常解决办法是先用「填挖」或「栅格计算器」把 -32767 转成 None再做掩膜。第二「像素大小」参数。按掩膜提取对话框底部有「像元大小」选项默认选择「输入栅格」一般保持默认即可。但如果你分析时希望让输出分辨率更细比如从 30m 加密到 15m工具会用双线性插值生成新像元——这一步会产生虚假的地形细部而且插值出来的高值点不能用于后续坡度计算。我的建议除非下游确实需要统一分辨率否则掩膜提取时不要动像元大小。具体步骤在 ArcMap 里是加载 DEM 和市界 shp打开按掩膜提取工具填好输入输出路径环境设置里把「处理范围」设为「与图层 市界 相同」等待执行完成。执行完看一眼属性右键输出栅格 → 属性 → 源确认像元大小还是 30 米、范围跟市界一致。3.2 Python rasterio 批量裁剪同样的活换一种干法如果焦作市这份数据要跟周边地市拼接或者你要同时处理几十个县区边界ArcGIS 点鼠标的效率就不够了。这种批量活我用 Python 的 rasterio 配合 geopandas 来做核心是利用rasterio.mask.mask函数实现面要素裁剪产物和 ArcGIS 按掩膜提取一致。import rasterio import geopandas as gpd from rasterio.mask import mask import numpy as np # 读取市级范围边界 boundary gpd.read_file(jiaozuo_boundary.shp) # 确认边界坐标系与 DEM 一致不一致则用 to_crs 转换 boundary boundary.to_crs(EPSG:4547) # 打开 DEM with rasterio.open(jiaozuo_dem_30m.tif) as src: # 取边界几何要素列表 geoms [feature[geometry] for feature in boundary.__geo_interface__[features]] # 执行掩膜提取 out_image, out_transform mask(src, geoms, cropTrue, nodata-32767) # 更新元数据 out_meta src.meta.copy() out_meta.update({ driver: GTiff, height: out_image.shape[1], width: out_image.shape[2], transform: out_transform, nodata: -32767 }) # 写出裁剪结果 with rasterio.open(jiaozuo_dem_clipped.tif, w, **out_meta) as dst: dst.write(out_image)这段代码的逻辑是先把 shp 里的所有面要素取出来交给mask函数做裁剪cropTrue表示把输出范围收紧到要素边界本身而不是保留矩形范围这一步相当于 ArcGIS 的按掩膜提取加「裁剪范围」两个动作的合体。nodata-32767在这里很重要——不指定的话输出栅格会沿用输入 DEM 的 NoData 值如果输入文件的 NoData 是 0有些数据源用 0 表示空值那你裁剪后所有高程为 0 的地方都会被当成空值显示后面做填洼、流向分析直接错乱。参数说明里最容易被忽略的是boundary.to_crs。如果 shp 是 WGS84 经纬度DEM 是 CGCS2000 投影两个坐标系的几何要素直接进mask()会报「坐标系不匹配」或者在错误的位置裁剪。我在处理这类河南本地数据时一般先把所有输入统一到 EPSG:4547如果拿到的 DEM 本身没有投影信息就先在 GIS 里人工确认后由原始文件转换一份投影版再做批处理。批处理场景还应留意市界 shp 若有多个县区面geoms要传完整列表而不是只取geoms[0]——只取第一个面会剪出某个县区的范围不是全市范围这个细节我见过不止一次被写错。3.3 掩膜提取和栅格裁剪工具到底有啥区别这是检索里高频出现的问题直接说清楚。裁剪Clip工具的底层逻辑是「矩形相交」它按照矢量要素的整体外接矩形来切割栅格边界外的像元虽然不参与显示但文件里依然存在只是标记成了 NoData。按掩膜提取的底层逻辑是「像元级判断」对于每个像元判断其中心点是否落在面要素内部落在内部则保留高程值落在外部则统一设为 NoData。这个差别在结果文件大小和后续分析行为上都很明显裁剪结果文件更大因为矩形外框的 NoData 区域占据了大量存储空间更关键的是某些统计工具如区域统计、分区统计会把矩形范围内的 NoData 像元纳入统计范围计数导致面积、均值等指标出现偏差。而掩膜提取后的文件紧贴边界统计值不会把外部空值算进去。实际工作中我的选择路径是这样的如果只是出图展示裁剪工具够用且速度快如果要算面积、算体积、做水文分析、做邻域统计一律改用掩膜提取。但有一个例外当你的 shp 边界极其复杂比如包含大量岛屿边界掩膜提取可能产生大量锯齿状边界像元而裁剪工具保持矩形栅格便于后续无人机影像等更高分辨率数据的配准叠加。这时候我会先用掩膜提取再用「栅格清理」工具做一次边界平滑——代价是边缘处高程有 ±1 个像元的位移。4. 从裁剪后的 DEM 提取派生数据坡度、坡向、等高线与山体阴影4.1 坡度坡向z 因子和输出单位两个不能动错的旋钮裁剪完成后的 DEM 才能用于地形分析。在 ArcGIS 里坡度工具位于 Spatial Analyst → 表面分析 → 坡度。参数面板上有两个容易出错的选项一个是「输出测量单位」——可以选择度Degrees或百分比Percent出图报告一般用度工程上用百分比用于土方、径流计算另一个是「Z 因子」Z Factor。z 因子的意义在焦作这种地形跨度大的地方尤其重要坡度计算使用的是像元间的高程差除以水平距离如果你的 DEM 是地理坐标系经纬度水平距离单位是度、高程单位是米两者量纲不一致算出来的坡度完全失真。解决办法是先把 DEM 投影到 CGCS2000 高斯克吕格EPSG:4547这种米制坐标系此时水平距离单位为米z 因子保持为 1 即可。还有第二种情况如果 DEM 高程单位不是米而是厘米或英尺那 z 因子要相应设为 0.01 或 0.3048不然坡度偏大或偏小到离谱。ArcGIS 里对应代码可以用 ArcPy 一行跑完import arcpy from arcpy.sa import Slope, Aspect arcpy.env.workspace rD:\jiaozuo arcpy.env.extent jiaozuo_dem_clipped.tif arcpy.env.mask jiaozuo_boundary.shp # 计算坡度单位为度 slope Slope(jiaozuo_dem_clipped.tif, DEGREE, 1) slope.save(jiaozuo_slope_deg.tif) # 计算坡向按北方向起算顺时针 aspect Aspect(jiaozuo_dem_clipped.tif) aspect.save(jiaozuo_aspect.tif)参数说明Slope第二个参数是输出单位可选DEGREE或PERCENT_RISE第三个参数就是 z 因子。Aspect不用传单位参数输出值是 0 到 360 的方位角0 表示正北、90 正东、180 正南、270 正西-1 代表平地无坡向。用环境设置里的mask可以保证输出栅格和裁剪边界完全一致避免出现在边角处多出半行像元的尴尬。4.2 生成等高线从栅格到矢量30m 值得什么间距从 DEM 生成等高线是在 ArcToolbox → 3D Analyst → 栅格表面 → 等高线。这里我要提醒一个常见误区不是间距越小越精细。30m 分辨率的 DEM 本身是对真实地形的一次采样每一个像元代表 30m × 30m 的地面平均高程用 1m 等高距去提取产出的是一条条极度锯齿状、甚至出现大量闭合小圈的无效线。按我的经验30m DEM 用 10m 或 20m 等高距最合适如果你想出 5m 等高线用于林地详查这类精细用途建议先换更高分辨率数据源而不是硬压这份 30m 数据。等高线生成参数里有个「z 因子」注意跟坡度工具的 z 因子作用不同这里 z 因子是把输入栅格的高程单位转换到你想要的输出单位。如果 DEM 高程单位为米、输出也要米保持默认 1如果后续要导到 CAD 里配合建筑设计单位毫米设成 1000 才能让等高线高程值正确显示。另外「最大顶点数」参数用于控制线的平滑程度默认值是 1000我一般改成 500 以下不然生成的山脊线会变成毛线团。4.3 山体阴影困在「全黑阴影」里的常见原因山体阴影Hillshade是最常见的可视化产品也是初学者最容易卡住的地方。ArcGIS 里工具在 Spatial Analyst → 表面分析 → 山体阴影两个关键参数是太阳高度角默认 45 度和方位角默认 315 度即西北方向光照。如果你生成的阴影图一侧黑得完全看不出地形大概率是 z 因子问题——和坡度一样地理坐标系的 DEM 直接做山体阴影会产生极度拉伸的阴影效果另一个常见原因是 DEM 范围包含大量平原区如黄河滩区高程变幅小在 45 度光照下几乎全景灰黑一片。处理方法是先把 DEM 转成米制投影再做山体阴影然后把符号化方案设为「双色渐变」而不是「拉伸连续色」让暗部阈值往下压。如果地图上还需要突出北部太行山前缘的地貌特征可以把太阳高度角降到 30 度、方位角调成 315 度阴影对比更强烈山脊线看起来更立体。Python 里也可以用hillshade函数复现同样的参数组合from rasterio.plot import show import matplotlib.pyplot as plt # 计算山体阴影与 ArcGIS 参数保持一致 hs hillshade(da, angle45, direction315) fig, ax plt.subplots(figsize(10, 8)) ax.imshow(hs, cmapgray) ax.set_title(Jiaozuo DEM Hillshade) plt.show()参数里angle45是光源高度角direction315是光源方位角。理论上这两个值没有绝对正确只有适不适合当前地形特征——南方低山丘陵用 45/315北方高差大的山地我习惯压到 30/315平原占主导的区域适当把透明度拉高做叠加底图。5. 焦作市 DEM 落地的 5 个常见问题与排查5.1 裁剪出来的 DEM 一片黑或整块空白现象拖进 GIS 后全图显示黑色或全空白拉伸显示也不出层次。原因分两种一是 DEM 的 NoData 值没被正确识别数据是 Int16 类型但 NoData 标记为 -32767软件读取时把它当成普通高程值拉伸配色时被当作极小值处理画面整体发黑二是掩膜提取输出没有正确写入 NoData 值导致边界外的空值以 0 参与渲染。解决在图层属性 → 符号系统 → 将 NoData 显示为背景色并确认「无数据值」已设置为 -32767如果仍不正常用栅格计算器执行Con(IsNull(raster), -32767, raster)统一 NoData 标记。5.2 提取的坡度奇大或平缓得不像话z 因子和投影问题现象坡度计算结果是满屏 70 度以上的陡坡或者整个区域坡度不超 3 度。原因几乎可以锁定在投影上直接拿经纬度坐标系的 DEM 做坡度分析水平单位是度而高程单位是米ArcGIS 在内部把 1 度近似为 111319.49 米来换算正常 100 米左右的坡高差被压缩成零点几度。解决第一步Project Raster把 DEM 投影到 EPSG:4547第二步确认 z 因子为 1重新运行坡度工具。检查方法简单在结果图层上用「探查」工具随机点几个点坡度值在 0 到 40 度之间波动是正常太行山前缘坡地出现 80 度以上或大量 0 度平台就是坐标系出问题。5.3 裁剪后范围比市界小一圈shp 与栅格边界咬合问题现象裁剪结果边缘出现明显白边或者部分市界区域在 DEM 上缺失。原因DEM 覆盖范围与市界范围之间存在偏移。一是数据源本身只覆盖了部分区域比如拼接时缺了西南角沿黄河段二是 shp 的坐标系与 DEM 坐标系底层基准不同西安 80 与 CGCS2000 之间偏移可达几十米。解决先在 GIS 中叠加显示确认偏移方向和幅度。如果是几十米以上的平移尝试Shift工具做平移校正但这不是首选方案——更可靠的是直接找覆盖完整的 DEM 源。如果是西北角边界处缺失小块查看原始 DEM 覆盖范围把个别缺失的瓦片补齐后再合并、再裁剪。5.4 不同来源 DEM 拼贴后在市界处有错位和条带现象从相邻两个市下载的数据拼在一起后焦作边界处出现明显的色调断层高程突变十几米以上。原因两份 DEM 来源不同一份是 ASTER GDEM另一份是 ALOS AW3D30或者虽然来源相同但后期处理链条不同导致高程基准存在系统性偏差。解决使用 ArcGIS 的「镶嵌」工具时选择BLEND混合模式而非FIRST或LAST并在镶嵌前给两份数据分别计算均值偏移量用栅格计算器把第二份数据的高程整体加减一个常数再执行镶嵌。如果重叠区偏移呈非线性山体地段差十几米、平原地段差 1 米内那就不是常数改正能解决的建议放弃拼接重新获取统一来源的全省瓦片。5.5 DSM 与 DEM 混淆为什么你裁出的「地表」上有房子和树现象提取的高程值在城区某处突然凸起三五米或在河谷里出现一排排「假山」。原因很多从网上下载的所谓 DEM 实际是 DSM——数字表面模型它记录的是地表物体的顶面高程包括房屋、树木、桥梁。判断方法很简单打开数据缩小到城区如果建筑密集区高程有明显突刺这就是 DSM。解决使用「焦点统计」配合「栅格计算器」做一次中值滤波以 3×3 或 5×5 窗口去除明显的非地表突刺然后重新填洼再使用。但这里有个分寸问题滤波半径太大会削平真实山头尤其是太行山前缘的陡坎地貌。中值滤波核建议从 3×3 开始看结果再决定是否加大。5.6 DEM 裁剪后面积统计不对椭球面积与平面面积之惑现象在属性表里统计裁剪后 DEM 的像元数量乘以 900 平方米得到的面积和官方公布的焦作市面积对不上差出百分之几。原因官方面积一般指椭球面积是基于地球椭球体表面的面积而 GIS 里直接做像元数量乘像元面积的估算得到的是投影平面面积山区地形起伏大平面面积与椭球面积天然有差距且差别不是「误差」是几何定义不同。解决如果只是报告里的统计口径问题明确标注「基于投影平面的统计面积」即可如果必须汇报椭球面积使用 ArcGIS 的「计算几何属性」工具选择 AREA_GEOdesic或改用面积制表工具并选对坐标系底图。实际上对于焦作这种山地与平原各半的地形两个口径差异在 2% 上下属于正常范围。6. 让这份 30m DEM 增值的验证与叠加技巧6.1 用野外控制点或高精度影像验证 DEM 高程的实操办法拿到数据后我做的第一件增值工作不是分析是验证。你没有小范围高精度 LiDAR 点云也没关系两个办法够用一是从天地图或公开卫星影像里找到几个特征点比如桥梁两端、水库大坝顶、山脊明显垭口记录影像上的高程注记大多是 5m 精度然后在 DEM 上提取对应像元的高程做对比二是用 GNSS 手持机在几个可控点测一下测 5 个点以上算平均误差。对比方法在 QGIS 里可以直接做把野外点表CSV 带经纬度高程加载进来用「采样栅格值」工具提取 DEM 高程到点属性表然后算差值。如果平均差在 ±5m 以内说明这份 30m DEM 质量合格如果系统性偏高或偏低 10m 以上可能是高程基准不同或插值参数有问题。这一步我强烈建议抽时间做因为很多网上流传的 DEM 是从旧版 GDEM 切出来的局部区域误差能到 20m拿去做淹没分析和工程量估算偏差很大且难以向甲方解释。6.2 DEM 与地类 shp 叠加渔网统计与平均高程出图的实用技巧当你手上还有一份国土三调或林地一张图的地类 shp 时30m DEM 的真正价值是叠合分析。常见做法是先按地类图斑做分区统计算每个图斑的平均高程、坡度分布用于灾毁评估、坡耕地调查、立地条件分类。操作上ArcGIS 里用「分区统计为表」Zonal Statistics as Table分区字段选地类编码统计类型选 MEAN、MAJORITY、STD 就能出表。如果想做更自由的统计用「渔网」Create Fishnet按公里网格或 5 公里网格切分范围再叠加地类和 DEM这样能看到全市范围内不同区位的高程与地类组合结构。渔网工具参数上我一般这样设模板范围选市界 shp像元宽度/高度设为 5000 米网格太大看不出空间差异太小则统计噪声大勾选「创建标注点」方便后续出图。生成渔网后做「相交」Intersect得到每个格网内的地类/高程明细汇总出表格后用 Excel 透视表拖出「网格 × 地类 → 平均高程」矩阵。这套东西用在汇报材料里非常出效果而且能直观回答「哪个乡的高程段耕地最大」这类决策问题。6.3 30m DEM 再分析小流域提取与淹没分析的边界认知最后说说 30m 分辨率能撑起什么级别的分析。小流域提取填洼 → 流向 → 流量累积 → 分水岭在 30m DEM 上完全可用但流域面积小于 0.1 平方公里的沟道基本会被漏掉因为一条沟可能只占两三个像元流向算法会把它们合并进主沟道。淹没分析则要更谨慎基于 30m DEM 的淹没范围模拟在平原区如黄河大堤内侧误差可达数百米因为一个像元代表 900 平方米的平地高程精度不足以分辨 10cm 级的水面坡度。所以我的原则是30m DEM 适合做区域尺度的低精度水文分区、地质灾害易发性初筛、光伏选址坡度分级、坡度大于 25 度的退耕范围粗查不适合做毫米级淹没范围、工程点位的精准土方量计算、单沟暴雨洪水淹没推演。想要后者花钱买 5m 或 1m 精度的商业地形数据或者用无人机自己飞。做这些分析时还有一个小习惯所有中间产物填洼后的 DEM、流向栅格、汇流累积量都单独保存不要随手放在默认路径。后续任何一个步骤参数想重做「后悔药」就是这些没被覆盖的中间文件。尤其是填洼后的 DEM一旦被覆盖整个水文分析链就得从零开始而且填洼参数对低洼平原区的结果影响极大多留一份版本等于多给自己一条退路。希望这些方法和血泪教训能帮到你——我自己的习惯是每做完一轮分析就压缩一份带日期的归档包这个习惯救过我不下三次。本文还有配套的精品资源点击获取