简介:这份资源提供广西梧州市的DEM数字高程数据,面向地理信息、城乡规划、环境研究与测绘等领域的从业者及GIS学习者,可用于地形分析、坡度坡向计算、排水网络模拟与灾害风险评估等场景。压缩包共12个文件,约49.43MB,以tif栅格主文件为核心,辅以prj投影信息、tfw地理坐标、ovr快速预览、xml元数据,以及shp、shx、dbf组成的边界矢量文件,另有sbn、sbx索引文件,便于在ArcGIS、QGIS等软件中直接加载与叠加分析。数据为30米分辨率,覆盖梧州市行政范围并外扩至周边区域,能提供更广阔的地理背景。目前已有367人学习下载,适合需要真实地形数据开展项目实践或掌握栅格与矢量数据处理技巧的用户参考使用。
1. 梧州 DEM 数字高程数据:从 tif 栅格到 shp 边界的落地拆解
做水文分析、坡度坡向计算、淹没模拟或者三维地形底图,第一步永远是找一份靠谱的 DEM 数字高程数据。梧州这个标题里其实藏着两个东西:一份覆盖梧州市域的 DEM 栅格 tif,一份配套的市范围 shp 矢量边界。很多人拿到 tif 就直接往 ArcGIS 里拖,结果发现范围对不上、投影是错的、边界裁出来一堆锯齿,甚至栅格和矢量压根不在一个坐标系里。这篇笔记就按一线干活的顺序,把「这份数据是什么、怎么用、参数怎么设、坑在哪」讲清楚。适合做 GIS 地形分析、需要梧州本地高程底图的从业者,也适合刚接触 DEM 文件、想搞明白 tif 和 shp 怎么配合的新手。核心就一句话:栅格管高程值,矢量管范围,两者坐标系对齐了才能干活。
2. 梧州 DEM 的 tif 与 shp 到底装了什么:栅格和矢量的分工
2.1 DEM tif 里存的是高程值,不是图片
DEM 数字高程模型,本质是一个规则格网,每个格子存一个高程数值,单位通常是米。tif 只是 GeoTIFF 这个容器格式,它把高程矩阵和地理坐标信息(投影、仿射变换参数)打包在一起。所以你不能用普通看图软件打开它,那样只会看到一片灰度。梧州市域 DEM 常见分辨率有 30 米、12.5 米,也有基于无人机或激光雷达做的更高精度数据。分辨率决定了每个格子代表地面多大范围,30 米意味着一个像素覆盖 30×30 米的地面,梧州多山地丘陵,这个精度做流域分析够用,做单体建筑选址就偏粗。
判断一份 DEM tif 能不能用,先看三个东西:坐标系、NoData 值、高程范围。坐标系决定它能不能和你的 shp 叠上;NoData 值决定裁剪后边缘会不会出现异常大数;高程范围能帮你快速识别数据有没有被错误拉伸。用 Python 的 rasterio 几行就能读出来:
import rasterio with rasterio.open("wuzhou_dem.tif") as src: print("坐标系:", src.crs) # 例如 EPSG:4326 或 EPSG:32649 print("分辨率:", src.res) # (x方向, y方向) print("范围:", src.bounds) # 左上右下经纬度/投影坐标 print("NoData:", src.nodata) # 常见 -9999 或 None band = src.read(1) print("高程最小/最大:", band.min(), band.max())这段代码先打开文件,src.crs告诉你投影信息,src.res是像元大小,src.bounds是四至范围,src.nodata是无效值标记。band.min()和band.max()如果出现 -9999 或 32767 这类极端值,说明 NoData 没被正确识别,后续统计会被污染。参数上重点盯crs,梧州常用 CGCS2000 或 WGS84 地理坐标系,做面积和坡度计算时最好转成投影坐标系,比如 UTM 49N 带。
2.2 市范围 shp 是裁剪和统计的边界依据
shp 文件是矢量面,梧州市范围 shp 通常是一个多边形,属性表里可能有行政区名称、代码。它的作用有两个:一是把大范围的 DEM 裁成只保留梧州辖区,减少数据量;二是做分区统计,比如算梧州平均海拔、坡度分布。shp 本身不带高程,它只描述平面范围。很多人以为有了 shp 就能直接出地形图,其实 shp 只是「框」,tif 才是「内容」。
shp 文件一般是一组:.shp存几何,.shx存索引,.dbf存属性,.prj存坐标系。少一个都可能打不开或者坐标丢失。拿到梧州 shp 后,第一件事是确认它的坐标系和 DEM 是否一致。用 GeoPandas 读一下:
import geopandas as gpd gdf = gpd.read_file("wuzhou_boundary.shp") print("要素数量:", len(gdf)) print("坐标系:", gdf.crs) print("范围:", gdf.total_bounds) # 左下右上 print("字段:", gdf.columns.tolist())gdf.crs如果显示 None,说明.prj缺失,你得手动指定坐标系。total_bounds给出矢量四至,和 DEM 的bounds对比,如果数量级差很远(比如一个几十一个几万),基本就是地理坐标系和投影坐标系混用了。字段列表能帮你确认这个 shp 是不是真的梧州市范围,还是只包含了某个区。
2.3 两者配合的三种典型用法
第一种是裁剪:用 shp 的面去裁 tif,得到只覆盖梧州的 DEM。第二种是掩膜提取:和裁剪类似,但会把范围外的像元设为 NoData,保留原始栅格行列结构。第三种是分区统计:按 shp 的每个多边形统计 DEM 的高程均值、最大值、标准差。这三种用法在 ArcGIS 里对应「按掩膜提取」「裁剪」「分区统计」,在 Python 里用 rasterio.mask 或 rasterstats 实现。选哪种取决于你要不要保留原始范围。做梧州全市地形图,裁剪就够了;做多个区县对比,分区统计更直接。
提示:裁剪和掩膜提取的区别经常被问。裁剪会改变栅格的行列数和范围,输出更小;掩膜提取保持原栅格大小,范围外变 NoData。如果你后续还要和别的栅格做叠加分析,掩膜提取更安全,因为行列对齐不会变。
3. 用梧州 shp 裁剪 DEM tif:命令行和 Python 两条路
3.1 先统一坐标系,再谈裁剪
裁剪翻车十有八九是坐标系没对齐。DEM 是 EPSG:4326 经纬度,shp 是 EPSG:32649 投影坐标,直接裁要么报错要么裁出空白。正确顺序是:先确定目标坐标系,把两者都转过去,再裁。梧州做地形分析建议用投影坐标系,单位是米,坡度和面积计算才准。用 GDAL 命令行转:
# 把 DEM 从 WGS84 转到 UTM 49N gdalwarp -t_srs EPSG:32649 -r bilinear wuzhou_dem.tif wuzhou_dem_utm.tif # 把 shp 转到同一坐标系 ogr2ogr -t_srs EPSG:32649 wuzhou_boundary_utm.shp wuzhou_boundary.shp-t_srs指定目标坐标系,-r bilinear是重采样方法,高程数据连续变化,双线性比最近邻更平滑。ogr2ogr的-t_srs同理。转完后用前面的 rasterio 和 GeoPandas 再确认一次crs是否一致。这一步多花两分钟,能省掉后面半小时的排查。
3.2 用 rasterio 做掩膜裁剪的完整脚本
Python 路线推荐 rasterio,轻量且容易嵌进批处理。下面这个脚本读 DEM 和 shp,按 shp 几何做掩膜,输出裁剪后的 tif:
import rasterio from rasterio.mask import mask import geopandas as gpd # 读取梧州边界 gdf = gpd.read_file("wuzhou_boundary_utm.shp") geoms = gdf.geometry.values # 取几何对象 with rasterio.open("wuzhou_dem_utm.tif") as src: # 确认坐标系一致 assert src.crs == gdf.crs, "坐标系不一致,先统一" # 按几何掩膜裁剪,crop=True 会缩小输出范围 out_image, out_transform = mask(src, geoms, crop=True, nodata=-9999) out_meta = src.meta.copy() out_meta.update({ "height": out_image.shape[1], "width": out_image.shape[2], "transform": out_transform, "nodata": -9999 }) with rasterio.open("wuzhou_dem_clip.tif", "w", **out_meta) as dest: dest.write(out_image)mask函数的crop=True表示裁剪后缩小栅格范围,crop=False就是掩膜提取,保持原大小。nodata=-9999把范围外像元标记为无效值。out_meta复制原元数据再更新尺寸和变换矩阵,保证输出 tif 带正确地理信息。跑完用 QGIS 打开,叠上 shp 看边缘是否贴合。如果边缘出现锯齿,是栅格分辨率导致的正常现象,不是错误。
3.3 ArcGIS 里按掩膜提取的参数怎么设
习惯用 ArcGIS 的话,路径是 Spatial Analyst 工具 → 提取分析 → 按掩膜提取。输入栅格选 DEM,掩膜数据选梧州 shp,输出选路径。关键参数就一个:是否勾选「使用输入要素裁剪几何」。勾选后按 shp 实际边界裁,不勾选按 shp 外接矩形裁。做梧州市域图必须勾选,否则四个角会多出矩形范围。环境设置里把「处理范围」设为 shp,「像元大小」设为 DEM 原始分辨率,避免重采样。输出后检查属性 → 源,确认像元大小和坐标系没变。
注意:ArcGIS 按掩膜提取对 shp 的几何类型敏感,必须是面要素。如果 shp 是线或点,工具会报错。另外 shp 有自相交或空几何时也会失败,先用「修复几何」工具处理一遍。
4. 梧州 DEM 落地避坑:坐标系、NoData 和边界锯齿
4.1 裁剪后全是 NoData 或数值异常
现象:裁剪出来的 tif 打开一片黑,或者高程值变成 -9999、3.4e38 这种离谱数。原因通常是坐标系不一致,shp 和 DEM 虽然都能打开,但一个在地理坐标系一个在投影坐标系,掩膜范围对不上,所有像元都被判为范围外。解决:用gdf.crs和src.crs打印对比,不一致就先用 gdalwarp 和 ogr2ogr 转到同一坐标系。另一种原因是 shp 几何本身有问题,比如自相交导致掩膜失败,用gdf.is_valid检查,无效的用gdf.buffer(0)修复。
4.2 边界出现锯齿或台阶
现象:裁剪后的梧州边界不是平滑曲线,而是一格一格的锯齿。原因:DEM 是栅格,最小单位是像元,边界只能按像元走,30 米分辨率下锯齿宽度就是 30 米。这不是 bug,是栅格数据的固有特性。解决:如果出图要求高,可以先用更高分辨率 DEM,或者在制图时用 shp 边界叠加显示,视觉上盖住锯齿。做面积统计时不要用裁剪后的栅格直接数像元,会有边界误差,改用分区统计按 shp 精确计算。
4.3 NoData 值没设对导致统计污染
现象:算梧州平均高程时结果偏得离谱,比如出现负几百米。原因:DEM 边缘或裁剪范围外的 NoData 被当成有效值参与了统计。很多 DEM 用 -9999 或 -32768 标记无效,但软件默认可能不识别。解决:读取时显式指定nodata参数,统计前用掩膜排除。用 rasterio 的话,src.read(1, masked=True)会自动屏蔽 NoData;用 ArcGIS 的话,在栅格属性里确认 NoData 值,统计时勾选「忽略 NoData」。
4.4 shp 缺少 .prj 导致坐标丢失
现象:shp 能打开但坐标系显示 Unknown,和 DEM 叠不上。原因:拷贝文件时只复制了.shp,漏了.prj。shp 的坐标系存在.prj里,没有它软件只能猜。解决:找回原始.prj文件,或者手动定义坐标系。用 GeoPandas 可以gdf.set_crs("EPSG:4326", inplace=True)强制指定,但前提是你知道正确坐标系。最稳妥是重新获取完整 shp 文件包。
4.5 裁剪后分辨率被悄悄改变
现象:裁剪前后像元大小不一样,比如原来 30 米变成 29.99 米。原因:ArcGIS 环境设置里「像元大小」没锁定,或者 Python 里重采样了。解决:裁剪时显式指定输出分辨率等于输入分辨率。rasterio 的mask默认保持原分辨率,但如果你在out_meta里改了transform就可能变。ArcGIS 里在环境设置 → 栅格分析 → 像元大小设为「与输入栅格相同」。裁剪后对比src.res和输出文件的res,一致才算过关。
5. 从梧州 DEM 到坡度坡向:验证数据可用的三个进阶检查
拿到裁剪好的梧州 DEM,别急着出图,先做三个检查确认数据真的能用。第一个是坡度计算:用 GDAL 的gdaldem slope生成坡度图,看梧州山区坡度是否合理,一般 0 到 60 度之间,出现 90 度说明高程有异常尖峰。命令是gdaldem slope wuzhou_dem_clip.tif slope.tif -p,-p表示输出百分比坡度,不加则输出度。第二个是坡向:gdaldem aspect生成坡向,值域 0 到 360,平坦区会是 -9999,检查 NoData 是否一致。第三个是等高线提取:用gdal_contour按 50 米间隔提等高线,叠到 shp 上看是否贴合梧州地形走势。
# 生成坡度图,输出单位为度 gdaldem slope wuzhou_dem_clip.tif wuzhou_slope.tif # 生成坡向图 gdaldem aspect wuzhou_dem_clip.tif wuzhou_aspect.tif # 每 50 米提取一条等高线 gdal_contour -a elev -i 50 wuzhou_dem_clip.tif wuzhou_contour.shpgdaldem slope默认输出度,加-p输出百分比。gdaldem aspect的平坦区默认 -9999,和 DEM 的 NoData 保持一致。gdal_contour的-a elev把高程值写进属性表字段elev,-i 50是间隔。这三个产物能直观暴露 DEM 的问题:坡度图有大片纯黑或纯白,说明高程范围异常;等高线断裂或密集到糊成一团,说明分辨率或 NoData 有问题。
我自己的习惯是,每次拿到新 DEM,先跑一遍坡度,用 QGIS 的剖面工具随便拉几条线看地形起伏是否自然。梧州是丘陵山地,剖面应该有明显起伏而不是一条直线。这个动作花不了五分钟,但能挡住后面百分之八十的返工。数据这东西,前期多看一眼,后期少熬一夜。希望帮到你。
本文还有配套的精品资源,点击获取