
简介面向黄土高原水土流失治理、生态修复与区域规划研究这套GIS数据包集成DEM高程栅格与四大类生态分区成果适用于ArcMap用户及地理信息分析人员可直接用于流域水文分析、地貌分异与生态恢复专题制图。压缩包共12个文件、约4.78MB含2个TIFDEM高程与标准成图、可编辑MXD工程文件以及一套由shp/shx/dbf/prj等组成的标准Shapefile分区数据打开即可制图。生态分区依据国家相关划分原则综合气候、地形地貌、水土流失治理模式与生态恢复差异借助县级行政边界、空间分析与栅格叠加划分出黄土高塬沟壑区、黄土丘陵沟壑区、沙地与农灌区、土石山区及河谷平原区四类区域并细分A1/B1等副区及涉及县数层级完整。数据可为生态保护规划、土壤侵蚀评价与可持续发展决策提供基础支撑已有135人学习适合高校科研、规划设计及水土保持从业人员参考。1. 黄土高原DEM高程与生态分区数据包先用谁、怎么用拿到黄土高原DEM高程及4大类生态分区数据包很多人的第一反应是直接按分区边界去裁剪高程栅格然后套进各种统计公式里跑。但真正落地时最先卡住的往往不是算法而是那个“可编辑mxd文件”打开之后一堆红色感叹号或者shape文件和高程TIF投影不统一叠上去错位几十公里。这个数据包的核心价值不在原始数据而在于把“能编辑的工程文件mxd 能分析的矢量边界shape 能直接发布的栅格成图TIF”一次性配齐让接到数据的人可以跳过最耗时的出图配置环节。本文按一条完整工作流往下拆先搞清三类文件各自的用途再修好mxd的数据源接着用分区shape去裁剪DEM最后把成果导出为标准成图TIF顺带把坐标、NoData、符号化这些最容易翻车的细节逐一讲透。2. 拆开三类文件mxd管编辑、shape管分析、TIF管出图2.1 为什么要同时给mxd、shape和TIF三类成品一个区域内同时给出DEM高程TIF、4大类生态分区shape和可编辑mxd很多人会以为这是“重复劳动”其实这三类产品对应完全不同的交付场景。mxd是ArcMap的工程文档它不存数据本身存的是图层引用路径、符号化方案、图例、比例尺和页面布局。简单说拿到mxd相当于拿到别人已经排好版的工作台。生态分区图层用哪种颜色、DEM用哪套高程色带、图幅范围框定在哪里这些制图规范都固化在mxd里。直接打开mxd再改比从零新建一个地图文档省下大量时间。shape文件则纯粹是给分析用的。分区shape里承载了几何和属性比如每个分区的名称、代码、面积甚至预先算好的平均坡度、平均海拔字段。分析工作流里的空间连接、裁剪、分区统计几乎都基于shape和栅格数据交互完成mxd在这里面只是“显示容器”。TIF成图是最容易被忽视但最实用的一份。它是把DEM经过符号化、拉伸、叠加分区边界后直接导出的标准栅格图片带地理坐标可以发给不看ArcGIS的合作方也能直接扔进PPT或报告中当底图。业内通常把这类TIF叫“标准成图”意思是拿到就能用不再依赖ArcMap环境。所以这套数据包的设计逻辑很清晰mxd面向编辑者shape面向分析者TIF面向阅读者。搞清楚这一点后续就不会纠结“到底用哪个文件”。2.2 shape文件的结构与属性表检查shape文件实际上是一组同名文件的总称至少包含四个必要文件.shp几何坐标、.shx几何索引、.dbf属性表、.prj坐标系定义。有的还会带.cpg字符编码和.sbn空间索引。拷贝数据时如果漏了.prj或.dbf地图上要么不显示属性表要么干脆无法加载。拿到生态分区shape文件后建议先做一个三分钟检查。先看属性表里有没有“分区代码”或“分区名称”字段这决定了后面做分区统计时按哪个字段聚合。再看分区面是否闭合且不重叠两个多边形一旦交叉裁剪DEM或分区统计时相交区域会被重复计算。检查工具在“数据管理工具-要素-检查几何”里可以一次性排查空几何、自相交等问题。以前遇到过分区shp里有一块飞地完全脱离主体范围检查几何时没提示结果裁剪后的DEM出现一块莫名其妙的矩形空洞查了半天才发现是属性表里残留旧要素。4大类生态分区在不同项目里划分口径不一样常见的有森林生态区、草原生态区、农田生态区、荒漠生态区也有按水土流失类型区分的。不管哪种分类字段往往叫CLASS或TYPE值是1到4这样的整数码。做分析时不要拿汉字名称字段去聚合编码字段更稳定。2.3 4大类生态分区与DEM的联动统计方法分区shape和DEM栅格放在一起不是单纯为了“裁剪”裁剪只是取数真正有价值的是分区统计。以黄土高原为例想知道每个生态分区的高程区间、平均坡度需要把DEM作为值栅格把生态分区作为分区栅格做zonal统计。在ArcMap里常用“Spatial Analyst-分区分析-分区统计为表”工具import arcpy from arcpy.sa import ZonalStatisticsAsTable arcpy.env.workspace rE:\loess_data zones eco_zones.shp dem DEM30m.tif out_table zonal_stats.dbf arcpy.CheckOutExtension(Spatial) zonal_stats ZonalStatisticsAsTable( in_zone_data zones, zone_field ZONECODE, in_value_raster dem, out_table out_table, statistics_type DATA, ignore_nodata DATA )逻辑说明zone_field要填分区的唯一编码字段不能用名称字段避免聚合混乱statistics_type填DATA表示统计时忽略栅格NoData像元如果填ALLNoData会被当作有效值参与运算结果全员偏小输出的是dbf表可以直接用Excel打开。参数说明如果DEM里有负值统计结果中的最小值就是真实负值不要误以为是坏数据。黄土高原部分地区有采空塌陷地形DEM里出现负高程完全正常。3. 打开mxd并修复数据源从红叹号到可编辑3.1 mxd文档的路径存储逻辑与修复mxd里每个图层都记录了数据源路径。作者在打包数据时如果mxd记录的是D盘某个深层路径你解压到E盘后直接打开ArcMap自然找不到对应文件图层名前会挂一个红色感叹号。这不是文件损坏只是路径失效。最常见的手工修复路径如下右键红色图层-数据-修复数据源弹出对话框后导航到本地对应的shape或TIF文件即可。图层数量多时一个个修很费时比较快的做法是先在“文件-文档属性”里把“数据源选项”改为“相对路径”保存mxd后再批量检查。相对路径的意思是mxd记录的是“和mxd本身的相对位置”。比如mxd在E:\loess_data\map目录下shape在E:\loess_data\shp目录下那么mxd里存储的路径就是..\shp\eco_zones.shp。这样整个数据包拷到哪都不会断链。但前提是文件之间的相对目录结构不能被破坏把shape单独挪去别处就失效了。3.2 用Python批量替换数据源路径图层数量较多时手工修复确实费劲这里给一个我常用的Python翻新脚本适用于mxd里所有图层指向同一个根目录的场景。import arcpy mxd_path rE:\loess_data\map\loess.mxd old_path rD:\old\loess_data new_path rE:\loess_data mxd arcpy.mapping.MapDocument(mxd_path) for lyr in arcpy.mapping.ListLayers(mxd): if lyr.isGroupLayer: continue try: old_source lyr.dataSource if old_source.startswith(old_path): new_source old_source.replace(old_path, new_path) lyr.findAndReplaceWorkspacePath(old_source, new_source) print(replaced:, old_source, -, new_source) except RuntimeError: print(layer has no dataSource, skip:, lyr.name) mxd.relativePaths True mxd.save() print(done)逻辑说明FindAndReplaceWorkspacePath只替换路径前缀对栅格和矢量图层都有效。mxd.relativePaths True等同于在文档属性里勾选相对路径。运行时如果某个图层是空的或者数据源没有正确暴露会抛RuntimeError用try-except跳过即可。参数说明old_path必须和实际mxd里记录的字符完全一致反斜杠数量、盘符大小写都要匹配否则替换不生效。建议先把mxd里某个图层的路径拷出来核对一遍再填进脚本。3.3 DEM高程渲染的合理参数数据源修好后还要检查DEM图层的符号化方式。如果打开后是一片灰白说明符号化丢失或没有被正确加载。右键图层-属性-符号系统选择“分类”或“拉伸”。骨架DEM通常用“拉伸”比较稳拉伸类型选“最值-最值”或“百分比截断”。百分比截断一般设为1%到99%可以避免个别极端像元把色带拉花。色带建议选“高程”或“灰白-绿-棕”的渐变从低海拔到高海拔能直观对应地貌形态。4. 用面图层裁剪DEM TIFClip与ExtractByMask的差别和参数实测4.1 Clip和ExtractByMask到底哪里不同“ArcMap中依靠面图层裁剪DEM栅格TIF文件”和“依靠面图层掩膜提取”这两句话描述的场景很多人混淆因为它们看起来都是用一个面去切栅格。实际命令返回值差异非常明确。Clip裁剪工具位于“数据管理工具-栅格-栅格处理-裁剪”它的本质是“取矩形范围”还是“取面范围”取决于一个叫ClippingGeometry的参数。如果参数值是NONE即使你传入了一个生态分区的面要素输出栅格仍然是以面要素的范围外接矩形为准只有参数值改为MaskPolygon输出才是真正沿着面边界剪切。而“按掩膜提取”工具位于“Spatial Analyst-提取分析”它把输入面边界以外的像元直接设为NoData输出范围贴合面要素。从算法效率看Clip通常更快占内存更少适合大批量数据ExtractByMask逐像元做掩膜判断结果边界更精准但处理超大栅格时比较慢。项目中一般是哪种情况用哪个如果只是把高程数据裁剪到“某个县域范围”用Clip更合适如果要按“生态分区”的精确边界去裁则用ExtractByMask。4.2 按掩膜提取的标准操作和arcpy实现在ArcMap里按掩膜提取的完整路径是“Spatial Analyst工具-提取分析-按掩膜提取”。输入栅格选DEM输入掩膜数据选生态分区shape输出路径指定一个TIF。这里除了工具本身环境设置更关键。在“环境”里把“处理范围”设为生态分区图层范围把“捕捉栅格”设为DEM可以确保输出栅格的像元位置与原始DEM对齐不产生半个像元的偏移。NoData选项保持默认“保留”后续分区统计时才不会误把空洞当0值。对应的Python写法如下import arcpy from arcpy.sa import ExtractByMask arcpy.CheckOutExtension(Spatial) dem rE:\loess_data\dem\DEM30m.tif mask rE:\loess_data\shp\eco_zones.shp out_dem rE:\loess_output\dem_by_zones.tif arcpy.env.snapRaster dem arcpy.env.mask mask arcpy.env.extent mask extracted ExtractByMask(dem, mask) extracted.save(out_dem) print(mask extract done)逻辑说明arcpy.env.snapRaster起着对齐作用它会把输出像元边界“吸附”到DEM的像元网格上避免掩膜提取后产生相位偏移。arcpy.env.mask不仅限定范围还会让后续所有Spatial Analyst工具都以该shape的有效区域为界限。arcpy.env.extent设置到掩膜图层范围避免输出区域过度扩大。参数说明如果只设置了env.extent而忘记设置sapRaster输出结果范围正确但像元网格会从0坐标重新排布拿去做分区统计时每个像元的值与原DEM对不上这个坑特别隐蔽。4.3 Clip工具的适用场景与NoData处理有些草稿阶段不需要精确边界只想快速看一下特定区域的DEM形态直接用Clip工具import arcpy arcpy.Clip_management( in_raster rE:\loess_data\dem\DEM30m.tif, rectangle , out_raster rE:\loess_output\dem_clip.tif, in_template_dataset rE:\loess_data\shp\eco_zones.shp, nodata_value 255, clipping_geometry MaskPolygon, maintain_clipping_extent NO_MAINTAIN_EXTENT )参数说明rectangle为空但in_template_dataset传入面图层且clipping_geometry为MaskPolygon时输出就是面边界裁剪结果。nodata_value255表示裁剪后外围区域的像元统一赋值255这适用于8位栅格如果DEM是16位255会被当作真实高程此时设为空字符串比较安全。maintain_clipping_extent设为NO_MAINTAIN_EXTENT时输出通常跟随像元对齐设置为YES时以裁剪面边界为准可能导致边界处出现多个部分覆盖像元。实际工程里我比较建议固定用这种方式来做“快速浏览版”真正算高程统计时另存一份Mask提取结果。两份TIF并存并不冲突反而能避免“复制一份改坏了全部”的血泪情况。5. 常见问题排查坐标系、NoData与裁剪边界5.1 现象DEM和生态分区shape叠加后错位明显原因非常直接两个数据集的投影坐标系不一致。DEM常用UTM或Albers等投影而生态分区shape可能还保留着地理坐标系或者两者都是投影坐标但投影带号不同。叠加显示时在一个数据框下强制统一就会出现几十米到几公里的位移。解决方式先分别右键图层-属性-源查看坐标系。如果shape没有定义坐标系先用“定义投影”工具赋予正确坐标系再执行“投影”转换到和DEM一致。一定注意“定义投影”和“投影”是两回事前者只是写prj信息不改变坐标数值后者才做重投影。跳过前者直接投影结果会错得更离谱。5.2 现象裁剪后DEM边界出现明显锯齿且边缘色带异常原因有两个。一是矢量面边界密折点较多栅格像元本身是方块两者叠加必然产生锯齿二是符号化时的拉伸范围没有避开边缘的压线像元边缘值被拉高或拉低视觉上像一圈黑边白边。解决方式如果只是最终成图把拉伸方式改为“百分比截断”截断范围1%到98%边缘假色会大幅减少。如果是要做分析不要过度依赖30米分辨率去勾勒复杂边界可以先用“重采样”把像元细化到10米再用ExtractByMask锯齿问题会缓解很多。但重采样后数据量膨胀一般只在重点小流域范围内使用。5.3 现象分区统计表里平均高程明显偏低或出现负数原因DEM里存在大量NoData而你在裁剪环节用了Clip并把NoData填成了255。后续ZonalStatistics统计时255被视为真实高程注入均值计算把结果拉低或者拉高。这个坑在黄土高原边缘地带特别常见因为原始DEM在山体阴影或拼接缝处经常有空洞。解决方式回到Clip环节不要填nodata_value或者在分区统计前先用“栅格计算器”把异常大值筛掉比如SetNull(dem_clip 20000, dem_clip)。更稳妥的路径是全部用ExtractByMask它自动保留NoDataZonalStatistics里选用DATA类型即可忽略。5.4 现象mxd打开速度特别慢甚至闪退原因mxd里引用的大TIF没有构建金字塔ArcMap打开时实时金字塔计算磁盘IO被拖慢。或者mxd引用了网络路径网络抖动导致图层加载超时。解决方式对TIF在图层上右键-数据-构建金字塔选择1到7级压缩选JPEG即可。网络路径问题则把整个数据包复制到本地再用第3章的方法重建路径。闪退前记得养成“另存为mxd副本再操作”的习惯给自己留个后悔药。5.5 现象导出的TIF成图颜色和mxd画布里不一致原因ArcMap画布显示时做了屏幕拉伸TIF导出时默认按“当前显示范围”和“渲染质量”输出。如果画布缩放比例低于100%导出结果会和预览有差异另外16位TIF被普通看图软件读成8位颜色自然发灰。解决方式在图层属性-显示里关闭“忽略背景值”把背景色设为无导出地图时色彩深度选24位RGB压缩选LZW无损DPI设300。最后用看图软件核对时要明确看图工具是否能识别GeoTIFF带的色彩解释不能识别不代表文件坏了。6. 制作标准成图TIF输出参数与检查清单6.1 布局导出与图层叠加顺序数据修好、裁剪完成、符号化验证通过后最后一步是把成果导出为标准成图TIF。打开mxd后切换到布局视图推荐页面设置为A3横向。插入数据框把DEM裁剪结果放在最底层生态分区边界矢量叠加在上面边界线宽设0.8磅颜色用高饱和色。图例和指北针不放在栅格范围内用隔离图框承载。比例尺设成整数倍比如1:400000这样后续放在协作文件中不会出现碎数。导出时选择“文件-导出地图”格式选TIFF分辨率300DPI“写入世界文件”必须勾选这样生成的TIF才带定位信息。6.2 验证检查表与第一人称经验导出完成后不要直接交出去按这个检查表过一遍。检查项操作合格标准投影一致性属性-源查看坐标与源DEM坐标系完全一致高程值域识别工具点读像素无255或-9999异常值分区边界叠加生态分区shp对比边界贴合无明显偏移NoData区域调整拉伸范围亚太区域视觉无明显黑块以前在一个黄土高原的县域制图任务里导出TIF后发现西南角有一片灰黑色区域返回检查才发现是两张DEM镶嵌时没有做接边羽化NoData被拉伸成了“黑边”。后来习惯是先跑一遍检查清单再分发给其他人。做这类项目我一般把原始DEM和裁剪后DEM分目录存放mxd文件中先指向裁剪结果原始文件只做只读备份。这样即使后续符号化改坏了也不至于重头再来。希望这些踩坑记录对你少走弯路照着这套工作流一步步来最终成果应该问题不大。希望帮到你。本文还有配套的精品资源点击获取