简介:长江流域鄱阳湖水系地形图数据包,面向 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, encoding="utf-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”,这影响你查询时用中文还是用拼音。
参数说明很简单:encoding="utf-8"是绝大多数新数据的编码方式,如果属性表中文乱码,改成encoding="gbk"再读一次。注意 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 = r"D:\GIS_Work\PoyangBasin\shp" out_dir = r"D:\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 查询,把结果导出为新的 shp:
import arcpy source = r"D:\GIS_Work\PoyangBasin\shp_prj\river_network_prj.shp" out_feature = r"D:\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 = r"D:\GIS_Work\PoyangBasin\output\poyang_rivers.shp" out_path = r"D:\GIS_Work\PoyangBasin\output\poyang_rivers_wkt.txt" sf = shapefile.Reader(sf_path, encoding="utf-8") wkt_lines = [] for sr in sf.shapeRecords(): geom = shape(sr.shape) wkt_lines.append(wkt.dumps(geom)) with open(out_path, "w", encoding="utf-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 里的中文全散架,最后只能返工重提。希望对你有帮助,做完记得跑一遍验证清单再交给下一个人。
本文还有配套的精品资源,点击获取