简介:广西梧州市的三十米分辨率数字高程模型数据,覆盖全市行政边界,并附带相应的面边界矢量文件,面向地理信息系统学习者与城市规划、环境研究等专业用户,满足区域地形分析与制图需求。压缩包共十二个文件,大小约四十九兆,核心为栅格高程影像,同时包含地理配准参数、投影坐标信息、快速预览文件,以及由几何、索引与属性组成的边界矢量数据,另有多个元数据文件记录坐标系统与分辨率,可在常用地理信息软件中准确叠加与使用。目前已有三百六十七人学习下载。该数据除支持高程提取、坡度坡向计算、视线分析和排水模拟外,其完整配套文件也有助于理解栅格数据与矢量数据的组织方式。因以梧州市边界为范围,周边局部区域同时被覆盖,适合开展更大尺度的地形背景研究。
1. 梧州DEM tif:一张地形底图先用在哪、坑在哪
梧州是典型的“山城水都”,西江穿城而过,城区沿河、周边山体密集,做城市规划、地质灾害评估、光伏选址或雨洪分析的人,手里只要有一份覆盖市域的DEM数字高程模型(tif格式)和市范围shp文件,很多活儿就能立刻立起来。这套数据最典型的用法就三件事:把DEM裁到市域范围、从DEM上做坡度坡向分析、和shp矢量一起做空间叠加。本文不预设你用哪个GIS版本,ArcGIS Desktop、ArcGIS Pro、QGIS甚至纯GDAL命令行都能跑通,我把每一步的参数、顺序和常见翻车点都按一线处理习惯写清楚,新手能照着走,熟手可以直接跳到自己关心的排查段。
2. 拿到梧州DEM先别急着剪:坐标系、分辨率、范围三件套检查
很多人拿到tif和shp的第一反应就是开裁剪工具,这是最容易翻车的起点。DEM数据的坐标系、像元大小和覆盖范围直接决定后续所有分析的可靠性,这三项没核对清楚,裁剪出来看着没问题,一到坡度计算或面积量算就会出妖。我一般会花十分钟把这两份文件的“身份信息”查清楚再动手。
2.1 先核对坐标系:地理坐标和投影坐标混着用会出大问题
打开ArcMap或ArcGIS Pro,在内容列表里右键tif图层,进入属性→源→空间参考,能看到它的坐标系描述。常见DEM数据源里,全球公开数据多数是GCS_WGS_1984地理坐标系,国内一些加工过的数据会转成CGCS2000,甚至直接给到高斯克吕格投影坐标。shp同理,市界范围文件有时是WGS84、有时是CGCS2000,投影带还分3度带和6度带。
这两种坐标混在一起用,最直接的后果就是裁剪错位。比如tif是投影坐标、shp是地理坐标,ArcGIS在做掩膜提取时会动态投影,动态投影本身没问题,但如果你把环境里的“输出坐标系”设错了,裁出来的结果会整体偏移几百米甚至更多。检查逻辑只有一条:两份数据的空间参考描述必须一致,或者明确知道差异并做了投影转换。拿到文件后先在同一个视图里叠加看一眼,边界贴合度越直观。
如果你发现两份文件坐标系不同,常见做法是保投影坐标、转矢量。打开ArcToolbox→数据管理工具→投影和变换→要素→投影,把shp投影到与tif一致的空间参考。注意这里要区分“投影”和“定义投影”:投影是改了坐标值,定义投影只是改描述信息,很多人点错按钮导致越改越乱。
2.2 分辨率和覆盖范围:决定直接能用还是需要补数据
DEM数据的“精度”对非遥感专业的人来说是一个玄学概念,但在GIS里一个参数就能定生死:像元大小。打开tif属性里的栅格信息,看像元大小是30、12.5还是90米,这个数值决定你后续分析能识别的最小地形单元。梧州这种丘陵城市,30米分辨率能看清山体大势,12.5米能看到一些精细冲沟和人工边坡,如果要做单体地质灾害隐患点排查,建议找更高分辨率的数据源。
然后用属性里的“范围”或“范围”选项卡,对比shp的外包矩形。一种常见情况是DEM覆盖了梧州大部分区域但恰好缺了某个边角乡镇,直接裁剪会留黑边或空洞。另一种情况是DEM范围远大于梧州市界,这种情况下裁剪前可以先按shp的外包矩形做一次初步裁剪,缩小数据量,再用shp做精确掩膜,运算速度会快很多,特别是大范围tif配大范围shp时效果明显。
2.3 打开tif和shp的正确方式:ArcGIS里看元数据属性表的习惯
不少新手拿到的shp打开后只有图形没有属性,连市辖区的名字都看不到,就怀疑文件损坏。其实shp的属性表是独立的dbf文件,缺了它或路径里有中文时都能导致属性显示异常。正确的检查方式是:把shp拉进视图后,右键打开属性表,正常能看到字段行数和每个县的名称。如果表是空的但图形有显示,通常不是文件坏,而是文件包缺了dbf文件。
tif的检查重点则是“统计值”和“NoData值”。右键tif属性→符号系统,看拉伸类型和统计值;再用“数据→元数据”里找像元类型,常见有16位有符号整型和32位浮点型。这里记录一个数据表方便你对照检查:
| 检查项 | 具体内容 | 异常表现 |
|---|---|---|
| 空间参考 | 地理坐标还是投影坐标;CGCS2000还是WGS84 | 叠加错位、面积算不准 |
| 像元大小 | 30m / 12.5m / 90m | 地形细节粗、坡度过大或过小 |
| 像素类型 | 16位整型 / 32位浮点 | 高程值出现异常大数 |
| NoData值 | -9999 / -32768 等 | 裁剪后出现大片黑边或空洞 |
| 范围 | 是否覆盖梧州市域全部 | 边角缺失、水体区域空白 |
这套检查做完,裁剪前的底数就清楚了。别嫌这步啰嗦,后面所有坑有一半是这里的草率埋下的。
3. 用梧州市shp裁剪DEM tif:掩膜提取参数与批量脚本
数据检查完,进入核心操作:用shp文件把梧州市范围的DEM裁出来。这步的关键不只是“能用裁剪工具就行”,而是顺序选择、参数设置和输出设置这三个细节决定结果质量。很多人裁完发现边缘锯齿严重、分辨率从30米变成60米甚至NoData黑边横飞,都是参数没设对。这一章把ArcGIS菜单操作和Python批量方案都拆开讲。
3.1 先投影还是先裁剪:两种顺序的结果差异
先回答一个很多人纠结的问题:到底是先把整套数据投影成统一坐标系再裁,还是先裁剪再投影?我的建议是:如果是常规分析,先统一坐标系再裁剪;如果只是出图不量算,顺其自然就行。原因是“裁剪”本身是个几何操作,投影一致的情况下掩膜边界和像元边界对齐最好,裁出来的边界干净,避免动态投影带来的边界锯齿。
但有一种情况建议先裁剪再投影:tif文件巨大(比如跨度很大的原始DEM),投影转换涉及全图重采样,很吃内存和时间。先裁剪后投影能让重采样范围大幅缩小,运算更快。这个选择没有绝对正确答案,原则就一条:裁剪和投影各做一次,别重复做,别让两个操作互相干扰。
3.2 ArcGIS的Extract by Mask:参数设置与输出检查
菜单路径:Spatial Analyst工具→提取分析→按掩膜提取,工具名叫Extract by Mask。打开后设置:
- 输入栅格:梧州DEM tif
- 输入掩膜数据:梧州市shp
- 输出栅格:设置一个明确的文件路径,注意别存在中文路径里
这工具有三个最容易设错的参数。第一个是输出像元大小,在“环境设置”里,默认是“输入栅格的像元大小”,但你如果之前跑过别的分析,环境里可能残留了别的分辨率,必须手动检查。第二个是NoData值,环境→处理范围里选择“与掩膜相同”,这样输出才能正好贴合shp边界。第三个是金字塔和统计值,很多人裁剪后打开图层一片黑,其实是统计信息没自动计算,右键图层→数据→计算统计值即可恢复显示。
裁剪完成后用“识别”工具点几下图层,确认高程值在合理范围。梧州沿江平原地带海拔大约几十米,山地区域能到几百米,如果出现-9999或32767这种极端值,说明NoData设置有问题,回去检查掩膜和像元大小。
3.3 用Python批处理批量裁剪:arcpy脚本与GDAL对照
如果手头有多份shp需要逐个裁剪(比如梧州下辖的苍梧县、藤县、岑溪市各裁一份),菜单操作太慢,我一般用arcpy脚本批量跑。代码逻辑很简单:遍历shp文件、取文件名作为输出名称、逐个执行掩膜提取。这里给出一个可以直接改路径运行的脚本。
# -*- coding: utf-8 -*- import arcpy import os # 把下面三个路径改成你自己的实际路径 dem_path = r"D:\wyzhou_data\wyzhou_dem.tif" # 梧州DEM原始tif shp_folder = r"D:\wyzhou_data\county_shps" # 存放各县区shp文件的文件夹 out_folder = r"D:\wyzhou_data\clipped_output" # 裁剪结果输出文件夹 # 环境设置:输出像元大小保持和输入DEM一致 arcpy.env.snapRaster = dem_path # 捕捉栅格,保证像元对齐 arcpy.env.cellSize = dem_path arcpy.env.extent = "MAXOF" arcpy.env.overwriteOutput = True # 遍历shp文件夹里的所有面要素 arcpy.env.workspace = shp_folder shp_list = arcpy.ListFeatureClasses("*.shp") for shp in shp_list: # 去掉.shp后缀作为输出文件名 name = os.path.splitext(shp)[0] out_tif = os.path.join(out_folder, name + "_dem.tif") # 执行掩膜提取,注意像元大小参数直接读DEM原始值 arcpy.gp.ExtractByMask_sa(dem_path, shp, out_tif) print("裁剪完成:" + out_tif)这段脚本里最关键的是前四个环境设置,它们保证了批处理过程中不会因为上一次的残留设置改变分辨率。snapRaster设定后,无论怎么裁,输出栅格的像元网格都和原始DEM对齐,不会出现裁完不同shp之间网格错半格的问题。cellSize显式指定像元大小,extent设为“MAXOF”意味着所有输出范围统一取输入和掩膜的并集,避免各输出之间范围存在差异。overwriteOutput设为True允许重复运行脚本而不用手动删旧文件。
如果不想依赖arcpy和ArcGIS许可,用GDAL的命令行方案更轻量,核心命令是:
gdalwarp -cutline 梧州市界.shp -crop_to_cutline -tr 30 30 -of GTiff 梧州dem.tif 裁剪结果.tif-cutline指定掩膜shp,-crop_to_cutline让输出裁剪到shp边界,-tr强制输出分辨率30米,-of指定输出格式。这条命令不依赖ArcGIS,Linux服务器上也能跑,批量处理用shell循环即可。两种思路的选择标准很简单:单位里已有ArcGIS许可就用arcpy,否则用GDAL,二者结果在几何上没本质区别。
3.4 裁剪结果的质量检查清单
裁剪完别直接进下一步,花两分钟做一个目视和数值双重检查。把裁剪后的tif和原始shp同时加进视图,打开透明度调到50%左右,看边界是否完全贴合,如果有白边或黑边,说明掩膜提取时NoData处理有问题。再把原始DEM和裁剪后DEM都添加到视图,用“识别”工具点击同一个山顶点,高程值必须一致。
数值检查用栅格统计:裁剪后tif属性里看最小值和最大值,应该和原始DEM基本一致,只是范围缩小。如果最小值变成-9999或最大值变到30000以上,说明NoData或者位深出了问题,需要回到环境设置里检查输出位深,一般选“16位有符号”或“和输入相同”即可。
| 检查项 | 期望结果 | 异常处理 |
|---|---|---|
| 边界贴合度 | shp边界与tif边缘无错位 | 检查坐标系是否一致、环境范围设置 |
| 高程范围 | 与原始DEM一致 | 检查NoData和位深设置 |
| 像元大小 | 保持原始分辨率 | 检查cellSize环境设置 |
| 统计值 | 已计算,显示正常拉伸 | 右键计算统计值 |
| 文件大小 | 明显小于原始文件 | 不合理的过大说明范围没裁干净 |
4. 裁剪与分析中的五个常见坑:从黑边错位到分辨率偷换
这一章专门把DEM和shp配合过程中踩过的坑集中写出来,每一条都是真实翻车场景。如果你遇到了类似现象,直接对照原因和解决方案做,省去一个一个排查的功夫。
4.1 DEM和shp坐标系不一致导致裁剪完全错位
现象:裁剪出来的tif和shp边界对不上,一个在梧州城区,另一个跑到相邻省份去了,或者边界大范围偏离。原因:DEM用的是地理坐标系,shp用的是投影坐标系,而ArcGIS的按掩膜提取工具在环境设置里的“输出坐标系”被默认设成了某个固定值,导致整个掩膜过程基于错误的对位关系完成。解决:在环境设置里把“输出坐标系”改为“输入的栅格数据集”或“与掩膜相同”,保证裁剪操作在统一坐标系下完成。更彻底的方案是把shp重新投影,和DEM完全统一后再做掩膜。这个坑最容易在数据从不同渠道下载时发生,梧州市界shp经常来自测绘部门而DEM来自公开数据集,两边的坐标基准差异很常见。
4.2 裁剪后边缘一圈黑色NoData值
现象:裁剪结果图四周有一圈黑色区域,用“识别”工具点到的值是-9999或-32768,拉伸显示时黑色区域干扰判断。原因:掩膜提取后,shp边界外部的像元被赋予NoData值,但符号系统拉伸时没有忽略NoData,导致黑色区域显示出来。这不是数据坏了,是显示和统计的问题。解决:在图层属性→符号系统里,把“显示NoData值”勾选改为透明,或者设置背景值为NoData。如果要在后续坡度分析中使用,更稳妥的做法是用栅格计算器把NoData统一重分类为0或某一固定值。一个经验:不要为了好看把NoData直接改成0,那样会让边界外的低海拔区域混进统计,影响后续分析的数值分布。
4.3 裁剪后分辨率被偷偷改了,比原始DEM糊很多
现象:裁剪完的tif肉眼可见变糊,山脊线边缘变成锯齿状,属性里像元大小从30米变成60米甚至90米。原因:ArcGIS的环境设置不只有工具箱级,还有应用级,上一次某个分析把默认像元大小改成了栅格的最大或最小值,裁剪工具沿用了这个设置。解决:在工具箱“环境”选项卡里展开“栅格分析”,把“像元大小”设置为“输入栅格的最小值”,或直接在脚本里用arcpy.env.cellSize = dem_path强制指定。另一个容易忽略的点是投影变换也会触发重采样,如果先投影后裁剪,投影过程的分辨率就已经被改了,务必在投影工具的“环境”里同样指定像元大小。
4.4 shp是线要素,裁剪失败或结果为空
现象:执行按掩膜提取时直接报错,提示“掩膜数据必须为面要素”,或者裁出来只有一条线宽度的异常结果。原因:市界shp有时会以线要素形式下发,或者准备数据时有人把面转成了线,而ArcGIS的掩膜提取工具只接受面要素作为掩膜。解决:打开属性表确认要素类型,如果是线要素,用“要素转面”工具先转成面,或者用缓冲工具生成一个足够大的面。反过来,有时面shp里混着缝隙和空洞,掩膜提取后tif出现镂空不规则区域,解决办法是先用“消除”或“融合”工具把面要素整理成完整的多边形。
4.5 批处理裁剪时多份shp输出的像元错位
现象:用脚本循环裁剪多个县域时,每份结果的像元网格彼此错位,同一坐标的山顶点在不同文件里的像元位置不一致,导致后续拼接或多文件分析时对不上。原因:每份shp的外包矩形不同,arcpy自动适配了不同的对齐原点。解决:在脚本开头加一行arcpy.env.snapRaster = dem_path,把捕捉栅格设为原始DEM,这样所有裁剪输出的像元网格都以同一原点对齐。这是批处理DEM时最容易被忽视但最有必要的一行代码,不加它,后续做镶嵌或比例尺一致的制图时就会翻车翻到怀疑人生。
5. 从梧州DEM到坡度坡向等高线:完整地形分析流程
裁剪完的DEM只是原材料,真正的产出是坡度、坡向、等高线这些地形因子。梧州这种地形复杂的城市,坡度分析直接服务于地质灾害易发性评价、建设用地适宜性评估和输电线路径选择。这一章按一条龙分析的顺序写,每步参数都贴着梧州实际地形说。常见做法是用Spatial Analyst里的工具逐个跑,注意工具之间的环境设置要保持一致。
5.1 要不要做填洼:分析目的决定参数选择
DEM里常有局部凹陷的“伪洼地”,如果不处理,水文分析提取出来的水系会断流或流向错误。但填洼工具Processing是否真的需要,取决于分析目的:做水文分析(提取河网、汇水区)必须填洼,做坡度坡向和地表粗糙度分析则不需要。原因很简单,填洼会改变高程值,坡度统计跟着失真;而水文分析中洼地会使水流方向指向洼地中心,不出结果。一个常见做法是分两条线:水文分析走“填洼→流向→流量”这条流程,地形分析直接用裁剪后的DEM出坡度坡向。推荐Spatial Analyst工具→水文分析→填洼,Z值限制参数一般保持默认,如果填洼结果把山头都削平了,说明数据本身有系统性问题,回去检查原始DEM位深和NoData值。
5.2 坡度坡向计算:ArcGIS两个参数容易被忽视
菜单:Spatial Analyst→表面分析→坡度。输入栅格选梧州DEM,输出量测单位选“度”(degree),Z因子填1。这里有两个参数特别容易设错。第一个是Z因子,如果DEM是地理坐标系(度为单位),而高程是米,坡度计算必须设置Z因子修正,一般填111320(1度经纬度对应的米数近似值),否则坡度值会小得多,直接导致后面分级统计失真。第二个是输出像元大小,和裁剪时的要求一样,保持原始分辨率。
坡向计算同样在表面分析里,输出按9类:平地和8个方位。梧州的山地丘陵坡向分布差异明显,南坡和北坡的光照、植被差异会直接影响农业生产和光伏选址分析,这块的分析结果建议用县级shp做分区统计,把每个乡镇的平均海拔、平均坡度和优势坡向统计出来,比看整张图更实用。栅格分区统计工具入口:Spatial Analyst→区域分析→以表格显示分区统计,统计类型选“平均值”和“多数”。
5.3 山体阴影:快速验证DEM质量最好用的手段
山体阴影也叫Hillshade,Spatial Analyst→表面分析→山体阴影。默认参数:方位角315度、高度角45度。它输出的是模拟光照下的灰度图。这个工具最大的价值是当“DEM质检员”:一个质量合格的DEM,山体阴影图里山脊线连续、沟谷走向清晰,如果有条纹、麻点或不规则斑块,说明原始数据有噪声或拼接痕迹。梧州多山,山体阴影图把西江河谷和两岸高地的对比呈现得非常直观,用它来向非技术背景的同事解释地形格局也最好使。
常见做法是山体阴影图放在底层,上面叠加半透明的坡度图或土地利用shp,这种组合在汇报中比单张平面图有效得多。注意山体阴影参数不是固定不变的,调整方位角可以突出特定走向的构造线,梧州地区的北东向断裂在方位角设为135度时表现得最清晰,具体数值还是要按你的分析目的反复试。
5.4 从DEM提取等高线再转shp:三维分析工具的参数细节
等高线是DEM最经典的可视化产物,ArcGIS里直接用Spatial Analyst→表面分析→等高线工具,关键参数是等高距。梧州全市范围用50米等高距比较合适,重点城区或河谷地带用10米能看到更细的地形变化。输出要素会自动生成线shp,字段里带高程值。这一步看起来简单,坑在于:等高线提取结果会很毛糙,尤其是30米分辨率DEM提取的等高线在山脊处有明显锯齿,很多人直接拿去制图被审图退回来。常见做法是把等高线shp做一次“平滑线”处理(Cartography工具→制图综合→平滑线),平滑容差设为地图比例尺对应的小值,比如1:50000图件设50米以内。注意平滑过头会移动真实位置,和地形叠合时错位,容差宁小勿大。
如果手里懂一些Python,还有一个更灵活的路线:用GDAL命令行生成等高线然后转shp,命令是gdal_contour -a ELEV -i 50 输入.tif 输出.shp,参数-a指定高程字段名,-i指定等高距。这个命令不受ArcGIS许可限制,批量出图时效率更高。需要提醒的是,从DEM直接提取的等高线只能用于制图和趋势分析,不能替代测绘部门的实测等高线作为工程依据,这个边界想清楚再动手。
本章开头提到的“DSM生成DEM”如果恰好是读者手里的数据,明确一个本质差异:DSM是数字表面模型,包含屋顶、树冠高度,做坡度坡向分析会把房子和树当真实地形,得出的结果毫无意义。若手上只有DSM,需要先用点云分类或滤波工具去掉地表物再进入本章流程,这一步不是可选而是必需。
6. 最后一步:用差值栅格和样点验证你的裁剪成果
前面做完了裁剪和地形分析,你以为就结束了?还差一道验证工序。最直接的验证方法是“差值栅格法”:把裁剪前后的DEM放进栅格计算器做一次相减,公式写"原始DEM" - "裁剪DEM",理论上差值栅格全域应为0,出现非0值的地方就是重采样或NoData处理引入的误差。在ArcMap的栅格计算器里直接输入表达式后运行,输出结果里如果有明显条带或边界区域异常,说明裁剪参数需要回头修正。
另一条是“样点抽检法”:用Spatial Analyst→提取分析→多值提取至点,把随机生成的几十个样点同时提取原始DEM和裁剪DEM的高程值,打开属性表对比两个字段的差。几十个点的差值都在0.001以下说明裁剪质量过关。这个方法比差值栅格更适用于数量大、裁过多县域的场景,能快速定位哪一份裁剪结果有问题。
最后一次提醒:DEM分析的结果是否可信,最终看的是数据源头和每一步参数设置的透明记录。面上项目做到最后经常要回头解释“这个数据哪来的”,所以从一开始就在工程目录里记好每一份tif的来源、分辨率、坐标系统和处理时间,这是一个GIS从业者的职业习惯。
我个人的习惯是再小的裁剪任务也要走到山体阴影这一步,看到山脊线连续了才敢说这个DEM真的能用来分析。这套方法在多个山地城市的项目中验证过,希望你用梧州数据也能跑出顺手的成果。希望帮到你。
本文还有配套的精品资源,点击获取