
简介长江流域鄱阳湖水系地形图数据包面向 ArcGIS 使用者及 GIS 入门学习者提供湖泊、河流矢量图层与 DEM 栅格地形图可直接用于流域制图、空间分析或科研底图。压缩包共 71 个文件约 62.91MB包含 shp/dbf/prj/shx 等矢量文件、adf/nit/dat 等栅格数据、mxd 地图文档及 xml 元数据另有已生成的 jpg、pdf、eps 成品图片兼顾可编辑与快速查看需求。资源已吸引 2854 人学习下载。数据包内置 ArcGIS 工程模板打开 mxd 并链接各图层即可一键出图非 GIS 用户也可直接使用出图文件夹中的图片但无法调整区域。图层源自网络搜索并进一步加工准确性需自行评估仅供学习科研使用。1. 鄱阳湖水系 shp 数据拿到手不是终点而是起点搞水利规划、做环境影响评价或者写长江流域相关课题的人大概率都经历过这一步好容易从某处弄到一份“长江流域鄱阳湖水系地形图 shp 矢量文件”双击图层ArcGIS 里确实出来一堆线啊面的但一查属性表全是字母和数字代码图例也不知道对应什么切到布局视图又不知道图框该压多大。这个标题对应的诉求其实很集中这份数据是什么、从哪来、怎么在 ArcGIS 里变成能直接出图和分析的成果。本文按一条完整的使用路径来讲——先解决数据选型和文件自检再解决坐标系和投影然后教你怎么把鄱阳湖的子流域、干支流从一堆要素里提取出来最后集中讲 ArcGIS 打开这类 shp 文件最常见的几个翻车现场。适合手里已经有 shp、但还没跑通整个流程的人。2. 流域地形图 shp 从哪来三类数据源与文件选型标准2.1 开放数据源哪个值得看天地图、科学数据中心与共享库先说实话全国范围内公开可下载的流域级 shp数据粒度差别非常大。你在 ArcGIS 里能不能直接用取决于当初生产这份数据的单位按什么标准画的边界。以鄱阳湖水系为例常见的数据源有三类。第一类是国家级地理信息公共服务平台发布的基础地理数据比如天地图的水系要素。这类数据的优点是位置精度高、坐标系说明清楚通常直接配好了 WGS84 或 CGCS2000 的投影文件。缺点是流域边界不一定按水文分析的结果给你画好更多是按地表水体、河流干流中心线这种方式分层存储适合做底图不适合直接做流域面积统计。第二类是科研数据共享平台。资源环境科学数据中心、国家地球系统科学数据中心这类平台上有大量基于 DEM 提取的流域边界数据很多直接按“长江流域—鄱阳湖水系—五河赣江、抚河、信江、饶河、修水”这种层级组织。这类数据的属性表里通常带流域名称和面积字段是 ArcGIS 做分析最好用的结构。缺点是部分数据发布比较早坐标系可能是北京54或西安80需要你在 ArcGIS 里做投影转换拿到手第一件事是看 prj 文件。第三类是从水文站网、水利普查成果之类渠道拿到的专业数据。这类数据最“真”断面的位置、河道分级都按实际测量来做但覆盖面往往只到某个水文站控制的集水区拼不成整个鄱阳湖水系。而且这类数据很多还带着数据使用协议能不能在报告里公开出图要确认清楚。我的习惯是做宏观展示选第一类或第二类做工程分析、算汇水面积时优先用第二类里基于 SRTM 或 ALOS DEM 提取的版本并在交付文档里写明数据源和提取参数。别上来就迷信“全网最全”的版本shp 数据不是要素越多越好而是坐标系、属性表结构和现势性三项至少占两项。2.2 文件自检三板斧名称、投影、属性表拿到一个文件夹先别急着往 ArcGIS 里拖。shp 不是单个文件而是一组文件的集合。一个完整的 shapefile 至少要包含 .shp几何、.shx索引、.dbf属性表三个基础文件如果带 .prj 说明有坐标系定义带 .sbn/.sbx 说明做过空间索引。如果对方从网盘或者微信群发给你经常会出现只剩一个 .shp 的情况——这在 ArcGIS 里打开会报“无法打开”或要素全空。先做静态检查。在文件夹里把扩展名显示开确认这套文件具备 .shp、.shx、.dbf最好还有 .prj。再看文件命名纯英文或拼音命名的最省心中文命名能用但有时候在 ArcGIS 10.2 及更老版本里会出现图层源路径识别问题。然后打开 dbf 看属性表这一步很关键有明确的流域名称字段比如 NAME、流域名、名称或者英文的 HYRIV_ID、GRDC_ID说明能做属性筛选。只有 FID、Shape、ID、AREA 这种通用字段说明这份数据的属性是“死”的你需要靠空间位置自己去裁。面积字段的单位可能是平方米、平方公里也可能是度后两者你光看数字发现不了问题得结合坐标系判断。另外注意修改时间。同一份“鄱阳湖水系 shp”在网上流传通常不止一个版本以 2010 年前后的水利普查成果和近几年的 DEM 提取成果差异最大水体边界变化明显。选择时优先看数据文档里的生产日期。2.3 用 Python 一分钟摸清 shp 的家底直接用 ArcGIS 打开自然也行但如果手里有十几份备选数据我更习惯先用 Python 把每个 shp 的元信息扫一遍再决定哪个值得加载。用开源的shapefile库pyshp就能干这件事不需要启动 ArcGIS 的许可证。import shapefile sf_path poyang_lake_basin/poyang_basin.shp sf shapefile.Reader(sf_path, encodingutf-8) # 拿到空间范围判断图层位置是否在鄱阳湖附近 bbox sf.bbox print(要素范围:, bbox) # 拿到坐标系描述 print(投影描述:) for proj_record in sf.__geo_interface__.get(projection, 无): pass # 扫描全部属性字段看有没有名称类字段 fields [(fname, ftype) for fname, ftype, *_ in sf.fields[1:]] print(字段列表:, fields) # 读取前三条记录确认属性表有没有有效文本 for record in sf.records()[:3]: print(record.as_dict())这段代码做三件事。sf.bbox返回的是图层的四至范围鄱阳湖流域大致在四至[东经113.5, 北纬28.2, 东经118.5, 北纬30.0]附近如果打印出来的范围是[-180, -90, 180, 90]说明几何数据是经纬度且看起来合理如果跳出个[4000000, ...]这种大数坐标说明用的是投影坐标不是坏了是还没转换。字段列表决定你后面能不能用属性筛选。前三条记录则能直接看出河流名称字段存的是“赣江”还是“Ganjiang”这影响你查询时用中文还是用拼音。参数说明很简单encodingutf-8是绝大多数新数据的编码方式如果属性表中文乱码改成encodinggbk再读一次。注意 pyshp 只负责读几何和属性不负责画图所以这一步只做侦查后续分析和出图仍然要进 ArcGIS。3. ArcGIS 打开与坐标系处理为什么图层“飞”到海里了3.1 打开前的目录环境准备和图层加载ArcGIS 打开 shp 本身没什么技术含量但很多人第一步就把自己坑了直接把 shp 从桌面或者网盘目录拖进 ArcMap路径里带中文和空格尤其是文件夹名字叫“新建文件夹2”这种。ArcGIS 对路径里的非 ASCII 字符很敏感轻则图层加载慢重则直接说“Failed to open feature class”。我一般会先把数据统一放到一个纯英文路径的工作目录下比如D:\GIS_Work\PoyangBasin\shp目录名、文件名都保持英文或拼音确认没有特殊符号。然后打开 ArcCatalog 或 ArcMap 的 Catalog 窗口从目录树里找到这个文件夹右键刷新再拖到内容列表。如果你打开的是 ArcGIS Pro路径问题少一些但依然建议保持同样习惯。这一步不解决后面所有工具都可能报错而且报错信息往往跟真正的原因完全不相关纯属玄学问题。加载之后先做两件事第一查看图层的属性表确认要素数量和 dbf 里看到的一致第二右键图层打开“属性→源”看“空间参考”这一栏写的是什么。如果“空间参考”下面写着Unknown说明这份 shp 没有带投影信息它是你后面一系列问题的源头。3.2 坐标系先识别再转换动态投影和真正的转换ArcGIS 有一个机制叫动态投影当数据框坐标系和图层坐标系不一致时ArcGIS 会在地图上“临时”把图层画到正确位置但它没有改变数据本身的坐标系。这意味着你在 ArcMap 里看着图层位置是对的但用工具量测面积或者做缓冲区分析结果可能是错的因为底层的几何还是原来的坐标系在参与计算。鄱阳湖水系数据常见的坐标系有三种WGS84 地理坐标系经纬度单位是度、CGCS2000 地理坐标系、以及西安80或北京54的高斯投影坐标系单位是米。判断方法是看 _prj 文件里的文字或者看属性表里面积字段的量级。如果看到的长整型坐标值是 7 位数以上那基本是高斯投影如果是 5 到 6 位小数就是地理坐标。如果你的数据是地理坐标系但你想做面积统计得先转换成投影坐标系。反过来如果你的数据是西安80而你现在用的标准是 CGCS2000也得做转换。这里要分清两个工具“定义投影Define Projection”是给没有投影信息的数据“贴标签”它不会改变坐标数值。“投影Project”才是真正的坐标变换会把经纬度换算成平面坐标或者从西安80换算到 CGCS2000。不要在“定义投影”这一步选错坐标系。假设你的数据实际是 WGS84却被人误定义了 CGCS2000转换后整个图层会偏移上百米。这个错了后面所有叠加分析全部报废。3.3 用 Project 转 CGCS2000 投影坐标arcpy 一条龙手工操作时打开 ArcToolbox → 数据管理工具 → 投影和变换 → 要素 → 投影输入图层选择输出坐标系。鄱阳湖主体在 E115°30′—117°用 CGCS2000 高斯克吕格投影三度带时中央经线 117°带号 39代码类似CGCS2000_3_Degree_GK_Zone_39。如果数据跨带更稳妥的方案是用 Albers 等积投影按长江流域的常用参数设置两条标准纬线。投影选等积还是等角取决于用途算面积用等积做导航和显示用等角。如果要批处理多份 shp用 arcpy 写一个循环最省事import arcpy # 输入输出目录 in_dir rD:\GIS_Work\PoyangBasin\shp out_dir rD:\GIS_Work\PoyangBasin\shp_prj out_coor arcpy.SpatialReference(CGCS2000 3 Degree GK Zone 39) arcpy.env.workspace in_dir arcpy.env.overwriteOutput True for shp in arcpy.ListFeatureClasses(*.shp): out_path out_dir \\ shp.replace(.shp, _prj.shp) print(正在转换:, shp) arcpy.Project_management(shp, out_path, out_coor)这段脚本做的事遍历输入目录下所有 shp逐个转换到 CGCS2000 三度带投影坐标系。arcpy.env.overwriteOutput True允许覆盖同名输出文件避免二次运行时中断。arcpy.SpatialReference通过名称直接实例化坐标系比手动填 WKT 更不容易错。运行完成后再加载输出图层用“测量”工具拉一条赣江的长度和原数据对比如果数值合理单位是米说明坐标系转换这一步通过了。注意如果你的原始数据已经是 CGCS2000 地理坐标系这个脚本同样适用ArcGIS 的投影工具会自动完成从地理坐标到投影坐标的换算。4. 按水系与行政区划提取鄱阳湖子集属性查询与按位置提取4.1 属性表里有什么学会看字段再用查询一份按流域组织的 shp属性表里通常带有流域名称、河流级别、面积等字段。但不同生产单位字段命名差异极大有的叫NAME有的叫CNAME有的干脆是HYRIV_ID这种全球河网编码。在写任何查询条件之前先花两分钟把字段过一遍。用上一步的 pyshp 或者直接在 ArcGIS 里打开属性表看所有字段的类型。需要重点关注三类字段文本型名称字段比如河流名称、湖泊名称后面做 SQL 查询要用。数值型面积字段注意单位是平方米还是平方公里后边出图写注记时要换算。编码型字段比如一级支流代码、是否入湖等这类字段往往和数据库设计文档配套。如果字段是OBJECTID、Shape_Length这种系统自动生成的说明这份数据的属性信息很少你需要靠空间位置去提取那就走按位置选择的路线。如果字段里有流域编码但没有对照表先别急很多数据集把编码规则写在配套的说明文档里一般是一级流域代码二级水系代码河段序号的组合按前缀筛选就能把鄱阳湖水系从长江流域数据里分出来。4.2 按名称和代码提取鄱阳湖子流域假设你的数据是全国河流网或整个长江流域要提取鄱阳湖水系最直接的办法就是属性查询。在 ArcMap 里打开图层属性表点“表选项→按属性选择”输入类似NAME LIKE %鄱阳% OR NAME LIKE %赣江% OR NAME LIKE %信江%这样的条件。但这里面有个细节如果名称字段分得很细河水是一条一条编码而不是挂在大流域名下那按名称筛选只能筛出名字里带“赣江”的河段支流比如贡水、章水就漏掉了。更完整的方式是按流域代码前缀筛选。如果你有代码规则可以直接在 Python 窗口里跑一段 arcpy 查询把结果导出为新的 shpimport arcpy source rD:\GIS_Work\PoyangBasin\shp_prj\river_network_prj.shp out_feature rD:\GIS_Work\PoyangBasin\output\poyang_rivers.shp # 按流域代码前缀筛选这里假设代码以 P 或 42 开头是鄱阳湖水系 # 具体规则以你的数据说明文档为准 sql_clause CODE LIKE 42% OR NAME LIKE %鄱阳% OR NAME LIKE %赣江% arcpy.Select_analysis(source, out_feature, sql_clause) print(输出要素数:, arcpy.GetCount_management(out_feature).getOutput(0))Select_analysis是要素筛选工具它输出一个新的要素类不改动原始 shp。sql_clause里的%是通配符LIKE用于文本模糊匹配字段名和字段内容如果是中文注意确保属性表编码是 GBK 或 UTF-8否则查询结果为空。选完以后别急着走打开导出图层的属性表手动抽查几条不在筛选词里的河流确认它们是不是也属于鄱阳湖水系防止漏选。按名称筛选后你会发现一个问题赣江、抚河、信江、饶河、修水这些主要支流都选出来了但湖体本身没有面要素。这时需要把湖泊面数据也加载进来在属性表里查找鄱阳湖主体。如果数据是分开的后续要合并成一个图层做制图综合可以用“合并”工具。如果只是要一张示意图把两个图层叠加显示就够了。4.3 按位置提取与 DEM 一致性检查属性查询搞不定的情况就要用按位置选择Select by Location。比如你的 shp 是某个县界内的所有河网要得到鄱阳湖流域范围内的那部分就先加载鄱阳湖流域边界面要素然后用“按位置选择”从河网图层里挑出“与面要素相交”的线。操作路径选择菜单→按位置选择源图层选流域边界目标图层选河网方法选“相交”。选中后右键目标图层→数据→导出数据选“所选要素”导出路径放在项目目录下。这里有一个常见误区用“与面相交”选出来的河段可能包含了刚好擦过边界一点点的邻域河流。做分析时建议用“与面相交的折点”或者“完全位于面内”这两个选项后者更严格但可能漏选边界上的河段。折中方案是先按“相交”选然后人工检查边界位置。另外如果你手里有 DEM 数据可以做一次快速的河网一致性检查。用 ArcGIS 的水文分析工具填洼→流向→流量从 DEM 提取河网与你手里的 shp 叠加对比。正常情况下两条河网的大走向一致如果明显偏出一个河道的距离说明这份 shp 有配准误差后面做距离量测和缓冲分析时要把这个误差量记在报告里。水文分析工具跑起来不慢但这种检查只适合小范围比如选鄱阳湖的某一个子流域来做全流域跑一次 DEM 水文分析对很多人来说机器可能扛不住。5. ArcGIS 使用 shp 的避坑记录投影错乱、字段截断与数据损坏5.1 图层位置飞到非洲现象加载 shp 后图层显示在地图窗口右下角或赤道附近缩放全图后看不到任何要素。原因绝大部分是数据没有定义坐标系ArcGIS 拿默认的地理坐标系去加载把原本是投影坐标的数字当成经纬度解析位置就跑到几内亚湾去了。解决右键图层→属性→源→空间参考如果显示未知用“定义投影”工具把正确的坐标系贴上去。关键点这里的“正确”必须是数据生产时的原始坐标系不能是你想转成的目标坐标系。确定方式打开 _prj 文件看文字没有 _prj 就只能靠坐标量级猜——7 位数且开头是 3比如 3,XXXXXX多半是高斯投影5 位数且带小数点是经纬度。吃不准的时候拿一个已知的水文站坐标去对比。5.2 汉字字段名和字段值被截断现象属性表里原本应该显示“流域名称”的地方乱码或者字段名在 ArcGIS 里只显示前 3 个汉字后面全没了。原因shapefile 的 dbf 结构从 dBASE III 时代继承下来字段名最多 10 个字节中文在 GBK 编码下每个汉字占 2 字节所以只能容纳 3 个汉字。字段值是另一回事如果超过 254 字节也可能被截断。解决字段名没办法除非重建属性表。字段内容乱码则改数据源编码——在 ArcCatalog 中右键 shp→属性→源尝试切换编码为 UTF-8 或 GBK。别急着骂数据质量差很常见的数据源本身是 GBK 编码而你在 ArcGIS Pro 里默认按 UTF-8 读取显示乱码反过来操作就正常了。5.3 计算出来面积是“亿”级别单位没看现象用几何计算算面积结果数值大得离谱一张流域图算出几亿面积单位明显不对。原因坐标系是地理坐标系度在未投影的状态下直接计算面积ArcGIS 会按度做近似计算结果没有物理意义。还有一种可能是面积字段本身是平方度。解决在“计算几何”对话框里选择“使用数据源的坐标系”如果数据源是地理坐标面积单位一定不要选平方米先转成投影坐标系再算。这是个老生常谈的坑但几乎每年都有新用户踩进去。5.4 dwg 转 shp 后线断成段现象把 CAD 的地形图 dwg 转成 shp水文线条断成一截一截一条河流变成几百段后续提取很不方便。原因CAD 里的多段线在转换时遇到属性表中的断点、不同的图层、或者闭合点和悬挂点会自动断开而河流数据是按图幅分块的接边处本来就是断开的。解决转换后在 ArcGIS 里用“编辑→合并”手工合并是下策常见做法是在转之前用 CAD 的 PEDIT 命令把多段线连接好已经转完的用“融合”工具按河流名称字段融合再把融合结果转成单部件要素。这里要注意融合后的要素可能继承的是“属性字段相同的线段合并”如果属性字段全是 0所有线段会糊成一条操作前先备份。5.5 拷到优盘或网盘后打不开现象在同事电脑上正常打开的 shp压缩包发过来后完全加载不出来报错说文件不是有效的要素类。原因shp 是分件存储拷贝时只复制了 .shp 或 .dbf缺了 .shx 和 .prj。网盘微信传文件常常只传主文件或者系统隐藏了扩展名你自己都不知道缺了件。解决传输前用 WinRAR 或 7-Zip 把整个 shp 图层做成压缩包不要单独传单个文件。收到压缩包后解压确认扩展名齐全再导入。如果你的组织有共享数据库更好的办法是把关键图层导入到文件地理数据库File Geodatabase里单文件管理不存在缺件问题。6. 让这份数据真正有用出图、格式转换与后续维护6.1 从 shp 到出图先把图例和注记调透数据在 ArcGIS 里能正确显示了不等于能交给别人直接用。如果你要出流域示意图在布局视图里至少把三件事做对一是图例河流按等级分级配色鄱阳湖主体用浅蓝填充子流域边界用淡色线划出二是比例尺投影坐标系下比例尺有意义地理坐标系直接摆比例尺容易闹笑话三是注记赣江、抚河这些名字用标注转注记避免换电脑后字体乱掉。出图前用“检查几何”工具跑一遍数据把自相交和空几何标记出来。这一步能发现很多肉眼看不出来的问题尤其是从 CAD 转过来的河网。检查结果里有错的先修复再出图否则交付后返工更麻烦。6.2 转成 WKT、txt 或 3DTiles 给其他管线用shp 在 ArcGIS 生态里很好用但出了这个生态就有点孤立。做 Web 开发或者给别的平台用常见做法是转 JSON/WKT。ArcGIS Pro 自带“要素转 JSON”工具可以把 shp 转成 GeoJSON 格式如果你要的是纯 WKT 文本用 pyshp 读几何后调用shapely转import shapefile from shapely.geometry import shape from shapely import wkt sf_path rD:\GIS_Work\PoyangBasin\output\poyang_rivers.shp out_path rD:\GIS_Work\PoyangBasin\output\poyang_rivers_wkt.txt sf shapefile.Reader(sf_path, encodingutf-8) wkt_lines [] for sr in sf.shapeRecords(): geom shape(sr.shape) wkt_lines.append(wkt.dumps(geom)) with open(out_path, w, encodingutf-8) as f: f.write(\n.join(wkt_lines))这里shape(sr.shape)把 pyshp 读入的几何对象转换成 shapely 的几何对象再wkt.dumps输出为标准 WKT 文本。每行一条记录的几何。如果你的数据量很大上百万条要素建议不要一次性写入文本改用流式逐行写入避免内存耗尽。转 3DTiles 也有现成路线。ArcGIS Pro 可以发布场景服务再用转换工具切片或者用开源工具把 shp 转成 glTF 再合并成 3DTiles适合做三维流域展示。但注意3DTiles 的转换涉及 LOD 分层河流这种线要素在高层级下如果没做简化瓦片会非常碎转换时间极长通常先做“简化线”处理再切。6.3 数据验证清单和长期维护习惯现在把整套流程串起来我每次处理完一份流域 shp 会按固定清单检查一遍四至范围是否正确坐标系是地理坐标还是投影坐标面积字段单位明确属性表名称字段无乱码图层叠加后和天地图底图无明显偏移。以上五项全部通过数据才算“能用”。长期维护也是一件事。shp 适合做交换格式不适合做日常编辑的源数据。我一般会把清洗好的鄱阳湖水系要素导入到文件地理数据库里建好字段别名和域后续所有分析都基于这个库只有对外交付时才导出 shp 压缩包。这样避免一个问题反复在 shp 上编辑dbf 的字段结构越搞越乱最后连字段类型都对不上。这套习惯是我踩过几次坑之后才养成的尤其是有一次把成果直接存在 shp 上连续编辑一周后发现 dbf 里的中文全散架最后只能返工重提。希望对你有帮助做完记得跑一遍验证清单再交给下一个人。本文还有配套的精品资源点击获取