青藏高原12个流域边界数据集:从mxd工程到成图TIF的完整拆包 简介这份青藏高原12个流域边界数据集面向水文、遥感、地理信息及全球变化研究方向的科研人员与研究生解决流域划分数据获取难、格式不统一的问题。数据基于2000年SRTM DEM结合河流湖泊水系辅助利用ArcGIS水文模型将青藏高原划分为AmuDayra、Brahmaputra、Ganges、Hexi、Indus、Inner、Mekong、Qaidam、Salween、Tarim、Yangtze、Yellow共12个子流域外围边界参考2500米等高线范围略大于高原实际边界。资源包共129个文件约152.21MB以shp、dbf、prj、shx等标准Shapefile组件为主兼容ArcGIS与QGIS另含可编辑mxd工程文件、标准成图TIF及中国省级行政区划shape文件便于按需修改出图与裁剪。目前已有213人学习。该数据来源可靠已在GRL等SCI论文中正式使用适合直接用于流域分析、制图与论文配图。1. 青藏高原12个流域边界数据集从mxd工程到成图TIF的完整拆包拿到一份流域边界数据最怕的不是数据本身有问题而是拿到手不知道怎么用。这套青藏高原12个流域边界数据集包含汇总和单个两套边界、可编辑的mxd工程文件、标准shp矢量、以及已经出好的成图TIF。说白了它解决的是一个很具体的痛点做青藏高原水文、土壤侵蚀、碳流失相关研究时流域边界这个基础底图不用自己从头描。适合谁做区域水文分析的研究生、做土壤侵蚀制图的工程师、以及需要快速出图给项目组汇报的从业者。12个流域覆盖了青藏高原主要水系单元汇总版适合做全局分析单个版适合做子流域精细化处理。mxd文件意味着你可以在ArcGIS里直接改符号、改标注、改布局不用从零搭工程。TIF成图则是给那些不需要二次编辑、直接要图的人准备的。这份资源的核心价值在于省掉边界矢量化那几天甚至几周的重复劳动。2. 流域边界shp的坐标系统与属性表拿到数据先做这三件事2.1 坐标系统确认与投影转换青藏高原范围大跨了多个UTM带也涉及地理坐标系和投影坐标系的选用。拿到shp第一件事不是急着加载而是先看.prj文件。常见做法是如果.prj里写的是GCS_WGS_1984那它是地理坐标系单位是度直接拿来做面积计算会得到平方度的结果没有实际意义。做面积统计、缓冲区分析、坡度计算必须转成投影坐标系。青藏高原常用的投影有Albers等面积投影中央经线一般设东经105度左右双标准纬线用25度和47度这个组合在国内区域制图里比较通用。在ArcGIS里操作工具箱 → Data Management Tools → Projections and Transformations → Project。输入要素选单个流域shp输出坐标系选Albers。如果做全局分析12个流域统一投影后再合并。注意投影转换是有精度损失的但流域边界这种面状要素损失在可接受范围内。# 用arcpy批量把12个流域shp转成Albers投影 import arcpy import os # 输入文件夹和输出文件夹 input_folder rD:\qinghai_tibet\basins_shp output_folder rD:\qinghai_tibet\basins_albers # Albers投影参数青藏高原常用 albers_proj arcpy.SpatialReference() albers_proj.loadFromString( PROJCS[China_Albers, GEOGCS[GCS_WGS_1984,DATUM[D_WGS_1984, SPHEROID[WGS_1984,6378137.0,298.257223563]], PRIMEM[Greenwich,0.0],UNIT[Degree,0.0174532925199433]], PROJECTION[Albers], PARAMETER[False_Easting,0.0], PARAMETER[False_Northing,0.0], PARAMETER[Central_Meridian,105.0], PARAMETER[Standard_Parallel_1,25.0], PARAMETER[Standard_Parallel_2,47.0], PARAMETER[Latitude_Of_Origin,0.0], UNIT[Meter,1.0]] ) # 遍历所有shp文件 for shp_file in os.listdir(input_folder): if shp_file.endswith(.shp): input_path os.path.join(input_folder, shp_file) output_path os.path.join(output_folder, shp_file) arcpy.Project_management(input_path, output_path, albers_proj) print(f已转换: {shp_file})这段脚本的逻辑是遍历文件夹里所有shp逐个投影到自定义的Albers坐标系。参数说明Central_Meridian设105度是因为青藏高原经度范围大约在东经73到104度之间105度能覆盖整个区域且变形较小Standard_Parallel_1和_2分别设25和47这是中国区域制图常用的双标准纬线组合能保证面积变形最小。跑完之后每个流域的面积字段单位就是平方米了。2.2 属性表检查与字段规范化投影转完下一步看属性表。这套数据集的属性表里通常有流域名称、编码、面积等字段。但不同来源的数据字段名可能不统一比如有的叫“NAME”有的叫“Basin_Name”有的用中文“流域名称”。做批量处理之前先把字段名统一了不然后面按属性筛选、做统计的时候容易翻车。常见做法是在ArcGIS属性表里新建一个字段比如“BasinName”然后用Field Calculator把原字段的值赋过来。如果原字段是中文注意编码问题shp的.dbf文件对中文支持有限建议转成拼音或英文缩写。这一步看着琐碎但后面做批量出图、批量裁剪TIF的时候统一的字段名能省很多事。# 用arcpy统一属性表字段名 import arcpy shp_path rD:\qinghai_tibet\basins_albers\basin_01.shp # 添加新字段 arcpy.AddField_management(shp_path, BasinName, TEXT, field_length50) # 用原字段值填充新字段假设原字段叫NAME with arcpy.da.UpdateCursor(shp_path, [NAME, BasinName]) as cursor: for row in cursor: row[1] row[0] # 把NAME的值赋给BasinName cursor.updateRow(row) print(字段规范化完成)逻辑说明AddField_management新建一个文本字段长度50够用。UpdateCursor遍历每一行把原字段的值复制到新字段。参数上field_length根据流域名称长度调整一般50够用。如果原字段有中文建议先用Python的encode处理一下或者直接在ArcGIS里手动改避免乱码。2.3 拓扑检查与几何修复流域边界是面状要素面与面之间不能有重叠、不能有缝隙否则做叠加分析的时候结果会出问题。这套数据集虽然号称标准shp但实际用的时候还是建议跑一遍拓扑检查。常见的问题是相邻流域之间有细小的缝隙或者重叠肉眼看不出来但做面积统计的时候会差那么一点点。在ArcGIS里新建一个File Geodatabase把shp导进去然后新建拓扑规则选“Must Not Overlap”和“Must Not Have Gaps”。验证一下有问题的会自动标出来。修复方法对于缝隙可以用“Create Feature”手动补或者用“Eliminate”合并到相邻面对于重叠用“Clip”或者“Symmetrical Difference”处理。如果嫌麻烦也可以用shapechk这类工具做批量修复但注意修复前备份原始数据修复算法有时候会改变边界形状。3. mxd工程文件怎么用从打开到出图的完整流程3.1 mxd版本兼容性与数据源修复mxd是ArcGIS的工程文件但它有个坑版本不兼容。如果你用的是ArcGIS Promxd是打不开的得先转成aprx。如果用的是ArcMap 10.x高版本存的mxd在低版本里也打不开。所以拿到mxd第一件事确认自己的ArcGIS版本。常见做法是如果版本不匹配用ArcGIS Pro的“Import Map”功能把mxd导进来或者让对方另存为低版本。打开mxd之后大概率会遇到数据源丢失的问题。因为mxd里存的是绝对路径换台机器路径就变了。解决方法File → Map Document Properties → 勾选“Store Relative Paths”然后点“Source”选项卡逐个修复数据源路径。如果12个流域的shp都在同一个文件夹里修复一个之后其他的会自动匹配。# 用arcpy批量修复mxd数据源路径 import arcpy mxd_path rD:\qinghai_tibet\project.mxd old_path rC:\old\path new_path rD:\qinghai_tibet\basins_shp mxd arcpy.mapping.MapDocument(mxd_path) mxd.findAndReplaceWorkspacePaths(old_path, new_path) mxd.save() print(数据源路径已修复)逻辑说明findAndReplaceWorkspacePaths把mxd里所有指向old_path的图层路径替换成new_path。参数上old_path是mxd里原来的路径new_path是你本地的实际路径。跑之前建议先备份mxd万一替换错了还能恢复。3.2 符号系统与标注的批量修改mxd工程里通常已经配好了符号和标注但别人的配色不一定符合你的需求。比如12个流域用12种颜色可能太花你想改成统一色系。在ArcMap里右键图层 → Properties → Symbology可以改填充色、边框粗细。如果要批量改可以用“Import”功能从一个配好的图层导入符号系统。标注方面流域名称的标注位置可能需要微调。常见做法是用“Label Manager”设置标注字段和字体然后用“Maplex”引擎做自动避让。如果标注还是重叠可以转成注记Annotation手动拖位置。这一步比较耗时但出图效果会好很多。3.3 布局视图与出图参数设置mxd的布局视图里通常已经放好了图例、比例尺、指北针。你需要改的是页面大小和输出分辨率。青藏高原区域大建议用A3或A2页面分辨率至少300dpi。输出格式选TIF勾选“Write World File”这样TIF会带坐标信息方便后续在GIS里叠加。出图之前检查一下数据框的坐标系是不是和图层一致。有时候mxd里数据框是地理坐标系图层是投影坐标系出图的时候比例尺会不对。在Data Frame Properties → Coordinate System里确认一下。另外如果要做成图TIF的伪彩图效果可以在Symbology里选“Stretched”或“Classified”配合色带调整。4. 成图TIF的读取、裁剪与格式转换4.1 TIF坐标信息验证与伪彩图制作这套数据集里的成图TIF通常是已经渲染好的RGB图像可能不带坐标信息也可能带。先验证一下在ArcGIS里加载TIF如果提示“Unknown Spatial Reference”说明没有坐标信息需要手动定义。常见做法是用“Define Projection”工具给它指定和shp一致的坐标系。如果TIF是单波段的灰度图想做伪彩图在Symbology里选“Stretched”然后选一个色带比如从蓝到红的渐变。如果想做分级显示选“Classified”设置分级数和断点。注意成图TIF的分辨率决定了它的用途如果分辨率低放大之后会模糊不适合做精细分析只适合做背景底图。4.2 按流域边界裁剪TIF的两种方法拿到成图TIF之后经常需要按单个流域裁剪比如只要长江源区的部分。方法有两种一是用ArcGIS的“Clip”工具Data Management → Raster → Raster Processing → Clip输入TIF和流域shp勾选“Use Input Features for Clipping Geometry”输出就是裁剪后的TIF。二是用“Extract by Mask”工具Spatial Analyst → Extraction效果类似但Extract by Mask对NoData的处理更干净。# 用arcpy按流域边界批量裁剪TIF import arcpy from arcpy.sa import ExtractByMask # 检查Spatial Analyst许可 arcpy.CheckOutExtension(Spatial) tif_path rD:\qinghai_tibet\basin_map.tif shp_folder rD:\qinghai_tibet\basins_albers output_folder rD:\qinghai_tibet\clipped_tif for shp_file in os.listdir(shp_folder): if shp_file.endswith(.shp): shp_path os.path.join(shp_folder, shp_file) basin_name os.path.splitext(shp_file)[0] output_path os.path.join(output_folder, f{basin_name}_clip.tif) # 用ExtractByMask裁剪 out_extract ExtractByMask(tif_path, shp_path) out_extract.save(output_path) print(f已裁剪: {basin_name}) arcpy.CheckInExtension(Spatial)逻辑说明ExtractByMask按shp的几何范围裁剪TIF保留shp范围内的像元范围外的设为NoData。参数上tif_path是输入的成图TIFshp_path是单个流域边界output_path是输出路径。注意裁剪之前确保TIF和shp的坐标系一致否则结果会偏移。如果TIF没有坐标信息先用Define Projection定义。4.3 TIF转其他格式的注意事项有时候需要把TIF转成其他格式比如JPEG、PNG用于插入文档或者转成ASCII Grid用于模型输入。转JPEG/PNG的时候注意分辨率设置一般300dpi够用太高文件会很大。转ASCII Grid的时候注意NoData值默认可能是-9999如果模型不认这个值得改。常见的一个坑是TIF转PNG之后坐标信息丢了。如果后续还要在GIS里用建议保留TIF格式或者转成GeoTIFF。如果只是插入Word那无所谓。另外globalmapper导出TIF的时候分辨率选项要慎重选“Cell Size”还是“Output Size”前者按像元大小后者按输出像素数选错了要么文件巨大要么细节丢失。5. 避坑与常见问题排查5.1 shp文件中文乱码现象在ArcGIS里打开shp属性表里的中文字段显示成乱码或者问号。原因shp的.dbf文件默认编码是UTF-8或者GBKArcGIS不同版本对编码的支持不一样。解决用QGIS打开看看如果QGIS显示正常说明是ArcGIS的编码问题。可以在ArcGIS里设置注册表或者用Python的dbfread库读出来转成UTF-8再写回去。更简单的办法是在QGIS里另存为新的shp编码选UTF-8。5.2 mxd打开后图层红叹号现象mxd打开后图层前面有个红色叹号数据不显示。原因数据源路径变了mxd找不到文件。解决右键图层 → Data → Repair Data Source手动指到正确路径。如果图层多用前面提到的findAndReplaceWorkspacePaths批量修复。注意修复之前先把所有数据放到同一个文件夹结构下保持相对路径一致。5.3 TIF裁剪后范围不对现象用流域边界裁剪TIF结果范围比流域大或者小。原因TIF和shp的坐标系不一致或者TIF的像元对齐方式有问题。解决先用Project工具把两者统一到同一坐标系然后用“Snap Raster”环境设置让输出TIF的像元和输入对齐。在ArcGIS的Environment Settings → Raster Analysis里设置Snap Raster为输入的TIF。5.4 12个流域合并后面积对不上现象把12个流域合并成一个shp算出来的总面积和单个相加对不上。原因流域之间有重叠或者缝隙。解决合并之前先做拓扑检查用“Must Not Overlap”和“Must Not Have Gaps”规则修复之后再合并。如果重叠面积很小可以用“Union”之后“Dissolve”把重叠部分合并掉。5.5 成图TIF分辨率与显示不匹配现象TIF在ArcGIS里显示模糊放大后马赛克严重。原因TIF本身分辨率低或者金字塔文件没建。解决如果TIF分辨率确实低那没办法只能重新出图。如果是显示问题在ArcGIS里右键TIF → Properties → Pyramids建一下金字塔。另外出图的时候分辨率设高一点300dpi起步如果要做大幅面打印设600dpi。6. 进阶技巧用模型构建器批量出12个流域的专题图如果你经常需要给12个流域分别出图手动一个个做太慢。用ArcGIS的ModelBuilder搭一个批量出图模型一次跑完。思路是迭代要素类 → 按属性选择 → 裁剪TIF → 出图。具体步骤打开ModelBuilder插入“Iterate Feature Classes”迭代器指向流域shp文件夹然后插入“Select”工具按流域名称筛选接着插入“Extract by Mask”裁剪TIF最后插入“Export to TIFF”或者直接用数据框出图。# 用arcpy批量出12个流域的专题图 import arcpy # 设置工作空间 arcpy.env.workspace rD:\qinghai_tibet\basins_albers mxd_path rD:\qinghai_tibet\project.mxd output_folder rD:\qinghai_tibet\output_maps # 加载mxd mxd arcpy.mapping.MapDocument(mxd_path) df arcpy.mapping.ListDataFrames(mxd)[0] # 获取所有流域shp basins arcpy.ListFeatureClasses() for basin in basins: # 更新数据框范围到当前流域 lyr arcpy.mapping.Layer(basin) arcpy.mapping.AddLayer(df, lyr, AUTO_ARRANGE) # 获取流域名称 basin_name basin.replace(.shp, ) # 导出地图 output_path f{output_folder}\\{basin_name}.tif arcpy.mapping.ExportToTIFF(mxd, output_path, df, resolution300) # 移除图层准备下一个 arcpy.mapping.RemoveLayer(df, lyr) print(f已出图: {basin_name}) del mxd print(批量出图完成)逻辑说明这段脚本遍历文件夹里所有流域shp逐个添加到mxd的数据框然后导出TIF。参数上resolution300是输出分辨率单位dpi。注意ExportToTIFF之前确保数据框的范围已经缩放到当前流域否则出图范围不对。可以在AddLayer之后用df.zoomToSelectedFeatures()或者手动设置df.extent。另外如果mxd里已经有其他图层记得在出图前隐藏或者移除避免干扰。一个更稳妥的做法是在ModelBuilder里用“Data Driven Pages”功能。先在mxd里启用Data Driven Pages用流域shp的某个字段作为索引然后导出地图系列一次生成12张图。这个功能在ArcMap的Customize → Toolbars → Data Driven Pages里。设置好索引图层和名称字段导出的时候选“Export Map Series”格式选TIF分辨率300。这样出的图每张的范围自动匹配对应流域不用写代码。从那以后我每次拿到新的流域边界数据都强制走一遍“投影转换 → 拓扑检查 → 属性规范化”这三步不管对方说数据多标准。希望帮到你。本文还有配套的精品资源点击获取