资讯动态

河南省30米DEM数据处理实战:GDAL拼接、裁剪与坡度计算

发布时间:2026/9/15 12:38:02 来源:尧图企业网站定制
简介河南省30米分辨率DEM数字高程模型适合GIS、遥感或地理测绘领域的从业者与学生使用。数据基于ASTER GDEM V3拼接而成采用GeoTiff格式与WGS84坐标系覆盖河南全省范围可直接用于地形渲染、坡度坡向提取、流域分析与地貌特征研究。压缩包共10个文件核心为HeNan_DEM_30m_ASTGTMV003.tif栅格数据同时包含河南省边界Shapefile全套文件shp/shx/dbf等以及tfw、xml等空间参考辅助文件整体约176.18MB。该资源提供河南省行政边界和DEM栅格一体化配套用户无需再自行拼接裁剪可节省预处理时间。目前已有590人学习下载适合需要快速获取区域地形数据进行授课、课题研究或项目演示的GIS用户。1. 这份河南省DEM不是一张普通的tif先分清栅格与矢量再动手拿到河南DEM.rar解压后你看到的不是一张图而是一组配套文件主文件HeNan_DEM_30m_ASTGTMV003.tif是30米分辨率的栅格高程旁边的河南省.shp、.dbf、.prj才是行政区边界。如果只把 tif 拖进查看器很容易误以为“这就是一张地形灰度图”但真正做坡度、裁剪、面积统计时栅格和矢量必须分开处理。这份数据来自 ASTER GDEM V3按河南省范围拼接好并附了边界 shp适合省级尺度的地形分析、流域提取、灾害普查和制图底图。下面按文件拆解、拼接裁剪、地形分析和数据核查四个阶段展开每一步给出可复现的命令和参数避免你在 WGS84 经纬度坐标系上踩“算出来的坡度明显偏小”这类坑。2. ASTER GDEM V3的文件清单GeoTIFF、TFW、AUX.XML与shp边界2.1 30米分辨率与ASTER GDEM V3的精度边界30米分辨率表示每个像素对应地面约30m×30m像素值是该单元内的地表高程。河南全省面积约16.7万平方公里按30m栅格计算理论上有上亿个像素所以这里的HeNan_DEM_30m_ASTGTMV003.tif体积不会是几MB的小图而是一个需要分层金字塔才能流畅浏览的大栅格。ASTER GDEM V3 是 NASA 与 METI 联合发布的第三代全球高程模型采样间隔1弧秒在赤道约等于30米纬度越高经度方向的实际距离越短。V3 相对 V2 主要在空洞填补、水体掩膜和异常像元上做了修正但不同区域的验证精度差异很大平原地区垂直中误差可能在10米内山区会更大。所以把它用在省级规划、地形分类、流域提取上是合适的用于工程勘察或建筑单体设计就不够。河南地形本身也值得注意西部伏牛山、北部太行山、南部桐柏山与大别山东部是黄淮平原。这套30米数据能分辨出山脊、沟谷和河流阶地的宏观走向但到了单条冲沟或小规模切坡的尺度像素平均效应会让微地形被抹平。理解这一点后面做坡度分级和地貌分割时就不会对细节抱有过高期待。2.2 文件包里的每个文件是干什么的解压后的文件列表看起来杂乱但可以归成三组栅格主文件、矢量边界文件、辅助元数据文件。栅格主文件就是HeNan_DEM_30m_ASTGTMV003.tif它内部已经嵌入了坐标信息和仿射变换参数这是绝大多数 GIS 软件读取位置的第一来源。河南省.shp、.shx、.dbf、.sbn、.sbx是一套完整的 Shapefile 边界数据.sbn/.sbx是 ESRI 的空间索引在只读边界时不参与但被移动后会触发警告。.prj是文本坐标定义用 WKT 格式记录边界使用的坐标系。辅助文件里有三个容易被忽略HeNan_DEM_30m_ASTGTMV003.tfw是外部世界文件.tif.aux.xml是 GDAL 生成的元数据缓存.tif.vat.dbf是 ArcGIS 的栅格属性表。它们的职责如下表文件类型作用.tifGeoTIFF栅格高程像素、内嵌GeoTransform与投影.tfw文本记录左上角坐标和像素尺寸供不支持内嵌信息的老软件使用.aux.xmlXML缓存金字塔信息和NoData设置删除后会自动重建.vat.dbfdBASE栅格值到像素数的统计表重采样后必须删除.shp/.shx/.dbf矢量河南边界几何、索引和属性.prj文本边界shp的坐标系描述这里需要说明.tfw和 TIF 内嵌坐标信息一旦不一致结果以 TIF 内部为准。很多人在 ArcGIS 里看到“栅格没有金字塔”的提示实际是因为.aux.xml丢失重新计算即可不会损坏数据。.aux.xml里还会缓存STATISTICS_MINIMUM和STATISTICS_MAXIMUM如果你用gdalinfo -stats发现统计值明显不对先删掉.aux.xml再算一次。2.3 用gdalinfo检查GeoTIFF与WGS84的实际情况无论你用什么软件第一步都应该用 GDAL 命令行读一下真实元数据避免被文件命名误导。打开终端执行gdalinfo HeNan_DEM_30m_ASTGTMV003.tif重点关注几行输出Size is后面的宽高像素数Origin是左上角经纬度Pixel Size (0.000277777777778, -0.000277777777778)代表大约1弧秒即赤道附近30.9米Coordinate System is: GEOGCS[WGS 84...]表示目前是经纬度坐标单位是度而不是米。如果看到NoData Value*这一行记住这个值后续拼接和裁剪时统一使用。注意一个容易被忽略的坑在河南所在的北纬32—36度区域经度方向1弧秒对应的地面距离约25—26米纬度方向仍是约30.9米。也就是说这份数据在WGS84经纬度下严格说并不是正方形的地面分辨率。相应地直接用度为单位计算坡度、坡向时必须引入尺度因子。这个细节我放到第4章展开。3. 用GDAL把ASTER GDEM V3分幅数据拼成河南省30米DEM并裁剪3.1 拼接前先统一坐标系gdalbuildvrt与gdal_translateASTER GDEM V3 原始发布是按 1°×1° 分幅的每幅一个GeoTIFF文件名通常包含经纬度信息比如ASTGTMV003_N33E112_dem.tif。你拿到的这份河南DEM如果来自“自己拼接”大概率就是先把覆盖河南的相邻分幅找到然后合并。合并的常见做法是先建 VRT 虚拟栅格不复制数据检查范围无误后再输出为正式的GeoTIFF# 构建虚拟拼接只记录文件位置和范围不复制像素 gdalbuildvrt -srcnodata -9999 -vrtnodata -9999 henan_tiles.vrt ASTGTMV003_N3*E1*_dem.tif # 转成正式GeoTIFF统一数据类型和无值标记 gdal_translate -ot Float32 -a_nodata -9999 -co COMPRESSDEFLATE -co TILEDYES henan_tiles.vrt henan_dem_merged.tif这里-srcnodata -9999 -vrtnodata -9999是很多教程不会写的关键参数。原始分幅边缘的NoData值可能各不相同有的写0有的写-9999在VRT阶段统一设置为-9999后后续裁剪和统计才不会被边缘黑边干扰。-ot Float32保证高程精度COMPRESSDEFLATE是无损压缩TILEDYES让大文件按块读取分析速度比按行读取快很多。通配符ASTGTMV003_N3*E1*_dem.tif要按你实际下载的分幅文件路径修改我这里是按河南覆盖范围示例。如果你手头已经有拼好的HeNan_DEM_30m_ASTGTMV003.tif可以跳过拼接直接进入裁剪。但如果发现最终结果有接缝线或重叠重影就要回头检查参与拼接的分幅是否都来自V3版本V2和V3混用会出现明显的高程阶跃。提示拼接前先用gdalinfo抽查两个分幅的NoData值确保一致否则边缘会出现异常条纹。3.2 用河南省shp进行裁剪gdalwarp的cutline参数拿到河南省边界 shp 后最常见的错误是用gdal_translate -projwin按矩形裁剪这样只切出外接矩形河南省以外的区域仍然留在图里后续面积统计会虚高。正确做法是用gdalwarp的-cutline参数做矢量边界裁剪gdalwarp -cutline 河南省.shp -crop_to_cutline -dstnodata -9999 \ -tr 0.000277777777778 0.000277777777778 -r bilinear \ henan_dem_merged.tif henan_dem_cut.tif参数含义分别是-cutline指定裁切矢量面-crop_to_cutline把输出范围收缩到裁剪面的外接矩形并让边界外像素变成无效值-dstnodata -9999统一输出无效值-tr手动指定输出分辨率这里沿用原始约1弧秒值避免重采样改变地面单元大小-r bilinear是重采样方式对高程数据来说双线性插值比最邻近法平滑但在地形断裂处可能轻微拉低山峰值。如果数据已经投影到平面坐标-tr就换成30 30米。另一个常见问题是 shp 坐标是 WGS84 而 DEM 已经是投影坐标。gdalwarp 会自动根据 shp 内带的.prj做重投影但依赖网络查找栅格为了可控建议先在原数据上检查是否一致。若不一致先用ogr2ogr把 shp 转成对应投影再裁剪。3.3 裁剪后的金字塔与NoData设置裁剪完成不代表可以直接拿去分析还要做两件事清理0值伪有效像素和建立金字塔。某些重采样算法会把边界外的NoData写成0而0对高程数据可能是真实海拔但河南省最低点不可能为0所以出现0值大概率是NoData被覆盖了。用gdal_calc.py清洗# 把0值重写为-9999避免误当真实高程 gdal_calc.py -A henan_dem_cut.tif --outfilehenan_dem_clean.tif \ --calcwhere(A0, -9999, A) --NoDataValue -9999 # 建立金字塔提升ArcGIS/QGIS缩放浏览速度 gdaladdo -r average henan_dem_clean.tif 2 4 8 16gdal_calc.py的表达式where(A0, -9999, A)把等于0的像素改成NoData如果你确认数据中存在真实0海拔点就把条件改成结合其他无效值或者干脆不处理。gdaladdo -r average在栅格内建多层降采样金字塔缩放渲染时性能提升明显。注意gdaladdo是对原文件追加内部金字塔不是生成新文件所以运行后 tif 体积会略微增大。4. 基于30米DEM的坡度、山体阴影与高程重分类实战4.1 对WGS84经纬度DEM计算坡度时必须显式指定水平比例因子如果你把这份河南DEM直接丢给 ArcGIS 的 Slope 工具大概率会得到一张坡度整体偏小的图因为默认梯度计算假设水平和垂直单位一致。原始数据是 WGS84 经纬度水平单位是度垂直单位是米所以必须提供比例因子。GDAL 的gdaldem slope提供了-s参数表示水平单位与垂直单位的比例。在纬度约 34° 的河南1 度约等于 111 公里即 111000 米左右所以# 计算坡度-p输出百分比-s指定水平/垂直比例 gdaldem slope henan_dem_clean.tif henan_slope.tif -p -s 111320 # 生成山体阴影用于可视化底图 gdaldem hillshade henan_dem_clean.tif henan_hillshade.tif -z 2.0 -az 315 -alt 45解释-p让输出值变成百分比坡度不熟悉百分比的读者注意45° 对应的百分比是100%-s 111320是把经纬度水平坐标换算成米的系数如果不加坡度会被低估约5—10倍。hillshade里的-z 2.0是垂直拉伸系数河南省东部平原海拔变化小拉伸到2.0能看出微起伏-az 315表示光源来自西北方向-alt 45是太阳高度角这两个参数只影响渲染效果不做分析时不必严谨。如果你预先用gdalwarp -t_srs EPSG:32650UTM 50N把DEM转成米制投影gdaldem slope就不需要-s了这是更保险的做法尤其在做坡度分级统计和流域提取时建议先投影再计算。4.2 DEM、DSM、DOM和DTM这份数据到底适合做什么热词里“dsm生成dem”和“dem裁剪”经常放在一起讨论但首先得分清DEM和DSM。DEMDigital Elevation Model通常指地表裸地高程也叫DTMDSMDigital Surface Model则记录地表物体顶面比如树冠、屋顶DOM是正射影像不记录高程。它们的差别决定了你能从这份30米数据里提取什么不能提取什么。数据内容典型用途是否含地物高度DEM/DTM裸地地表高程流域分析、坡度坡向、填挖方不含DSM地表物体顶面高程建筑高度、植被冠层分析包含DOM正射纠正影像底图、解译、标注不适用ASTER GDEM V3 属于 DEM由于光学生成方式它实际上在一些地形突变区域会混入树冠或建筑顶部的信号但整体还是以地表为主。所以在河南省范围内做山地平原分类、河流提取、洪水淹没模拟都是可用的如果要计算建筑高度、电线塔净空这类精细场景必须换 LiDAR 生成的 DSM 或更高精度 DEM。如果手头只有DSM想得到DEM通常要做地面滤波常见方法包括渐进形态学滤波和布料模拟滤波但这不在ASTER GDEM的工作范围内。4.3 把连续高程分割成平原、丘陵和山地栅格重分类“gis中dem如何分割”本质是把连续高程值离散成类别。常见做法是gdal_calc.py做多条件组合这也比在 ArcGIS 里点选 Reclassify 更可复现# 分三类200m平原200-500m丘陵500m山地 gdal_calc.py -A henan_dem_clean.tif --outfilehenan_relief_class.tif \ --calc(A200)*1 (A200)*(A500)*2 (A500)*3 \ --NoDataValue -9999这个表达式的逻辑是每个布尔条件在成立时返回1不成立返回0三类条件互斥相加后得到1、2、3。阈值可以根据项目调整比如做大别山灾害分区时把山地下限提到800米。分割结果出来后再用gdalinfo -hist查看直方图gdalinfo -hist henan_relief_class.tif输出里的Count字段是每个类别的像素数。用像素数乘以单个像素面积即可估算各类面积。需要注意WGS84下单个像素在不同纬度面积不同做省级面积统计前最好先投影到 Albers 等积投影否则平原丘陵比例会有偏差。要给分类结果出一张彩色图可以用颜色表配合gdaldem color-relief# 1平原(绿)2丘陵(黄)3山地(棕) printf 1 180 220 120\n2 255 230 120\n3 180 120 80\n relief_color.txt gdaldem color-relief henan_relief_class.tif relief_color.txt henan_relief_class_color.tif5. 数据核查与再加工TFW、VAT和坐标系一致性检查技巧5.1 别让TFW的旧值带偏你.tfw是外部世界文件但 GeoTIFF 内部同样存有仿射变换参数。多数软件QGIS、ArcGIS优先读内部坐标TFW只在某些老工具和脚本里被引用。所以当你用gdalwarp重采样后根目录里残留的旧.tfw会与新TIF不匹配。检查方法是打开TFW文件第1行是X方向像素宽度第4行是Y方向像素高度通常为负第5行和第6行是左上角坐标。然后执行# 查看TIF内嵌仿射变换和尺寸与tfw对比 gdalinfo -json HeNan_DEM_30m_ASTGTMV003.tif | grep -E geoTransform|size对比geoTransform[1]和geoTransform[5]与TFW前两行的数值是否一致。不一致时用文件管理器删除旧TFW再运行gdal_translate -co TFWYES重新生成。同时注意.tif.aux.xml在重采样后同样需要删除否则会沿用旧的统计最小值和最大值导致渲染拉伸异常。5.2 删掉过期的VAT再校验边界与栅格范围.vat.dbf是 ArcGIS 为分类栅格生成的属性表。用 GDAL 做裁剪、重投影后像素值和像素数量改变旧的VAT文件已经失效却仍然躺在目录里。ArcGIS 打开时检测到同名.vat.dbf会使用它造成“属性表和栅格不匹配”的假报错。我的做法是凡是经过 gdal_translate 或 gdalwarp 处理的输出目录如果原目录存在.vat.dbf直接删除# 删除过期栅格属性表 rm -f HeNan_DEM_30m_ASTGTMV003.tif.vat.dbf最后校验边界是否匹配。查看 shp 范围ogrinfo -so 河南省.shp查看 DEM 范围gdalinfo henan_dem_clean.tif | grep Corner Coordinates比较两组四角坐标如果 shp 是投影坐标而 DEM 是经纬度则先执行ogr2ogr -t_srs EPSG:4326 河南_wgs84.shp 河南省.shp再对比。只有边界范围和坐标系都对齐后续裁剪、坡度计算、面积统计才可信。这是交付给下游同事前最值得花的两分钟。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价