
简介辽宁省一级流域、二级流域矢量图层shp数据是一套用于ArcMap等GIS平台的省级水系基础地理数据适合GIS从业者、规划测绘人员及高校地理专业学生开展流域分析、制图与教学。压缩包共15个文件主要包括一级流域和二级流域两套shp矢量图层配套dbf属性表、prj投影定义、sbn/sbx空间索引、shx几何索引及xml元数据文件另附mxd地图工程便于直接加载查看。数据按WA黑龙江流域、WB辽河流域、WC海河流域、WM海岸线划分一级分区二级水系细分为松花江水系、辽河干流水系、大凌河水系及辽东沿海诸河系、辽东半岛诸河系、鸭绿江水系、滦河水系等字段清晰、边界完整可支撑水文统计、流域对比、专题图制作等场景。已有52人学习下载资源体积约9.43MB可满足区域水资源研究、流域规划与课堂演示等多种需求。1. 辽宁省一级、二级流域shp数据先把底图摸清再谈水文分析做辽宁省的水文类项目最耗时间的往往不是算法而是底图。我去年接河湖健康评价的活儿甲方只提供行政边界一级、二级流域全得自己勾工具没少用精度却没底。后来改换现成的辽宁省一级流域、二级流域矢量shp包加载进ArcMap按级别字段就能出专题图。这篇记录是把这份数据拆开看的实战笔记覆盖包内文件结构、坐标系识别、按流域提取和质检避坑适合做水资源调查、环评、河长制一张图的从业者参考。2. 数据拆包shp伴生文件、坐标系与属性字段的识别2.1 shp不是单文件.shp/.shx/.dbf/.prj 缺一不可shp是Esri定义的矢量数据格式看起来是一个文件实际靠多个同名文件协同工作。.shp存几何坐标.shx是几何索引.dbf是属性表.prj记录坐标系。很多人把shp理解成“一个文件”传素材时只发了个.shp对方加载就报错这种事在项目群里几乎每周都见。文件后缀作用缺失后果.shp存储要素几何无法加载.shx几何位置索引打开异常或卡死.dbf属性数据表图层无属性.prj坐标系定义坐标系显示未知.sbn/.sbx空间索引可选检索速度变慢我拿到素材的第一件事是在文件夹里按名称排序看同一主名的文件是否齐全。常见做法是右键压缩包先解压到本地目录别直接在压缩软件里双击预览那会只读到部分文件。微信或钉钉传文件时文件名被改名、后缀被剥最常丢的就是.prj和.dbf。所以规范做法是整包打成zip再发收件人解压后放进英文路径再进ArcMap加载。2.2 坐标系判断与统一WGS84、CGCS2000 和动态投影的差异没有.prj的shp就是“裸奔”数据坐标系未知叠加时错位是必然的。ArcMap有动态投影能把不同坐标系的图层显示在一起但这是“显示层面的对齐”一旦导出、量算、做拓扑分析原坐标系的差异就会暴露。我遇到过一个案例两个图层一个是GCS_WGS_1984经纬度另一个是CGCS2000高斯投影地图缩得小看不出来放大到1:1万边界错开五六十米数据在空间连接时大量漏匹配。判断方法很直接内容列表里右键图层 → 属性 → 源 → 在“数据源”里查看“坐标系”那行。如果是“未知”就用ArcToolbox → 数据管理工具 → 投影和变换 → 定义投影手动指定正确的坐标系。注意定义投影只是给数据“补身份证”不等于把坐标转成正确位置除非你对原始坐标系有把握否则别乱选。辽宁省经度范围大致在118.8°E到125.8°E之间跨两个3度分带日常做省级专题图我一般建议统一到CGCS2000。小范围图用CGCS2000_3_Degree_GK_CM_120E全省范围用Albers等积圆锥投影中央经线取122°E双标准纬线取40°N与44°N左右这样面积量算和变形控制都比较稳。等积投影对流域面积统计友好因为面积指标最怕投影变形失真。提示拿到数据先查.prj再决定要不要投影。发现两个图层叠不齐先看坐标系别急着用“空间校正”硬调方向错了越调越乱。2.3 属性字段读法流域编码、级别和面积先对齐打开属性表的方式不赘述重点看几个最常见的字段。这份shp打包后通常会有要素编号、流域名称、级别、编码、面积之类的字段实际字段名以你拿到的数据为准但读法逻辑是共通的。字段名常见字段类型说明OBJECTIDLong要素唯一编号NAMEText流域名称如辽河、浑河GB_CODEText流域编码层级靠前缀体现LEVELShort/Long1代表一级流域2代表二级Shape_LengthDouble边界长度单位随坐标系变化Shape_AreaDouble面积单位必须核实拿到属性表后先做两个核对。第一统计一级流域有几条记录、二级流域有几条再看编码前缀是否体现父级关系比如二级编码前两位是不是对应某个一级编码。第二右键Shape_Area字段选“统计”看总和数值的量级。辽宁省陆域面积约14.8万平方千米一级流域面积加起来应该接近这个数。如果统计出来是几十亿甚至几千亿那基本可以断定单位是平方米或者平方度不是平方千米。这条逻辑在后续面积计算和专题图指标里都会用到先对清楚能少走弯路。3. 在ArcMap里落地加载、提取、批量导出与DEM校验3.1 加载与符号化按级别字段分层显示在ArcMap里添加数据选中解压后的.shp加载。第一次加载时如果全部要素堆在一起看不清层级建议右键图层 → 属性 → 符号系统 → 类别 → 选择级别字段然后手工调颜色。一级流域要素少可以压重色粗边线二级流域要素多用小流域填充色配浅色边线。这么做的目的是让视觉重心先落在二级流域的分布上再通过一级流域的边界线框出大格局。如果图层加载后拖动明显卡顿先别急着怪电脑。打开图层属性在“常规”里取消“自动缩放”相关选项同时确认当前显示范围是否包含了无关的大范围要素必要时直接缩放到图层范围再操作。做项目时我习惯先把数据复制到本地gdb里再开工shp文件在网络上频繁读取会出现响应慢甚至“无法获取扩展属性”的报错这一点在多人协作时尤其明显。3.2 按流域提取属性查询表达式与导出设置场景很常见只需要辽河流域及其二级支流其他区域先不管。在ArcMap中打开“按属性选择”构造一个查询表达式。以编码字段GB_CODE为例若二级编码前两位对应一级流域想取出某个一级流域下所有二级子流域表达式这样写GB_CODE LIKE 04%这条表达式的意思是取所有编码以04开头的要素。LIKE配合%通配符做前缀匹配比直接用等于号更保险因为二级子流域的编码往往是多位数字前缀相同就意味着同属一个一级流域。如果不用编码用名称模糊匹配也行但中文字段在部分ArcMap版本里对LIKE的响应不稳定建议先确认字段值没有空格再执行。查询后右键图层 → 数据 → 导出数据在导出对话框里选择“所选要素”保存类型选“要素类”或shp。导出时注意“坐标系”那栏选择“数据框的坐标系”可以顺带完成投影转换省去再跑一次Project工具。3.3 批量导出用ArcPy循环、字段名转义和名称模糊匹配一次只要一个流域手工操作没问题要把十几个二级流域逐个导出成独立图层手工点鼠标就太折磨人了。我一般直接用ArcPy脚本在ArcMap的Python窗口或外部IDE里跑import arcpy, os src rE:\data\liaoning_watershed.shp out_gdb rE:\data\out.gdb arcpy.env.workspace out_gdb arcpy.env.overwriteOutput True levels [1, 2] for lv in levels: out_fc fbasin_level_{lv} sql fLEVEL {lv} arcpy.Select_analysis(src, os.path.join(out_gdb, out_fc), sql) count arcpy.GetCount_management(os.path.join(out_gdb, out_fc))[0] print(flevel {lv}: {count} features)这段脚本遍历级别1和级别2分别用Select_analysis筛选并输出到gdb。注意数值型字段的SQL不需要加引号直接写LEVEL 1。为什么不用LIKE因为这里筛选的是明确的级别值等值判断最快最稳也避免中文和通配符可能带来的编码问题。如果要做按名称批量导出比如把几个重点流域一次性拆出来脚本换成这样names [辽河, 浑河, 太子河] field arcpy.AddFieldDelimiters(src, NAME) for name in names: sql f{field} LIKE %{name}% out_fc arcpy.ValidateTableName(name, out_gdb) arcpy.Select_analysis(src, os.path.join(out_gdb, out_fc), sql)这里用arcpy.AddFieldDelimiters给字段名加限定符兼容gdb、shp等不同数据源对字段名的引用规则避免SQL语法在不同格式间翻车。ValidateTableName用来预防中文字段名在gdb里生成非法名称这个函数会自动替换空格和特殊字符。3.4 和DEM叠加校验用分水岭或山脊线反查边界合理性流域线对不对最靠谱的验证方式是把shp和DEM提取的分水线叠在一起看。方法不复杂在Arctoolbox里用Spatial Analyst的填洼Fill、流向Flow Direction、分水岭Watershed再把分水岭结果转成多边形叠加到二级流域shp上。如果两者边界贴合度高说明数据可信如果某条边界穿进了河谷而不是沿山脊走基本可以判断这个流域的勾绘尺度偏粗。实际操作时不一定要跑全套水文分析快速做法是用坡度图目视检查。流域边界理论上应落在山脊线上山脊线的特征是坡度由陡变缓的转折带在坡度渲染图上会有明显的纹理分界。打开坡度图把shp流域边界设为半透明肉眼扫一遍即可。这一步虽然“土”但对判断数据边界是否合理非常有效。我见过有人把轻微错位当成坐标系问题反复投影其实只是数据源精度限制检查方法和结论预期先对齐能省下大半天。4. 避坑记录流域shp最常见的五类翻车现场4.1 加载后一片空白属性表有记录但图形不显示现象图层加进来了属性表里有几十条记录但地图窗口里什么都没有缩放至图层也没反应。原因90%的情况是坐标系缺失ArcMap对未知坐标系的shp无法正确计算显示范围剩下10%是数据本身被存成了XY表或几何类型异常图形数据没有真正写入。解决先右键图层 → 属性 → 源确认坐标系那一栏是“未知”。如果是未知先用定义投影工具指定正确坐标系再缩放至图层。如果指定后仍然空白用ArcToolbox里的“检查几何”工具跑一遍看是否有空几何要素。这两步都做完了还不行十有八九是文件损坏重新从压缩包解压一份再试。4.2 面积字段算出“千万平方公里”投影与单位的双重陷阱现象对Shape_Area字段做统计一级流域面积加总得到几千万平方千米比辽宁省面积大了几百倍。原因当前数据框或数据本身处于地理坐标系Shape_Area的单位是平方度不是平方千米。平方度是角度单位平方换算成实际面积要看纬度位置直接当面积用必然离谱。解决先把数据投影到等积投影坐标系比如Albers或CGCS2000 3度带高斯投影然后新建一个双精度字段右键字段 → 计算几何 → 面积 → 单位选平方千米。注意计算几何的结果取决于图层坐标系不是数据框显示坐标系计算前务必确认图层已投影。4.3 流域边界和山脊线对不上数据源精度不是坐标系问题现象在1:5万比例尺下shp二级流域边界和DEM提取的山脊线偏差30到50米部分区段甚至跨到了山谷里。原因这套流域shp大概率基于1:25万或更小比例尺的底图数字化而来精度天然低于高分辨率DEM。这是数据精度问题不是投影错误。解决先确认这不是坐标系错位方法很简单——看偏差方向是否全图一致。全图统一向一个方向偏移多半是投影问题在不同地形部位偏差方向凌乱就是精度差异。精度不足时把它当宏观分区底图用别拿来做工程级汇水区边界。要做精确汇水区用高精度DEM重新划分再结合人工判读修正。4.4 压缩包少文件拷给同事后对方只看到线或打不开现象压缩包解压后明明有.shp但同事加载时报“打开失败”或者图层显示成一条条线面状要素没了。原因发文件时只拷贝了.shp和.shx漏了.dbf。.dbf缺失时属性表为空很多要素类操作直接失效如果.shp文件在传输过程中被截断几何数据也会损坏。解决规范做法是把整个文件夹用zip打包再传保持四个核心文件同主名、同目录。收到压缩包后先检查文件个数确认.shp、.shx、.dbf、.prj齐全再打开。我自己的习惯是收到任何外部shp先复制到本地工程目录路径不带中文和空格再从本地加载能避开一大堆Windows路径导致的怪异问题。4.5 中文名称乱码GBK与UTF-8的老玄学现象属性表里流域名称显示成一串乱码常见的是“锟斤拷”或“鍚嶇О”这类文本完全读不出原本含义。原因shp的.dbf属性表早期多用GBK/ANSI编码存储中文字段而新版ArcMap或QGIS默认按UTF-8读取两边编码对不上就乱码。这是老shp数据绕不开的“玄学”。解决QGIS里加载shp时在“文件源编码”里手动选GBK基本能立刻恢复ArcMap里可以用“表转dBASE”或导入gdb前在“环境”里设置编码。用Python读这种dbf时pyshp可以显式指定编码读取import shapefile sf shapefile.Reader(basin.shp, encodinggbk)写成encodingutf-8读乱码换成gbk通常就正常了。属性表一旦乱码影响范围不止是看名称后续按名称筛选、连接属性表都会出错所以拿到数据先扫一眼名称字段没问题再往下做。5. 进阶用法流域编码汇总、shp转3dtiles和一行脚本质检5.1 用流域编码做层级汇总前缀截取与Dissolve二级流域指标汇总到一级流域核心逻辑是编码前缀匹配。比如二级编码有8位前两位对应一级流域那就截取前两位再用Dissolve按截取结果聚合。我一般用ArcPy处理import arcpy fc rE:\data\basin_level2.shp out_gdb rE:\data\out.gdb arcpy.management.AddField(fc, LV1_CODE, TEXT, field_length2) with arcpy.da.UpdateCursor(fc, [GB_CODE, LV1_CODE]) as cursor: for row in cursor: row[1] row[0][:2] cursor.updateRow(row) arcpy.management.Dissolve(fc, os.path.join(out_gdb, basin_lv1_dissolve), LV1_CODE, [[AREA, SUM], [SCORE, MEAN]])这里先截取编码生成LV1_CODE字段再按LV1_CODE溶解。溶解时能同时算面积总和与指标平均值一次输出两级汇总表。为什么用溶解而不是直接连接一级shp因为溶解能把散碎的二级要素合并成完整的一级边界不在中间产生拓扑缝隙后续出图不用再处理接边。5.2 转3dtiles把流域边界搬进三维场景汇报时要在三维地球里看流域范围直接把shp拖进Cesium是不可能的。常见做法是先转GeoJSON再转3dtiles工具链并不复杂。步骤工具作用属性清洗ArcMap/QGIS去掉多余字段保证要素类型统一shp转GeoJSONQGIS另存为生成标准交换格式GeoJSON转3dtiles本地工具链或在线转换服务输出tileset.json及分块数据三维加载CesiumJS或支持3dtiles的平台叠加地形查看效果转换前记得把属性表里的中文乱码问题先解决否则转到三维平台后名称字段照样乱。流域面转3dtiles后叠加地形起伏看边界走向比平面图直观得多。5.3 拿到数据先跑一遍十秒质检脚本这是我现在每次收到外部shp必跑的一段脚本。别嫌它简单坐标系缺失、空几何、自相交这些问题在流域数据里都遇过import arcpy fc rE:\data\basin.shp bad_fids [] with arcpy.da.SearchCursor(fc, [SHAPE, FID]) as cur: for shape, fid in cur: if shape is None or shape.isEmpty: bad_fids.append(fid) elif not shape.isValid: bad_fids.append(fid) print(bad geometry count:, len(bad_fids)) print(spatial reference:, arcpy.Describe(fc).spatialReference.name)脚本逻辑很直接遍历所有要素用SHAPE拿几何对象逐个检查isEmpty和isValid再打印坐标系名称。坐标系如果显示Unknown就是缺少.prj后边所有叠加都要出问题。现在我把这套流程固定下来了收到shp先跑一遍上面的质检脚本再统一坐标系最后才进ArcMap做符号化。跑过一次校验后面所有叠加和统计都省心。这份辽宁省两级流域数据下载后也建议先按第二章核对文件完整度再上第三章的提取流程。希望帮到你。本文还有配套的精品资源点击获取