ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ArcGIS中嘉陵江水系shp处理全流程:坐标系转换到水文分析

ArcGIS中嘉陵江水系shp处理全流程:坐标系转换到水文分析 简介面向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能不能正确识别坐标系。如果你收到的数据里没有.prjArcGIS会默认按未知坐标系加载这时候你看到的河流可能出现在地图上任意位置叠加天地图后完全对不上这就是后面要讲的经典翻车现场。我一般在拿到数据的第一个动作不是急着拖进ArcMap而是先开一个文件夹窗口看文件清单。如果只有.shp一个文件我会先让同事把完整四件套发来因为后期补坐标系是纯玄学活猜错了整个分析都要推翻重来。2.2 加载操作与图层面板判断三步确认加载成功ArcMap和ArcGIS Pro加载shp的路径不太一样但核心操作是同一套思路。最常见的方式是打开ArcMap在Catalog面板里定位到shp所在目录直接把目标文件拖进内容列表或者在ArcGIS Pro里打开“添加数据”按钮浏览到shp文件双击即可。加载成功后内容列表里会出现一个要素图层双击图层打开图层属性能看到“源”选项卡里列出数据的完整路径、坐标系、要素类型。这一步很多人跳过但我建议每次必须做——确认要素类型是点、线还是面直接决定后面能不能做水文分析的填洼和流向计算。如果你想用脚本来确认加载环境可以在ArcGIS的Python窗口里跑这段# 在ArcMap或ArcGIS Pro的Python窗口里直接执行 import arcpy shp rD:\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_1984WGS84地理坐标系度GCS_China_Geodetic_Coordinate_System_2000CGCS2000地理坐标系度CGCS2000_3_Degree_GK_CM_105ECGCS2000高斯克吕格投影中央经线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转到CGCS2000ArcGIS里做坐标转换最常用的工具叫Project位置在“数据管理工具→投影和变换→要素→投影”。它不是简单改一下坐标系声明而是根据椭球参数做真正的坐标换算。在Python窗口里用arcpy执行逻辑是一样的# 把嘉陵江水系shp从原坐标系转到CGCS2000 3度带105E import arcpy in_fc rD:\GIS_Data\嘉陵江\水系_原始.shp out_fc rD:\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_featuresrD:\GIS_Data\嘉陵江\水系_CGCS2000.shp, clip_featuresrD:\GIS_Data\嘉陵江\研究区范围.shp, out_feature_classrD:\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 rD:\GIS_Data\嘉陵江 arcpy.TopoToRaster( in_features[ [rD:\GIS_Data\嘉陵江\等高线.shp, ELEV, Contour], [rD:\GIS_Data\嘉陵江\高程点.shp, ELEV, PointElevation] ], out_surface_rasterrD:\GIS_Data\嘉陵江\dem.tif, cell_size30 )这里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 rD:\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(rD:\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-8ArcGIS只能靠.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 rD:\GIS_Data\嘉陵江\嘉陵江水系专题图.mxd out_jpg rD:\GIS_Data\嘉陵江\出图\嘉陵江水系专题图.jpg out_pdf rD:\GIS_Data\嘉陵江\出图\嘉陵江水系专题图.pdf mxd arcpy.mapping.MapDocument(mxd_path) arcpy.mapping.ExportToJPEG(mxd, out_jpg, resolution300) arcpy.mapping.ExportToPDF(mxd, out_pdf, resolution300) print(专题图导出完成)这段代码适用于ArcMap 10.x如果用的是ArcGIS Pro就把mxd和arcpy.mapping换成arcpy.mp中的ArcGISProject。这里的关键参数是resolution屏幕上看着清晰不代表打印清晰输出到纸质图纸用300dpi是底线400到600更稳。导出后我总会打开jpg放大看一遍河流符号、标注和指北针有没有重叠确认无误再发出去。这次嘉陵江水系shp处理我自己的教训就是拿到数据第一件事别急着画图先把四件套检查一遍再把坐标系统一好后续所有分析才能不做返工。坐标转换、裁剪、水文提取三步各踩过一次坑之后现在再处理长江流域其他支流的数据流程已经基本固定下来了。每个项目的shp来源不同、坐标系五花八门但检查顺序和参数逻辑是通用的。希望帮到你。本文还有配套的精品资源点击获取
返回列表