简介:面向GIS初学者与需要快速出图的长江流域研究者,这份shp格式矢量数据集涵盖嘉陵江水系河网、流域边界及90米分辨率地形栅格,并附mxd工程文件,可在ArcGIS中一键链接图层出图。压缩包共63个文件,以shp/shx/dbf矢量、adf栅格、mxd工程文档以及jpg/pdf/eps出图文件为主,总大小52.77MB,目录已按矢量、栅格、出图分类整理,方便直接调用。已有1131人学习下载,适合水文分析、区划展示、教学制图等场景。若不懂GIS,可直接使用内置的jpeg、PDF、EPS成品图;熟悉ArcGIS则可借助mxd工程快速调整区域与符号,节省配图时间。数据经网络收集并二次加工,需自行核实精度,仅限学习科研使用。
1. 嘉陵江水系shp地形图是什么:为什么做流域分析的人都绕不开它
长江流域嘉陵江水系流域地形图shp格式矢量文件,内行人习惯叫“嘉陵江水系shp包”:把嘉陵江干支流、岸线、流域边界、等高线这类基础地形要素全部矢量化成点线面,直接交给ArcGIS使用。做水文分析、划汇水范围、做水土保持和环保专题图的人,如果手里没有这套shp,所有图都得手工勾边界,有了它才能把水文计算落到一张靠谱的底图上。
它解决的实际问题就两件:第一件是“图上有没有基础地形要素”,第二件是“能不能直接作为分析底图开工”。适合GIS内业、水文规划和水土保持方向的从业者。新手需要的是一个ArcGIS能打开、不用自己造坐标系的原生数据入口;熟手关心的则是原始shp的坐标系是哪个标准、分带中央经线是多少、要素拓扑是否合规。下面我会沿着“识别坐标系→投影转换→裁剪→转栅格→流域提取→出图”这条完整链条,把每一步的参数和坑都讲透。这套流程不是我凭空想出来的,而是嘉陵江这类长江支流水系项目里最常用、最可靠的一套做法。
2. 在ArcGIS里加载嘉陵江水系shp:先看懂文件结构和坐标系
2.1 shp是一组文件不是一个文件:四件套缺一不可
很多新手拿到数据后只复制了一个后缀为.shp的文件,回去在ArcGIS里打开,发现属性表是空的、坐标系信息也没有,心想“坏了,文件损坏了”。其实shp格式从来就不是单文件格式,它至少需要四个文件同时存在才能完整使用,这也是ArcGIS加载shp时的第一个黑匣子:界面没报错,但你拿不到完整信息。
以嘉陵江水系shp包为例,一个完整的要素类通常长这样:
嘉陵江_水系_流域边界.shp # 矢量几何:流域多边形 嘉陵江_水系_流域边界.shx # 几何索引:缺失会拖慢加载速度 嘉陵江_水系_流域边界.dbf # 属性表:河流名称、等级、集水面积 嘉陵江_水系_流域边界.prj # 坐标系定义:如CGCS2000_3_Degree_GK_CM_105E.shp存几何坐标,.shx是几何索引,.dbf存的是属性记录,这三者必须同名且放在同一目录。.prj是可选的文本文件,但恰恰是它决定了ArcGIS能不能正确识别坐标系。如果你收到的数据里没有.prj,ArcGIS会默认按未知坐标系加载,这时候你看到的河流可能出现在地图上任意位置,叠加天地图后完全对不上,这就是后面要讲的经典翻车现场。
我一般在拿到数据的第一个动作,不是急着拖进ArcMap,而是先开一个文件夹窗口看文件清单。如果只有.shp一个文件,我会先让同事把完整四件套发来,因为后期补坐标系是纯玄学活,猜错了整个分析都要推翻重来。
2.2 加载操作与图层面板判断:三步确认加载成功
ArcMap和ArcGIS Pro加载shp的路径不太一样,但核心操作是同一套思路。最常见的方式是打开ArcMap,在Catalog面板里定位到shp所在目录,直接把目标文件拖进内容列表;或者在ArcGIS Pro里打开“添加数据”按钮,浏览到shp文件双击即可。
加载成功后,内容列表里会出现一个要素图层,双击图层打开图层属性,能看到“源”选项卡里列出数据的完整路径、坐标系、要素类型。这一步很多人跳过,但我建议每次必须做——确认要素类型是点、线还是面,直接决定后面能不能做水文分析的填洼和流向计算。
如果你想用脚本来确认加载环境,可以在ArcGIS的Python窗口里跑这段:
# 在ArcMap或ArcGIS Pro的Python窗口里直接执行 import arcpy shp = r"D:\GIS_Data\嘉陵江\嘉陵江_水系_流域边界.shp" if not arcpy.Exists(shp): raise FileNotFoundError("检查四件套是否完整,路径不能有中文空格") desc = arcpy.Describe(shp) print("要素类型:", desc.shapeType) # 点/线/面 print("空间参考名称:", desc.spatialReference.name) # 看prj有没有生效 count = arcpy.GetCount_management(shp).getOutput(0) print("要素总数:", count)这段代码的逻辑是先用Exists判断文件是否被ArcGIS识别,再通过Describe读取要素类型和空间参考,最后用GetCount统计要素数量。如果空间参考名称是“Unknown”,说明prj文件缺失或没被读到,必须先人工指定坐标系,否则后面的所有投影和裁剪都是白做。还有一个常见坑:路径带空格或中文在某些旧版本ArcGIS 10.2下会莫名报错,我一般习惯把数据放在纯英文路径下。
2.3 坐标系识别:prj文件里能读到什么关键信息
打开prj文件,里面是一段WKT文本,记录了坐标系完整定义。嘉陵江水系shp最常见的三种坐标系来源,分别是CGCS2000、WGS84和西安80。这三者在江河数据里出现频率极高,但单位不同、椭圆体参数不同,直接混用会导致河流偏移几百米甚至上千公里。
| prj名称片段 | 含义 | 地图单位 |
|---|---|---|
| GCS_WGS_1984 | WGS84地理坐标系 | 度 |
| GCS_China_Geodetic_Coordinate_System_2000 | CGCS2000地理坐标系 | 度 |
| CGCS2000_3_Degree_GK_CM_105E | CGCS2000高斯克吕格投影,中央经线105度 | 米 |
| Xian_1980_3_Degree_GK_CM_105E | 西安80高斯克吕格投影,中央经线105度 | 米 |
判断要点很简单:如果prj里带“3_Degree_GK_CM”,说明它已经是投影坐标系,地图显示单位是米;如果只有“GCS”,说明还是地理坐标系,单位是度。嘉陵江干流大致位于东经105度左右,所以大多数成果shp会采用CGCS2000_3_Degree_GK_CM_105E这个定义。当你看到坐标系是WGS84时,多半是原始数据被转换过、或者从在线地图矢量化来的,后续叠加中国境内的其他成果数据,最好统一转成CGCS2000再干活。
3. 统一坐标系并裁剪嘉陵江研究区:投影和裁剪的门道
3.1 为什么拿到shp先做投影:跨带和叠底图
嘉陵江流域范围较长,部分区域处于高斯克吕格投影的105度带和108度带交界附近。如果shp包里的不同要素,有的用105E带、有的用108E带,直接叠在一起就会出现同一位置河流错开几十米的视觉误差,这在制图输出时可能只是难看,在做汇水面积计算时就直接导致流域边界面积算错。
我一般拿到shp后,第一步就是看所有要素的空间参考是否一致。不一致的,全部统一到同一个投影坐标系;一致也在用的,先确认是不是CGCS2000。统一坐标系不只是为了正确显示,更是为了后续计算距离、面积和生成栅格时,地图单位能落到“米”而不是“度”。
3.2 用Project工具统一坐标:从西安80或WGS84转到CGCS2000
ArcGIS里做坐标转换最常用的工具叫Project,位置在“数据管理工具→投影和变换→要素→投影”。它不是简单改一下坐标系声明,而是根据椭球参数做真正的坐标换算。
在Python窗口里用arcpy执行,逻辑是一样的:
# 把嘉陵江水系shp从原坐标系转到CGCS2000 3度带105E import arcpy in_fc = r"D:\GIS_Data\嘉陵江\水系_原始.shp" out_fc = r"D:\GIS_Data\嘉陵江\水系_CGCS2000.shp" sr = arcpy.SpatialReference("CGCS2000 3 Degree GK CM 105E") arcpy.Project_management(in_fc, out_fc, sr) print("投影转换完成:", out_fc)这里的核心参数是SpatialReference对象,它的字符串名必须和ArcGIS内置坐标系名称完全一致。如果你不确定名字,可以先跑一行arcpy.ListSpatialReferences("*CGCS2000*")看看有哪些可用项。
还有一个容易忽略的点:从西安80转到CGCS2000,严格来说需要七参数转换模型,如果没有控制点参数,ArcGIS默认用零参数做坐标变换,误差在平原地区可能不大,但在山区会有几米偏差。做流域分析和界线勾绘时这个误差还能接受,做确权或者拆迁测量就不够。我通常的做法是:先看原始数据来源,如果是测绘院出的成果,一般prj里已经带了转换方法;如果没有,就直接用默认参数,但要在交付说明里写明坐标转换误差来源。
3.3 用Clip裁剪出嘉陵江干流范围:缓冲边界和“含边”问题
坐标系统一之后,下一步就是把嘉陵江水系裁剪到研究区范围内,而不是用整个长江流域的数据工作。ArcGIS的裁剪工具是“分析工具→提取分析→裁剪”,操作上非常简单,但坑全藏在参数里。
# 用研究区范围裁剪嘉陵江水系shp import arcpy arcpy.Clip_analysis( in_features=r"D:\GIS_Data\嘉陵江\水系_CGCS2000.shp", clip_features=r"D:\GIS_Data\嘉陵江\研究区范围.shp", out_feature_class=r"D:\GIS_Data\嘉陵江\水系_研究区.shp" )Clip_analysis的三个参数分别是:被裁剪的要素、裁剪范围要素、输出要素。我建议在裁剪前先给研究区范围做一个外扩缓冲,一般缓冲100到200米就够了,防止裁剪界线刚好从河流中心穿过,导致河道被切掉一半。裁完后打开属性表,看一眼要素数量是不是符合预期,再叠加一次在线影像底图,确认河流边界没有被硬生生切平。
3.4 用在线影像验证投影是否正确:加载天地图做底图对比
很多人在坐标转换后不知道结果对不对,最直观的办法就是加载在线影像底图来对比。ArcGIS里加载天地图这类在线影像服务做底图,是验证shp位置准确性的常用手段,不需要额外装插件,直接在ArcGIS Pro里添加WMTS或影像服务地址即可。
叠加后如果河流shp和影像上的河道走向基本贴合,说明坐标转换没问题。如果整体偏移但形态一致,多半是转换参数缺了七参数;如果完全不相交,则要回头检查投影是不是选错了带号。我个人的经验是:偏移在10米以内不用太纠结,因为在线影像本身也有定位误差;偏移超过50米就必须重新检查坐标系,不能硬着头皮用,否则后续提取出来的流域面积误差会被正常水文计算放大。
4. 从嘉陵江shp到水文分析可用的DEM:转栅格与汇水区提取
4.1 等高线和高程点shp转DEM:为什么Topo to Raster优先
嘉陵江水系shp包往往不只包含河流和流域边界,还包括等高线、高程点这类地形数据。如果你要做流域分析,下一步就必须把这些矢量地形转成栅格DEM。转换工具有很多,常见的有TIN转栅格、IDW插值和Topo to Raster。
我一般优先用Topo to Raster,因为它是专门为水文分析设计的插值方法,能保留山脊线和河谷线形态,不会像IDW那样把地形平滑成一块块斑驳的色块。
# 等高线+高程点shp一起转30米分辨率DEM import arcpy from arcpy.sa import TopoToRaster arcpy.env.workspace = r"D:\GIS_Data\嘉陵江" arcpy.TopoToRaster( in_features=[ [r"D:\GIS_Data\嘉陵江\等高线.shp", "ELEV", "Contour"], [r"D:\GIS_Data\嘉陵江\高程点.shp", "ELEV", "PointElevation"] ], out_surface_raster=r"D:\GIS_Data\嘉陵江\dem.tif", cell_size=30 )这里in_features是一个二维列表,每个子列表分别指向等高线图层和高程点图层,第二项“ELEV”是存放高程值的字段名,必须和属性表里的字段一致,第三项指定数据类型,Contour代表等高线、PointElevation代表高程点。cell_size设置为30,是因为一般水文分析用30米分辨率已经足够,设太细计算量大且插值噪声明显,设太粗则会丢失河谷细节。
Topo to Raster这个工具对输入数据的要求比较高,等高线必须闭合且不能有自相交,否则工具会报错或者生成明显异常的低洼区。运行前最好先跑一次“检查几何”工具,把长悬挂线和自相交清掉。
4.2 填洼、流向、汇流累积:水文分析三步曲参数怎么调
拿到DEM之后,水文分析是固定三步走:填洼、流向、汇流累积。用ArcGIS的Spatial Analyst扩展模块,可以一次跑完,然后按阈值提取河网:
from arcpy.sa import Fill, FlowDirection, FlowAccumulation, Con dem = r"D:\GIS_Data\嘉陵江\dem.tif" # 1. 填洼:把DEM里的伪洼地填平,避免水流困在坑里 dem_fill = Fill(dem) # 2. 流向:用D8算法计算每个格子的水流方向 flow_dir = FlowDirection(dem_fill) # 3. 汇流累积:统计上游汇入每个格子的栅格数量 flow_acc = FlowAccumulation(flow_dir) # 4. 按阈值提取河网:大于等于1000个格子的位置判定为河道 stream_net = Con(flow_acc >= 1000, 1) stream_net.save(r"D:\GIS_Data\嘉陵江\河网提取.tif")Fill工具默认把所有洼地都填平,参数ZLimit如果不设,意味着不管洼地多深都填。我建议在山区地形中设置一个合理的ZLimit值,比如10米,这样既保留真实地形的小尺度起伏,又不会把喀斯特地区的天然洼地暴力填平。FlowDirection的默认D8算法就是最常用的,参数不用动。FlowAccumulation这一步输出的是累计栅格数,不是面积,所以阈值1000的含义是:要汇入1000个30米栅格才形成河道,折合成面积就是90万平方米,这个阈值在嘉陵江这种山区河流流域里能提取出主河道和主要支流,想提取更细的冲沟就把阈值降到300到500。
提取出的stream_net是栅格,后续要转成矢量线,用StreamToFeature工具结合流向栅格操作,转出来的线shp就可以和原始水系shp做对比,验证提取精度。这里要提醒:如果你手头原始shp里已经有完整的水系网络,提取河网这一步的意义在于反演天然河道,而不是替代原有数据;两者在断面和位置上有差异,正是分析精度的一种检验方法。
4.3 用流域边界shp约束汇水区提取范围
很多人做流域分析时,直接在整个DEM上跑分水岭工具,结果提取出无数个小流域多边形,密密麻麻没法用。正确做法是先把你手里的嘉陵江流域边界shp转成栅格,把它作为掩膜范围,把水文分析限制在研究区内部。
具体操作可以这样:把流域边界shp转成和DEM像元大小一致的栅格,然后用Extract by Mask工具把DEM裁剪到流域内部,再在这个被约束的DEM上做填洼和流向计算。这样提取出来的子流域出口都在边界上,每个多边形都有明确归属,不会逸出边界跑到长江干流里去。
5. 避坑:嘉陵江水系shp使用中最容易翻车的五个问题
5.1 裁剪后要素全丢或者坐标飞到非洲
现象:用Clip裁剪嘉陵江水系shp后,输出要素类里什么都没有,或者河流显示在地球另一侧。
原因:被裁剪shp和裁剪范围shp的坐标系不一致。最常见的是被裁剪数据是CGCS2000投影坐标,而裁剪范围是WGS84地理坐标,ArcGIS不会自动做动态投影,直接按同名坐标叠加,结果就是范围完全对不上。
解决:裁剪前务必让两个图层坐标系一致。用Project把裁剪范围也转到CGCS2000_3_Degree_GK_CM_105E,再重新裁剪。检查时在ArcMap里右键图层→属性→源,看一眼两个图层空间参考名称是否完全相同,这是最省心的预防手段。
5.2 等高线转DEM后出现大片无值区或明显条纹
现象:Topo to Raster生成的DEM有大面积NoData,河流走向处出现平行条带。
原因:等高线shp的边界没有闭合,或者相邻等高线高程字段有负值。山脊线和山谷线附近如果有长悬挂段,插值时会被当作硬边界。条纹则通常是两条等高线距离过近但高程差过大,插值产生锯齿。
解决:先运行“数据管理工具→要素→检查几何”,把几何错误要素导出到错误要素类查看。对存在悬挂线的等高线,用“编辑工具→延长线”或重新数字化处理。如果条纹只出现在局部,可以把cell_size调大到30或50,牺牲一点细节换平滑。
5.3 填洼后整个DEM变成一块黑斑
现象:Fill运行时没有报错,但输出的dem_fill栅格全是黑色,拉伸显示后完全看不到地形。
原因:DEM里存在大量NoData值,最常见的是裁剪后的dem.tif边界处没有值,Fill把边界外所有NoData当成凹陷全部填掉,导致输出值范围被拉伸到极端。
解决:在填洼前先做一步:用“栅格计算器”把DEM里的小于0和NoData统一赋值为DEM最小值减1,然后把边界外的NoData通过Extend或Nibble处理掉。我一般用Con(IsNull(dem), dem.minimum - 1, dem)先把NoData替换成一个明确数值,再跑Fill,这样输出范围就不会爆炸。
5.4 属性表中文乱码、图例文字变问号
现象:打开嘉陵江水系shp的dbf属性表,河流名称字段显示成乱码,或者ArcGIS图例里汉字全变成问号。
原因:dbf文件默认编码和ArcGIS当前环境编码不一致。很多单位拷贝shp时把.cpg文件丢了,而.dbf内部编码是GBK还是UTF-8,ArcGIS只能靠.cpg判断。缺失.cpg时,老版本ArcGIS按系统区域语言读取,新版本按UTF-8读,就翻车了。
解决:先从源数据方拿到cpg文件恢复现场。如果拿不到,可以用文本编辑器打开.dbf前几个字节确认编码,然后重新生成.cpg文件,内容写上“UTF-8”或“ANSI”。在ArcGIS Pro里还可以通过“数据→导出→设置输出编码”转一份UTF-8的新shp,不要直接原地改。
5.5 提取子流域时出现自相交多边形
现象:用Watershed工具提取子流域后,得到的多边形shp拓扑报错,出现自相交或重叠环。
原因:流向栅格边缘存在无效值,导致分水岭边界在DEM边界处自动闭合,形成异常的细长多边形。
解决:在算分水岭之前,先用“边界清理”工具或Extract by Mask把流向范围严格限制在流域边界shp内部,然后确保DEM边界全部有效。提取完之后,跑一次“修复几何”工具,把输出要素的拓扑错误批量修复。这类问题不是工具 bug,而是输入边界和DEM像元对齐的问题,不要迷信新版本能自动解决。
6. 把嘉陵江水系shp做成交付级专题图:符号化、标注和输出
6.1 河流分级显示:按属性字段设置线宽
分析做完,最终是要把shp输出成一张能放进报告里的专题图。嘉陵江水系shp通常带有一个字段标记河流等级,比如“干流”“一级支流”“二级支流”。我一般不用统一线宽,而是按等级设置:干流线宽2.5,一级支流1.8,二级支流1.0,颜色用淡蓝色系从深到浅。ArcGIS里右键图层→属性→符号系统→以分类值渲染,选中河流等级字段,手动调整每档宽度即可。
符号化看起来是小事,实际上整张图的阅读节奏全看这一步。线宽拉不开,图上就一团糊;颜色太深,等高线和流域边界都让路。我的习惯是流域边界用灰黑细线,不填色,只在导出时用透明度填充区别区域;等高线用咖啡色调,压在最底层。
6.2 标注和图例检查:坐标系、比例尺和指北针一个不能少
专题图布局里最容易被忽略的就是图例。很多图例出来之后只显示“河流等级”四个字,却没有坐标系和投影字段。我在交付前有一套固定检查顺序:一看图例里有没有坐标系名称,二看比例尺在布局视图里是不是正确,三看指北针有没有放反,四看等高线标注有没有压到河流。
还有一个经验:ArcGIS图例中如果出现乱码,先不要急着删图例,回到底图图层属性里改标注字体,通常把字体改成宋体或者微软雅黑再刷新图例,乱码就消失了。
6.3 脚本批量出图:用ArcPy把多幅图一次导出
如果研究区分成多个图幅,一个一个手动导出会耽误很多时间。我通常预先整理好mxd或aprx工程,把所有图层都配好符号和标注,然后用一段脚本批量把图导出为300dpi的jpg和pdf两种格式:
# 通过ArcPy导出当前地图文档为JPG和PDF import arcpy mxd_path = r"D:\GIS_Data\嘉陵江\嘉陵江水系专题图.mxd" out_jpg = r"D:\GIS_Data\嘉陵江\出图\嘉陵江水系专题图.jpg" out_pdf = r"D:\GIS_Data\嘉陵江\出图\嘉陵江水系专题图.pdf" mxd = arcpy.mapping.MapDocument(mxd_path) arcpy.mapping.ExportToJPEG(mxd, out_jpg, resolution=300) arcpy.mapping.ExportToPDF(mxd, out_pdf, resolution=300) print("专题图导出完成")这段代码适用于ArcMap 10.x,如果用的是ArcGIS Pro,就把mxd和arcpy.mapping换成arcpy.mp中的ArcGISProject。这里的关键参数是resolution,屏幕上看着清晰不代表打印清晰,输出到纸质图纸用300dpi是底线,400到600更稳。导出后我总会打开jpg放大看一遍河流符号、标注和指北针有没有重叠,确认无误再发出去。
这次嘉陵江水系shp处理,我自己的教训就是:拿到数据第一件事别急着画图,先把四件套检查一遍,再把坐标系统一好,后续所有分析才能不做返工。坐标转换、裁剪、水文提取三步各踩过一次坑之后,现在再处理长江流域其他支流的数据,流程已经基本固定下来了。每个项目的shp来源不同、坐标系五花八门,但检查顺序和参数逻辑是通用的。希望帮到你。
本文还有配套的精品资源,点击获取