简介长江流域鄱阳湖水系地形图数据包涵盖湖区与河流的矢量图层及栅格地形数据并配有一键出图的工程文件既适合熟悉ArcGIS的制图人员直接编辑也为需要该区域基础地理资料的科研学习者提供了即用素材。压缩包共71个文件大小62.91MB除了矢量数据必备的shp、dbf、prj、sbn文件外还包含栅格数据与元数据文件以及jpg、PDF、EPS三种成品图片不同技术背景的使用者都能挑到合适的形式。目前已有2854人浏览学习资源热度较高。数据经过二次整理图层与出图模块分离用户既可自行调整图层样式与范围也可直接查看成品图包内文件按功能归类检索使用较为便捷。考虑到原始图层来源于公开网络并经后期加工精确度需使用者按需核验比较适合教学演示、科研底图或项目前期分析等非商业用途。1. 鄱阳湖水系shp地形图一份能直接进ArcGIS的流域矢量数据做水文分析的人都知道最耗时间的不是算力是数据的清洗和对齐。这份长江流域鄱阳湖水系的地形图shp矢量文件省掉的恰恰是这一步。它把鄱阳湖流域的水系、边界、地形要素按shapefile标准组织好放进ArcGIS里不需要二次配准加载即可用于裁剪、叠加、水文分析、出图标注。对做水利规划、流域分析、环境影响评价的从业者来说这是可以直接落地的底图数据对高校做GIS实验的学生来说它也是理解矢量地形图结构的一个完整样本。值得先说清楚它解决的核心问题很多新手拿到流域数据要么是栅格DEM分不清水系层级要么是KML格式在ArcGIS里坐标乱飞。shp格式的矢量文件本身就是ArcGIS的原生格式属性表、坐标系、几何关系都相对规范。这篇文章我会从加载坐标系讲起把水文分析流程、属性表操作和常见翻车现场都过一遍让你拿到数据后能真正用起来而不是在打开那一刻就卡住。2. 加载与坐标系shp打开乱飞的原因与投影选型2.1 一份完整shp文件的结构与加载流程拿到鄱阳湖水系的shp文件,先别急着双击。shapefile不是单个文件,而是由多个同名不同后缀的文件组成的一组数据。核心是.shp几何信息、.dbf属性表、.shx索引还有配套的.prj投影信息、.cpg字符编码、.sbn/.sbx空间索引等。任何一份能正常使用的shp至少得同时存在前三个。如果你发现只有.shp没有.dbf那属性表是空的缺了.prj坐标系信息丢失后面大概率会乱飞。在ArcGIS中加载的正确操作是打开ArcMap或ArcGIS Pro点击添加数据按钮在目录面板里定位到文件夹选中.shp文件直接拖入或者双击添加。这里有个细节——建议在目录面板中通过连接到文件夹来建立路径不要在我的电脑里直接浏览。原因是ArcGIS对中文路径和空格路径的支持不稳定虽然现在版本改善了很多但连接文件夹的方式能让数据源路径记录更干净后面做地理处理工具链的时候不容易出路径不存在的玄学错误。加载完成后右键图层打开图层属性在源或源信息标签页里检查空间参考。这是诊断一切坐标问题的第一步。如果你看到未知或者一个明显不属于鄱阳湖地区的坐标系那就要先处理投影信息再做后续分析。正常的鄱阳湖流域数据地理坐标系应该是WGS84或CGCS2000经纬度范围大致在北纬24度到30度、东经113度到118度之间。2.2 坐标系识别与投影参数设置shp加载后乱飞十有八九是坐标系定义或投影变换出了问题。鄱阳湖流域横跨江西全省东西跨度不算极端但做面积计算、长度量算、缓冲区分析时必须用投影坐标系不能直接拿WGS84经纬度去量距离。地理坐标系的单位是度算出来的面积是平方度没有实际意义。常见的做法是选用Albers等积圆锥投影。这个投影在中国水文和国土领域用得最多因为它是等积投影面积计算不会失真。针对鄱阳湖流域Albers投影的两条标准纬线可以设置为北纬25度和北纬30度中央经线设置为东经116度大致穿过鄱阳湖中心。在ArcGIS中可以用投影工具选择WGS_1984_Albers或者CGCS2000的对应投影。这里给出一个用ArcGIS Pro工具箱做投影转换的操作路径工具箱 → 数据管理工具 → 投影和变换 → 要素 → 投影 输入数据集: 鄱阳湖水系.shp 输出坐标系: WGS_1984_Albers自定义如果参数需要自定义点击投影坐标系旁边的图标打开新建窗口在坐标系列表里选择投影坐标系 → 双标准纬线等积圆锥手动输入中央经线、两条标准纬线、原点纬度和单位。投影转换不是一劳永逸的——后续叠加其他数据时所有图层必须统一到同一坐标系下否则每次叠加都会提示地理坐标系不匹配。2.3 从地理坐标到投影坐标处理坐标系缺失的脚本如果你的shp文件没有.prj文件ArcGIS加载时会把它当作未知坐标系。这时候不能直接做投影变换系统不知道从哪里变到哪里必须先定义投影。很多人在这一步栽跟头点了投影工具就报错却不明白要先定义投影再投影。两个工具的区别在于——定义投影是给数据补一个身份证投影是修改身份证内容。对于批量的shp文件用ArcPy脚本会更高效。下面是我处理批量的流域shp时惯用的代码import arcpy # 设置工作空间这里使用绝对路径 arcpy.env.workspace rD:\poyang_project\shp_data arcpy.env.overwriteOutput True # 定义投影假设数据是WGS84地理坐标系 # 如果你确定数据是CGCS2000把坐标系替换为arcpy.SpatialReference(CGCS2000) source_prj arcpy.SpatialReference(4326) # WGS84的WKID for shp in arcpy.ListFeatureClasses(): desc arcpy.Describe(shp) if desc.spatialReference.type Unknown: arcpy.DefineProjection_management(shp, source_prj) print(f{shp} 已定义投影为 WGS84) else: print(f{shp} 已有投影: {desc.spatialReference.name}) # 批量投影到Albers等积投影 target_prj arcpy.SpatialReference(WGS_1984_Albers) arcpy.Project_management(水系.shp, 水系_Albers.shp, target_prj)这段代码的逻辑是绕开我到底该选哪个坐标系的纠结先通过Describe工具逐个检查shp的投影状态补上缺失的坐标系定义再做统一的投影变换。WKID 4326是WGS84地理坐标系的通用编号但凡数据集是GPS采集或在线地图下载的大概率是这个。这套流程跑完后所有图层的坐标系就统一了后续水文分析和叠加才站得住。3. 水文分析实战从DEM到河网提取与子流域划分3.1 填洼、流向、汇流累积量的参数设置拿到一份流域矢量地形图如果只用来画图就太浪费了。更常见的需求是从DEM提取河网、划分流域边界或者验证现有shp水系与DEM的吻合度。这里需要ArcGIS的Spatial Analyst扩展模块水文分析工具链的顺序很固定填洼Fill→ 流向Flow Direction→ 汇流累积量Flow Accumulation→ 河网提取 → 栅格转矢量。很多人会跳过填洼直接算流向这是一个高频错误。原始DEM里存在凹陷区域水流会困在里面出不来流向计算出错后续河网就全偏了。填洼工具的Z limit参数默认是空也就是填平所有洼地。对鄱阳湖这种地形相对平缓的区域建议保留默认值但要注意大幅度的填洼会产生大面积平坦区域流向计算时容易出现平行水流这是平缓地形的固有毛病。填洼完成后计算流向ArcGIS默认用D8算法——每个栅格单元的水流只流向邻域中坡度下降最大的一个方向。D8对陡峭地形很好用对平原区域会输出大量平行河网。如果你做的是鄱阳湖平原的水系提取可以考虑用D-Infinity算法在Spatial Analyst工具箱的流向工具里可以设置它允许水流按比例分到两个下坡方向更接近真实水流。汇流累积量的计算就一句话每个栅格积累了多少上游单元的汇水量。这个结果的单位是栅格单元数不是立方米每秒。后续做河网提取时阈值就是在这里确定的——值越大提取出来的河网越稀疏。3.2 河网提取与栅格转矢量shp河网提取使用栅格计算器设定一个汇流累积量的阈值。我处理鄱阳湖水系时对1弧秒约30米分辨率的DEM阈值取5000左右能提取出比较合理的主干河网取1000会得到密集的毛沟适合做精细水文分析。公式如下栅格计算器表达式: Con(FlowAcc 5000, 1)import arcpy from arcpy.sa import * # 启用Spatial Analyst扩展 arcpy.CheckOutExtension(Spatial) dem rD:\poyang_project\dem.tif fill Fill(dem) # 填洼 flow_dir FlowDirection(fill) # D8流向 flow_acc FlowAccumulation(flow_dir) # 汇流累积量 # 提取河网累积量大于5000的栅格赋值为1其余为NoData river_net Con(flow_acc 5000, 1) river_net.save(rD:\poyang_project\river_net.tif) # 栅格河网转矢量 arcpy.StreamToFeature_sa( river_net, flow_dir, rD:\poyang_project\rivers.shp, ALL )StreamToFeature工具的输出直接是shp格式的矢量线文件。这里有个关键参数第四项simplify选择ALL保留所有河网分支如果你只要主干河道改为SIMPLIFY会自动去掉短的伪分支。转换完成后建议加载到ArcMap里对照原始DEM影像检查正常情况下河网应该贴合山谷线如果出现横切山脊的线段说明阈值太小或流向计算有问题。3.3 子流域划分与边界导出河网提取只是第一步做水资源配置或者污染负荷估算时还需要把流域切成若干子流域。这需要先确定流域出水口倾泻点然后用分水岭工具划分。倾泻点可以用鼠标手动创建点要素也可以用河流链接Stream Link工具自动生成——它的原理是把河网按交汇点打断每一段就是一个子流域的出口。手动创建倾泻点时要特别注意点必须落在流向栅格上而不是落在矢量河网上。这又是一个常见的翻车点——用捕捉工具把倾泻点吸附到河网中心线上但河网中心线和流向栅格像素中心不对齐导致分水岭计算报错。正确的做法是使用Snap Pour Point工具它会自动把点移动到累积量最大的栅格单元上。工具箱 → Spatial Analyst → 水文分析 → 分水岭 输入流向栅格: flow_dir 输入倾泻点: pour_points.shp 输出栅格: watershed.tif分水岭工具输出的是栅格转矢量用栅格转面工具即可。转换出来后子流域边界的shp就生成了。这里提醒一个数据质检习惯把子流域shp和原始的DEM加载在一起逐个检查边界是否沿着山脊线延伸。鄱阳湖流域地形起伏不算大平原地区的子流域边界会有些模糊这也是分水岭工具自身的物理限制不是数据错。4. 属性表与字段操作shp最容易被卡住的地方4.1 中文乱码与编码问题shp文件加载后属性表里中文变成问号或者方块这是国内GIS用户的老大难。追根溯源问题出在.dbf文件的编码上。较早版本的ArcGIS默认用GBK读取dbf新版ArcGIS Pro默认按UTF-8读取两个标准对不上就乱码。更麻烦的是有些数据生产单位导出的dbf根本没有写入编码标识ArcGIS只能靠猜。处理顺序从易到难我建议这样第一直接把.dbf文件用支持编码转换的编辑器打开如VS Code或Notepad另存为时选择UTF-8或者反过来存成ANSIGBK看ArcGIS读哪个不乱码。第二在shp同目录下创建一个.cpg文件内容是UTF-8或GBKArcGIS读属性表时会优先参考cpg文件。第三如果前两步还不行用ArcGIS Pro打开数据后在属性表→导出里重新导出一份shp让软件按当前正确解码方式重新生成dbf。下面是cpg文件的写入命令echo UTF-8 D:\poyang_project\水系.cpg这只是个文本文件一行一个编码名不需要扩展属性。注意文件名必须和shp主文件名一致水系.cpg对水系.shp否则不生效。这个文件我习惯在所有交付数据里都放一份能省掉大量后续沟通成本——数据接收方谁也不想花一上午去猜乱码是怎么回事。4.2 字段计算与面积字段更新shp的属性表里通常自带面积或周长字段但十有八九不满足要求。生产单位提供的面积字段来源五花八门有的是手工估算有的是没投影直接用经纬度算的平方度。拿到数据后规范的第一件事就是用ArcGIS的计算几何重新计算面积。前提是数据必须在投影坐标系下。在ArcGIS Pro中右键面积字段选择计算几何属性选面面积单位选平方千米系统自动按当前投影的坐标系计算。如果字段是空的先添加字段用双精度类型打开属性表 → 字段选项 → 添加字段 名称: AREA_SQKM 类型: 双精度然后在字段上右键计算几何。注意点在于计算几何的前提是图层坐标系是投影坐标系。如果你的shp还在WGS84经纬度下计算出来的面积单位是平方度数值会极其离谱。我处理鄱阳湖流域数据时面积结果大约是1.6万平方千米量级的鄱阳湖流域总面积如果算出来是几百度说明你没做第2章的投影步骤。4.3 连接外部表格数据时的类型匹配流域分析经常要把水文站数据、雨量站数据、行政区统计指标挂到shp上最常用的手段是通过连接和关联把Excel或CSV关联到属性表。这个操作不会把数据合并进shp只是建立临时关联导出时需要通过数据→导出要素才能生成包含连接字段的新shp。连接失败的常见原因是两边关联字段的类型不一致。shp的dbf字段里数字分短整型、长整型、浮点型、双精度Excel里看着是数字但读进来可能被识别成文本。解决方案是在Excel里先把关联字段统一为数字格式或者统一为文本格式。另一个坑是shp字段名长度限制在10个字符内这是dbf的老规矩——你用STATION_ID12345这种名字做关联字段数据文件里能存但ArcGIS会截断连接时鬼知道匹配上了没有。我一般会把关联字段名控制在10个字符以内全用大写字母和下划线字段命名为: STATION_NO导入csv数据时使用地理处理→工具→表→添加连接注意保留所有记录这个选项默认是勾选的——它指的是保留shp侧所有要素而连接表里没有匹配的行是不显示的。做关联质量检查时连接前先数一下csv有多少行shp有多少要素连接后在属性表里看有多少行是null两边的差值就是丢配的行数。5. 避坑与常见问题排查shp在ArcGIS里翻车的六个现场5.1 图层加载后要素乱飞跑到非洲去了现象加载shp后缩放到全图要素出现在完全不可能的位置比如鄱阳湖流域的要素显示在非洲西海岸或海洋里。原因shp的坐标系定义和实际数据不匹配。最常见的是数据本身是投影坐标比如Albers但.prj文件丢失或写成了WGS84ArcGIS按错误的坐标系渲染坐标就飘了。还有一种情况是数据是1954年北京坐标系或1980西安坐标系的老数据直接加载到WGS84项目里。解决先右键图层属性→源查看当前解读出来的坐标系。打开数据框属性把显示坐标系切回WGS84地理坐标系然后根据要素实际位置反推。如果位置偏差在几百公里量级多半是投影和地理混用了用定义投影重新赋予正确坐标系就能拉回来。5.2 属性表里中文变问号字段名只剩三个字现象属性表打开后原来应该是流域名称的字段显示成???或者字段名被截断成流域名三个字。原因编码问题叠加dbf字段名10字符限制。中文按UTF-8编码时一个字占3字节10字节上限最多存3个中文字符这是dbf格式的硬限制。乱码则是代码页不对。解决字段名的问题没有完美解只能在源数据里就改成英文短字段名显示别名设为中文。乱码按4.1节的方法用cpg文件指定编码。经验是新建shp时用ArcGIS Pro默认UTF-8导出给老版本ArcMap用户时改存为GBK编码。5.3 面积字段算出来是0或者直接是负数现象计算几何后面积字段全是0或者极小、为负值。原因最常见的是图层是地理坐标系经纬度计算几何默认按经纬度算面积数值小到接近0另一种情况是要素本身存在自相交或严重的几何问题Zero-area的悬挂线、自重叠多边形。解决先用第2章的投影步骤把数据投影到Albers或UTM。投影还是不行就在地理处理→数据管理工具→要素→修复几何跑一遍它会自动重建无效几何。修复后再算面积数值会正常。5.4 水文分析得到的河网横穿山脊现象从DEM提取的河网矢量线叠加到地形图上发现大量线段横穿山脊而不是沿山谷走。原因分三种常见情况。DEM分辨率太粗导致山谷被平滑掉了或者是没做填洼就开始算流向或者是河网提取阈值太小把平面区域沿低洼边缘的伪沟渠也提了出来。解决回到第3章的流程检查是否执行了Fill。如果填洼后还穿脊把河网提取的累积量阈值从1000提高到5000或10000过滤掉细碎的伪河网。仍然有问题就把DEM的分辨率从30米换成12.5米ALOS数据源试试。5.5 导出GeoJSON后字段名丢失或中文变乱码现象把shp转成GeoJSON想交给前端用导出后属性字段要么丢失要么中文名称全部变成\uXXXX转义。原因ArcGIS的要素转JSON工具FeaturesToJSON默认输出Esri JSON不是标准GeoJSON。字段名里包含中文或特殊字符时Esri JSON的编码方式和GeoJSON规范不兼容转换后字段映射错位。解决如果是ArcGIS Pro使用地理处理→转换工具→JSON→要素转GeoJSONFeaturesToGeoJSON这个工具输出的才是标准格式。如果是ArcMap建议借道QGIS做一次中转QGIS对shp的编码兜底能力更好。另外一个通用方案是用ArcPy读一遍shp自己拼GeoJSON下一章给出具体代码。5.6 批处理时提示999999错误脚本中断现象用ArcPy跑批量投影或批量裁剪半路报ERROR 999999: Error executing function没有明确原因。原因999999是ArcGIS的兜底错误码——工具执行失败但没捕获到具体错误。手动操作时重跑一遍就过了批处理时却反复中断通常是输入要素里混进了空几何或坏几何导致某个要素处理时报错。解决在循环里加上try/except把出错要素的OID打印出来单独挑出来修复。我处理鄱阳湖水系的多级子流域shp时就遇到过其中一个面要素几何损坏导致整批导出失败单独修复那一个要素后脚本就顺畅了。批处理脚本里务必加上这个防御逻辑import arcpy, traceback arcpy.env.workspace rD:\poyang_project\shp_data arcpy.env.overwriteOutput True for shp in arcpy.ListFeatureClasses(*subbasin*): out_shp shp.replace(.shp, _fixed.shp) try: arcpy.RepairGeometry_management(shp, out_shp) print(f{shp} 修复完成) except arcpy.ExecuteError: print(f处理失败: {shp}) print(arcpy.GetMessages(2))这段代码对每个子流域shp执行修复几何并把结果输出到新文件出错时不中断循环把错误信息打印出来供逐条排查。批量处理大量shp时这条兜底逻辑能救你于水火——数据源里总有几个文件是残缺的。6. 进阶用法把shp导出为GeoJSON/WKT并批量出图如果你的数据最终要给Web前端展示或者要导入到其他GIS库如PostGIS、Leaflet、Mapboxshp原格式就不够灵活了。搜shp格式矢量数据导出为wkt以及geojson可以用arcgis打开吗的人很多这里给一个通用的ArcPy方案用SearchCursor读取几何直接输出WKT文本格式或GeoJSON。import arcpy, json shp rD:\poyang_project\水系_Albers.shp fields [FID, NAME, SHAPE] features [] with arcpy.da.SearchCursor(shp, fields) as cursor: for row in cursor: fid, name, geom row # WKT导出 wkt geom.WKT # GeoJSON导出 geojson geom.__geo_interface__ features.append({ properties: {FID: fid, NAME: name}, geometry: geojson }) with open(rD:\poyang_project\水系.geojson, w, encodingutf-8) as f: json.dump({type: FeatureCollection, features: features}, f, ensure_asciiFalse)这段代码利用了ArcGIS几何对象自带的__geo_interface__属性可以直接拿到标准GeoJSON格式的几何字典。注意读取字段时SHAPE 这个特殊的字段名表示读取几何对象本身。输出的GeoJSON文件用utf-8编码写入中文属性不会乱码。出图是另一个高频需求。ArcGIS批量出图想插入Excel表格——这其实是两个需求一是批量出图二是在图上加统计表格。批量出图在ArcGIS Pro里用布局和地图系列Map Series功能按子流域shp的每个要素自动生成一页地图然后批量导出PDF。想插入表格的话把Excel数据先关联到shp属性表在布局里插入表格框并绑定属性表字段然后勾选仅显示可见要素。这一步做完每个子流域的图上会自动显示对应的统计数值不必手工逐张改。我做项目的习惯是每次拿到shp数据第一件事永远是复制一份备份然后在副本上做定义投影检查→统一坐标系→修复几何→重算面积字段→导出GeoJSON或WKT验证这一整套流程。这套流程跑完了数据的可信度才算立住了——在那之后做的分析、出的图、交的成果都不会被数据本身有问题这个幽灵缠上。希望这份shp资源的使用经验能帮到你少走我当年走过的弯路。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?