尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

自贡市30m DEM数据处理全流程:从zip包到地形分析底图

自贡市30m DEM数据处理全流程:从zip包到地形分析底图 简介这份资源是四川省自贡市30米分辨率的DEM数字高程数据包面向地理信息系统学习者、测绘与城市规划从业者及高校师生可用于地形分析、洪水模拟、地质灾害评估与地图制作等教学实践场景。压缩包共12个文件约14.72MB核心为自贡市dem.tif高程栅格辅以ovr金字塔与tfw坐标文件便于快速浏览定位自贡市范围.shp、shx、dbf、prj、sbn、sbx等Shapefile组件提供行政边界与投影信息多个xml元数据文件则记录数据结构与像元参数。数据覆盖自贡市全域并延伸至部分邻近区域便于考虑边界效应或开展更大范围研究。目前已有421人学习下载适合需要完整、可直接加载的市级DEM与边界矢量数据用于GIS软件实操、地形起伏分析与空间建模练习。1. 自贡市30m DEM数据到手后从zip包到能用的地形底图中间隔着什么拿到一个标注“四川省自贡市DEM数字高程数据30m含本市级范围shp文件.zip”的压缩包很多人第一反应是解压、拖进GIS软件、出图。但真正做过地形分析的人知道从zip到可用的地形底图中间至少隔着坐标系确认、无效值处理、范围裁剪、分辨率匹配这四道工序。自贡地处四川盆地南部地形以低山丘陵为主海拔跨度大约在250米到900米之间沱江及其支流切割出大量宽谷和缓坡。30m分辨率意味着每个像素代表地面30米×30米的区域对市级尺度的坡度分析、汇水区划分、选址评估来说这个精度刚好够用又不会让数据量失控。这篇文章面向需要用自贡DEM做地形分析、水文建模或工程选址的从业者把从数据检查到成果输出的完整链路拆开讲清楚每一步都给出可复现的操作和参数依据。2. 先搞清楚手里这份数据到底是什么30m DEM与市级shp的配套逻辑2.1 DEM栅格与行政边界shp的关系DEM是栅格数据每个像素存一个高程值shp是矢量数据用多边形描述自贡市的行政边界。两者配套使用核心目的是把分析范围严格限定在自贡市辖区内避免邻市地形干扰统计结果。常见做法是先用shp裁剪DEM再在裁剪后的栅格上做坡度、坡向、汇流等派生计算。如果不裁剪直接对整幅DEM做分析边界外的像元会被计入统计导致坡度均值、高程分布等指标偏离真实情况。这份数据里DEM通常是GeoTIFF格式shp一般包含至少一个面要素属性表里可能有行政区名称或代码字段。打开后第一件事不是急着裁剪而是确认两者的坐标系是否一致。如果DEM是WGS84地理坐标系EPSG:4326而shp是投影坐标系比如CGCS2000 3度带直接裁剪会报错或结果错位。2.2 30m分辨率的实际含义与适用边界30m分辨率来自ASTER GDEM或类似数据源水平精度约±30米高程精度约±10到15米。对自贡这种丘陵区30m能识别出主要的山脊、沟谷和台地但无法刻画小于60米的微地形。如果你的目标是分析农田坡度、选址建厂、做小流域水文模拟30m够用如果要分析单栋建筑周边的排水需要更高分辨率数据。数据量方面自贡市面积约4381平方公里30m分辨率下整幅DEM大约有4800×4800个像素GeoTIFF文件通常在50到100MB之间。这个体量在普通笔记本上用QGIS或Python处理完全可行不需要服务器。2.3 用Python快速检查数据完整性解压后我一般先用Python做一次体检确认栅格和矢量的基本信息。以下代码读取DEM和shp输出坐标系、范围、像素尺寸和无效值统计。import rasterio import geopandas as gpd import numpy as np # 读取DEM dem_path 自贡市_DEM_30m.tif with rasterio.open(dem_path) as src: print(DEM坐标系:, src.crs) print(DEM范围:, src.bounds) print(像素尺寸:, src.res) print(行列数:, src.height, src.width) dem src.read(1) nodata src.nodata print(无效值标记:, nodata) # 统计无效值占比 if nodata is not None: invalid_ratio np.sum(dem nodata) / dem.size print(f无效值占比: {invalid_ratio:.2%}) print(f高程范围: {np.nanmin(dem)} ~ {np.nanmax(dem)} 米) # 读取市级边界shp shp_path 自贡市边界.shp gdf gpd.read_file(shp_path) print(\nshp坐标系:, gdf.crs) print(要素数量:, len(gdf)) print(边界范围:, gdf.total_bounds)这段代码的关键参数说明src.res返回像素的x和y方向尺寸30m数据应显示(30.0, 30.0)src.nodata是无效值标记常见为-9999或-32768gdf.total_bounds返回shp的[minx, miny, maxx, maxy]。如果DEM和shp的坐标系不一致gdf.total_bounds的数值范围会与src.bounds明显不同比如一个是经纬度约104°E, 29°N另一个是投影坐标百万级数值。提示如果发现坐标系不一致不要直接裁剪。先用gdf.to_crs(src.crs)把shp转到DEM的坐标系再执行后续操作。3. 把DEM裁到自贡市范围内shp裁剪栅格的三种做法与参数选择3.1 用QGIS图形界面完成裁剪对不常写代码的人QGIS是最快的路径。操作步骤打开QGIS拖入DEM和shp确认两者坐标系一致右下角状态栏可看菜单栏选择“栅格”→“提取”→“按掩膜图层裁剪”在对话框中输入图层选DEM掩膜图层选shp输出文件指定路径勾选“将输入图层的分辨率保持为输出分辨率”避免重采样改变像素尺寸点击运行。裁剪完成后用“识别要素”工具点击边界外区域应显示无数据。如果边界外仍有高程值说明掩膜没生效检查shp是否有面要素、坐标系是否一致。3.2 用rasterio做精确裁剪需要批量处理或嵌入自动化流程时用Python更可控。以下代码用rasterio的mask功能按shp几何裁剪DEM并输出为新的GeoTIFF。import rasterio from rasterio.mask import mask import geopandas as gpd dem_path 自贡市_DEM_30m.tif shp_path 自贡市边界.shp out_path 自贡市_DEM_30m_clipped.tif # 读取shp并统一坐标系 gdf gpd.read_file(shp_path) with rasterio.open(dem_path) as src: if gdf.crs ! src.crs: gdf gdf.to_crs(src.crs) # 提取几何对象 geoms gdf.geometry.values # 执行裁剪cropTrue表示裁剪后缩小栅格范围 out_image, out_transform mask(src, geoms, cropTrue, nodatasrc.nodata) out_meta src.meta.copy() out_meta.update({ height: out_image.shape[1], width: out_image.shape[2], transform: out_transform }) # 写出裁剪结果 with rasterio.open(out_path, w, **out_meta) as dest: dest.write(out_image) print(裁剪完成输出:, out_path)参数说明cropTrue会把输出栅格的范围收缩到shp的外包矩形减少文件体积nodatasrc.nodata保持无效值标记一致out_meta继承原DEM的坐标系、数据类型等信息。如果shp有多个面要素比如自贡下辖的区县mask会合并所有几何进行裁剪。裁剪后建议再用3.1节的方法检查边界外是否为空。3.3 裁剪后必做的两项验证第一项像素数量对比。裁剪前DEM有约2300万像素裁剪后应减少到约1900万左右自贡市面积占整幅的比例。如果裁剪后像素数几乎没变说明掩膜没起作用。第二项高程范围对比。裁剪前后高程最小值和最大值不应有剧烈变化因为自贡市边界内包含了主要地形单元。如果裁剪后最大值突然降到500米以下可能是shp只覆盖了部分区域或者坐标系转换出错导致掩膜位置偏移。注意有些shp文件的面要素可能存在自相交或缝隙导致裁剪后出现零星空洞。用gdf.is_valid检查几何有效性无效的用gdf.buffer(0)修复。4. 从DEM到地形因子坡度、坡向、汇流累积量的计算与参数设置4.1 坡度计算单位选择与Z因子坡度是DEM最常用的派生因子。在QGIS中用“栅格”→“分析”→“坡度”工具输入裁剪后的DEM输出坡度栅格。关键参数是“Z因子”如果DEM的坐标系是投影坐标系单位米Z因子设为1如果是地理坐标系单位度需要设Z因子为约111320赤道处1度约111.32公里否则坡度会被严重低估。用Python计算坡度GDAL的gdaldem命令行更直接gdaldem slope 自贡市_DEM_30m_clipped.tif 自贡市_坡度.tif -p -s 1.0-p表示输出为百分比坡度-s 1.0是Z因子。如果输出角度制坡度去掉-p。计算完成后用QGIS打开坡度图自贡市大部分区域坡度应在0到25度之间沱江沿岸有局部陡坡超过35度。如果整幅图坡度都在5度以下检查Z因子是否设错。4.2 坡向与汇流累积量坡向计算类似用gdaldem aspect命令输出0到360度的方向值。坡向对农业选址和光伏板布置有直接参考价值。汇流累积量需要先做洼地填充再计算流向最后统计汇流。用WhiteboxTools或SAGA GIS的“Fill Sinks”和“Flow Accumulation”工具。参数上填充阈值一般设为0.01米避免过度填充改变地形。汇流累积量输出后高值区域对应沟谷和河道可用于提取自贡市的水系网络。4.3 参数设置的三个经验值第一坡度计算的Z因子投影坐标系用1地理坐标系用111320。第二洼地填充阈值自贡丘陵区建议0.01到0.1米太大填平真实洼地太小留下伪洼地。第三汇流累积量阈值提取水系时阈值设为500到1000个像素对应约0.45到0.9平方公里集水面积能过滤掉细小沟壑保留主要河道。5. 避坑与排查自贡DEM处理中最容易翻车的五个地方5.1 裁剪后边界外仍有数据现象用shp裁剪DEM后边界外区域显示为正常高程值不是无数据。原因shp的坐标系与DEM不一致掩膜位置偏移或者shp只有线要素没有面要素。解决用gdf.geom_type检查要素类型确保是Polygon用gdf.to_crs(src.crs)统一坐标系后重新裁剪。5.2 坡度计算结果整体偏小现象自贡市坡度图显示大部分区域坡度小于3度与实际丘陵地形不符。原因DEM是地理坐标系坡度计算时Z因子未设置或设为1。解决确认DEM的CRS如果是EPSG:4326在QGIS坡度工具中把Z因子改为111320或用gdaldem slope -s 111320重新计算。5.3 汇流累积量出现大量平行线现象汇流累积量图上出现密集的平行线条而不是自然的沟谷网络。原因DEM中存在条带状噪声或洼地填充不充分。解决先做一次中值滤波3×3窗口平滑DEM再执行洼地填充和流向计算。滤波会轻微改变高程但对水文分析影响可接受。5.4 裁剪后文件体积异常大现象裁剪后的GeoTIFF比原始DEM还大。原因输出时未设置压缩或者cropTrue未生效保留了整幅范围但边界外为无数据。解决写出时添加compressLZW参数并确认cropTrue。用gdalinfo查看裁剪后文件的范围是否与shp外包矩形一致。5.5 shp属性表乱码现象打开shp属性表行政区名称显示为乱码。原因shp的DBF文件编码与GIS软件默认编码不匹配常见于GBK与UTF-8冲突。解决在QGIS中右键图层→属性→源把编码改为GBK或UTF-8逐个尝试或用Python的gpd.read_file(shp_path, encodinggbk)指定编码读取。6. 让这份DEM数据真正可复用的两个进阶技巧6.1 建立自贡市地形因子数据库单次分析做完就丢下次用又要重新处理。我习惯把裁剪后的DEM、坡度、坡向、汇流累积量统一导出为GeoTIFF放在同一个文件夹用QGIS的“图层组”管理。更进一步用GeoPackage格式把栅格和矢量打包成一个文件方便传输和归档。以下代码把多个栅格写入一个GeoPackageimport rasterio from osgeo import gdal # 用gdal_translate把栅格转为GeoPackage import subprocess layers { dem: 自贡市_DEM_30m_clipped.tif, slope: 自贡市_坡度.tif, aspect: 自贡市_坡向.tif } for name, path in layers.items(): subprocess.run([ gdal_translate, -of, GPKG, path, f自贡市地形.gpkg, name ]) print(GeoPackage构建完成)这样一份自贡市地形.gpkg就包含了所有地形因子下次直接加载即可。6.2 用地形因子做选址筛选的实操思路假设要在自贡市选一块适合建厂的区域条件坡度小于5度、不在汇流累积量高值区避免洪水、海拔在300到500米之间。在QGIS中用“栅格计算器”逐步筛选坡度5 → 输出1/0汇流累积量500 → 输出1/0高程在300到500之间 → 输出1/0三者相乘得到候选区域。最后用“栅格转矢量”导出候选地块再叠加交通和用地数据做进一步筛选。这套流程我用了三年从自贡的DEM数据到最终选址图熟练后大约40分钟能跑完一轮。最深的教训是永远先检查坐标系再动手裁剪。有一次帮同事处理川南某市的DEM跳过检查直接裁剪结果整个市的坡度图偏移了十几公里白跑了一下午。后来我养成了一个习惯任何DEM到手第一行代码永远是打印CRS和bounds。希望帮到你。本文还有配套的精品资源点击获取
返回列表