简介2024广东省河流水系矢量图层shp数据集面向GIS使用者、空间数据工程师及水资源研究人员提供了覆盖全省的水系线和水系面两级地理要素。数据在WGS84坐标系下构建要素数量达数千至上万条细节丰富可直接加载至ArcGIS、QGIS等平台用于河网结构分析、专题制图、流域规划及环境管理等工作解决了省级精细水系底图不易获取的痛点。压缩包共11个文件大小约28.41MB除核心shp、shx、dbf、prj、cpg等Shapefile标准组件外还附带Python转换脚本便于将矢量数据输出为GeoJSON适配WebGIS快速调用。目前已有158人学习或下载适合需要一套现成、坐标统一且层级完整的水系数据作为项目基础底图的用户。1. 从2024广东水系矢量图层shp看水利GIS的打开姿势真正打开2024广东省河流水系矢量图层中的广东省_水系线数据.shp时第一个反直觉的结论是一条河并不是一条连续折线而是被支流、县界、水库打断成几千条线段。如果你心里还留着“选一条线看全长”的预期大概率会以为数据碎了。这份数据包同时给水系线和水系面两个要素类坐标统一使用WGS84经纬度线要素数量轻松上万。它适合三类人做流域分析和内涝模拟的需要河网作为约束边做制图和三维场景的要把线面喂给前端或Cesium做数据运维的经常要把河网换格式、重新投影。如果只想在地图上看看颜色这份数据反而显得琐碎要做空间关系分析这种细分粒度恰恰是刚需。后面所有操作都以这条线/面数据为准展开。2. 拆解数据包广东省_水系线/面文件组件与WGS84坐标系2.1 shp不是一个文件而是一组兄弟文件解压广东水系数据包后你会看到广东省_水系线数据同时存在 .shp、.shx、.dbf、.prj、.cpg 五个扩展名水系面数据也完全一样。这不是发布者重复上传而是 Shapefile 格式的底层规定一个完整图层必须由多个文件协同工作。.shp 只存空间几何.shx 是几何索引.dbf 是属性表.prj 记录坐标系定义.cpg 告诉软件属性按哪种编码解析。实际项目中很多新手只把 .shp 拖进 ArcGIS Pro结果直接报“打开失败”原因就是其余兄弟文件没跟着走。扩展名作用是否可以手动删除.shp几何坐标、要素类型、要素范围不能.shx几何索引加速渲染和空间查询不建议部分软件会重建.dbf属性字段、字段类型和值不能属性全在这里.prj坐标系文本对应 WGS84 / EPSG:4326可以但会失去坐标系信息.cpg属性编码声明避免中文乱码不建议删掉后字段乱码风险高这个表格本身也是一个检查清单。我拿到任何 shp 数据集第一件事就是确认这五个文件是否齐全而不是急着打开。尤其 .prj 文件只要缺失后面叠加遥感影像时系统会频繁提示“未知坐标系”需要手动去猜数据原本的投影参数很浪费时间。压缩包内还附带了一个 shp2json.py这说明资源发布者的本意就是把 shp 往 Web GIS 方向送后面我们会用这个思路做转换。2.2 用 ogrinfo 先看图层再决定怎么用拿到 shp 后我一般不会先打开 ArcGIS而是在命令行用 GDAL 的 ogrinfo 做一次快速体检。它能把要素类型、数据量、坐标范围、坐标系定义一次性列出来几秒钟就知道这份数据能不能满足需求。ogrinfo -so -al 广东省_水系线数据.shp这里-so表示 summary only只输出概要信息-al表示遍历所有图层-so和-al同时使用是 GDAL 中最常用的 shp 查看组合。输出里重点看 Feature Count、Extent、Geometry 和 PROJCRS 几项。Feature Count 会给你一个上万行的明确数字Geometry 会显示 Line StringExtent 则是经纬度边界。如果不加-soogrinfo 会把每条线段上的每个节点坐标全部打印出来广东河网几千上万段终端瞬间刷屏几十万行没有任何可读性。如果要同时看字段结构可以只查看图层元数据ogrinfo -so -al 广东省_水系面数据.shp | grep -E Feature Count|Geometry|PROJCRS|Extentgrep 后面跟的四个关键词对应了面数据最需要确认的四类信息。比如 Geometry 显示 Multi Polygon说明面数据中存在多部件面后续做面积统计时要用Shape_Area或者按部件拆分否则一个水库可能被统计成多个独立要素。WGS84 坐标系下的 Extent 单位是度范围在 109 到 118 之间说明数据落在广东境内和“广东水系”的预期一致。如果范围里出现 0 或 999就要怀疑 .prj 与真实坐标不一致。2.3 水系线和水系面一份数据两个几何层次水系线和水系面不是同一个几何的两种表达它们在建模思路上完全不同。线数据通常表达河道中心线、河渠、沟渠用于计算河网长度、做河道缓冲、生成排水网络面数据表达河流水面、湖泊、水库、蓄滞洪区范围用于计算水域面积、叠加土地利用、做淹没分析。实际项目中如果只做河网分级线数据足够如果做洪水风险区划必须切换到面数据因为线数据无法回答“某个地块在水面范围内还是范围外”。属性字段方面水系线数据常见字段包括河名、河流等级、河段类型、长度等面数据常见字段包括水体名称、水体类型、面积等。具体字段名要以打开 .dbf 后看到的为准不同发布者对字段命名习惯差异很大有的叫NAME有的叫NAME_CN还有的叫GB分类码。一个省市级的水系 shp 经常混合了自然河流和人工灌渠如果你只需要天然河网建议先查一下字段中的分类码做一次 SQL 筛选导出。这里还有一个越早知道越好的坐标系知识点WGS84 是地理坐标系GEOGCS单位是度不是米。如果你后面要用线数据计算长度直接使用属性表里的 Length 字段它是以度为单位计算出来的不代表真实地面距离。正确的做法是先投影到适合本地的投影坐标系广东大部分区域投影到 WGS 84 / UTM 49N 或 50NEPSG 分别为 32649 和 32650再算长度结果才是米。prj 文件里写的GEOGCS[WGS 84, DATUM[WGS_1984 ...]就是这个意思它只声明经纬度不负责把你变成平面坐标。3. 让shp2json.py干活广东水系shp转GeoJSON的代码与参数3.1 为什么转GeoJSON而不是继续用shpshp 在桌面 GIS 里很好用但到了 Web 端和三维场景就成了麻烦。Cesium、Leaflet、Mapbox GL 这些前端的原生格式是 GeoJSON不能直接读 shpPostGIS、MongoDB 虽然能导入 shp但通常也要先转一步。GeoJSON 是纯文本坐标系用 EPSG:4326 的经纬度表达正好和广东水系数据的 WGS84 一致不需要投影转换就能直接渲染。另一个理由是字段可控。shp 里的 .dbf 字段类型老旧日期字段经常变成字符串数字精度容易被截断。转 GeoJSON 时可以按需保留字段把没用的中间字段全部丢掉文件体积会小很多。广东水系线数据细到几万段如果不过滤字段一个 GeoJSON 动辄几十 MB前端加载非常吃力。压缩包里的 shp2json.py 应该也是为了解决这个问题才放进来的。3.2 一个更靠谱的转换脚本写法资源包里的 shp2json.py 通常是调用 fiona 读取要素再写成 GeoJSON。实际生产中我一般会在脚本里加三件事字段白名单、几何简化、要素 id。下面这个脚本可以直接保存成shp2json.py运行也可以作为你改写原脚本的参考。# shp2json.py # 用法: python shp2json.py 广东省_水系线数据.shp 广东省_水系线数据.geojson import json import sys import fiona from shapely.geometry import shape, mapping src_shp sys.argv[1] out_geojson sys.argv[2] # 按实际 dbf 字段调整保留你真正需要的字段 KEEP_FIELDS [NAME, GB, LENGTH] features [] with fiona.open(src_shp, r) as src: for fid, feat in enumerate(src): props { key: feat[properties].get(key) for key in KEEP_FIELDS if key in feat[properties] } geom shape(feat[geometry]) # simplify 容差 0.0001 度约 10 米去掉过于密集的节点 simplified geom.simplify(0.0001, preserve_topologyTrue) features.append({ type: Feature, id: fid, properties: props, geometry: mapping(simplified) }) with open(out_geojson, w, encodingutf-8) as f: json.dump( {type: FeatureCollection, features: features}, f, ensure_asciiFalse ) print(done -, out_geojson, features:, len(features))这个脚本的核心逻辑是用 fiona 读 shp用 shapely 把原始几何变成可计算对象再通过mapping()转回 GeoJSON 结构。KEEP_FIELDS相当于字段白名单没列进去的字段不会进入输出这是控制体积最有效的手段。simplify(0.0001, preserve_topologyTrue)是做道格拉斯-普克抽稀容差 0.0001 度在我国中部和华南约等于 10 米对河网这种线要素来说已经完全足够如果你只是做全省缩略图展示容差可以放大到 0.001文件能再小一半。运行前需要装依赖Windows 命令行下执行pip install fiona shapely如果原数据里包含中文属性建议把ensure_asciiFalse保留。这个参数为 True 时中文会被转成\u6cb3这种转义字符虽然 JSON 本身合法但人眼检查数据时会非常痛苦。简化后的几何仍然保留拓扑关系不会出现河流相交处断开这种硬错误但要注意抽稀后要素坐标精度从原始的 6 位小数降到 4 位左右换算成地面精度约 10 米不适合做高精度断面分析。3.3 转换后验证坐标和要素数量转出的 GeoJSON 也要做一次体检避免后面前端加载时才发现几何类型变了。我习惯用 ogrinfo 直接检查 GeoJSON 的概要信息ogrinfo -al -so 广东省_水系线数据.geojson这个命令能看到 Feature Count、Geometry 和 Extent 是否和原 shp 一致。重点检查 Geometry 是否仍是 Line String而不是 Multi Point。另外用 jq 快速统计要素数量更直观jq .features | length 广东省_水系线数据.geojson.features | length是 jq 里的管道表达式把 features 数组作为输入输出数组长度。用 jq 做验证的好处是直接读取 JSON 结构不经过 GDAL 的中间解析能确认文件本身就是合法的 GeoJSON。如果 jq 报 parse error说明 json.dump 写出的文件不完整通常是磁盘空间不足或者进程被杀掉。简化容差度对应地面距离约适用场景0.000011 米高精度断面、水利计算0.000111 米流域制图、Web 展示0.001110 米省级缩略图、三维场景大范围预览上面这个表格是简化容差的经验值不是精确公式。WGS84 下 1 度经度在中纬度约等于 96 公里0.0001 度就是 9.6 米纬度方向 1 度约 111 公里0.0001 度约 11 米。整体取 10 米级不会出大问题。如果你要生成 3dtiles建议用 0.001 的容差先抽稀因为三维地形加载对细节的敏感性远低于二维水利分析。4. ArcGIS Pro/ArcMap实操加载遥感影像、修复shp、转gdb与外边界线4.1 在ArcGIS Pro中加载遥感影像和水系shp先设好WGS84在 Arcmap 或 ArcGIS Pro 中加载遥感影像时最容易翻车的是坐标系不一致。广东水系数据是 WGS84 经纬度在线影像服务大多是 Web MercatorEPSG:3857乍看都是全球坐标系但 ArcGIS 会自动做实时投影不会报错只是叠加后会有微小偏移。我的习惯是先把地图属性里的坐标系设为 WGS84再加载影像和水系 shp。操作步骤很简单打开 ArcGIS Pro新建地图在 Map Properties 里把坐标系查找并切换到 WGS_1984然后从 Catalog 里把广东省_水系线数据.shp 直接拖到 Contents 窗口。ArcMap 也差不多都是直接把 shp 拖进数据视图。这里有个常见误解拖进去后图层显示成灰色不代表数据损坏很可能是当前比例尺太大或太小。右键图层选择 Zoom To Layer系统会自动缩放到数据范围这时如果仍然空白再检查 .prj 文件。遥感道路 shp 文件也是同样的加载逻辑很多道路数据同样用 WGS84 发布。遇到路网和水系叠加对不齐优先检查影像底图是不是被设置了 Web Mercator 动态投影而不是怀疑两个 shp 坐标有误。WGS84 底图在 ArcGIS Pro 里默认会启用动态投影但渲染性能和标注稳定性不如直接统一定义到同一坐标系。4.2 用ShapeChecker修复shp的完整步骤shp 用久了会出现一种典型故障图还是能画出来但属性表打开是乱码或者运行相交、裁剪工具时直接报“空间索引无效”。 这种问题的源头有三类字段类型与 .dbf 声明不一致、几何坐标超出有效范围、shp 头部长度信息和实际文件长度不匹配。ShapeChecker 是处理这类问题比较顺手的工具很多数据修复需求不需要重做整个文件。完整步骤是这样先打开 ShapeChecker选择要修复的广东省_水系线数据.shp点击 Scan Now 开始扫描扫描结果里会出现 Error、Warning 两类问题比如 Bad geometry、Self intersection、Empty polygon 等勾选要修复的项点 Repair 生成一个新的 shp原文件不会被覆盖。修复完成后再把新文件拖回 ArcGIS Pro 验证一次。如果修复出来的图层和遥感影像有位移多半不是 ShapeChecker 的问题而是原数据的投影文件写错或者缺失。修复几何比修复坐标系更敏感。对水系面数据Self intersection 如果直接批量修复可能把水面边界压成奇怪的凹多边形。我一般会先运行 ArcGIS Pro 的 Check Geometry 工具导出问题记录再用 ShapeChecker 逐项处理。如果问题数量太大只对参与空间分析的图层做修复展示用途的图层不做这样能保留原始数据形态。4.3 shp转gdb以及只保留外边界线的两种办法几乎每周都有人问“shp转gdb和gdb是一样的东西吗”。答案是不一样。shp 是一个多文件组成的文件夹级格式一个 shp 只能装一个图层字段类型限制多gdb 即文件地理数据库可以在一个 .gdb 文件夹里装多个要素类、拓扑、关系、网络数据集字段类型更丰富还支持大字段。在 ArcGIS Pro 里转 gdb 非常简单右键目标数据库选择 Import Feature Class或者直接用 arcpyimport arcpy arcpy.conversion.FeatureClassToGeodatabase( in_featuresr广东省_水系线数据.shp, out_gdbrC:\gis\广东省.gdb )参数说明in_features支持分号分隔多个 shp 一次性导入比如线.shp;面.shpout_gdb必须已经存在否则工具会报错。转完 gdb 后原来的 shp 不会被删除两个格式可以共存。如果后续要做水系网络分析必须先转进 gdb因为 shp 不支持拓扑和网络数据集。另一个经常出现的需求是shp 有没有办法只保留外边界线。拿水系面数据举例如果整个广东水域是一个个分离的多边形要得到整体轮廓方法不是直接删线而是先把所有面融合成一个面再转线。打开 ArcGIS Pro 的 Dissolve 工具输入要素选广东省_水系面数据.shpDissolve Fields 留空勾选 Create multipart features会得到一个全省水域融合面再用 Polygon To Line 工具把它转成线。转出的线属性表里有 L_FID 和 R_FID 两个字段含义是这条线左右两侧的多边形编号。保留 R_FID 为 -1 的线这些就是整个融合面的外边界。内部公共边会被自动剔除因为它的左右两边都有多边形编号。这个方法比单纯删除短线段更可靠因为它基于拓扑关系判断而不是依赖长度阈值。4.4 把Excel经纬度导入ArcMap生成shp并创建新的地类图斑实际项目中你手头的数据经常是一张 Excel 采样表里面只有点位经纬度要和广东水系面数据叠加判断采样点落在哪个水域范围内。转换方法在 ArcMap 里是老操作先保证 Excel 里经度一列、纬度一列是数值不能是带单位或括号的文本格式然后在 ArcMap 中 Add Data添加 XY Point DataX 对应经度Y 对应纬度坐标系选 WGS84最后右键这个临时事件层Data - Export Data 导出成新的 shp。如果导出后点全部跑到海里或者同一个点上大概率是 X、Y 对应关系颠倒了。Excel 中常见的表头是“经度、纬度”导入时 X Field 选经度、Y Field 选纬度如果是“lon、lat”则 X 选 lonY 选 lat。这个顺序错一个字母数据就崩了。创建新的地类图斑矢量图层也是类似思路。在 Catalog 里新建一个 Polygon Feature Class坐标系仍然选 WGS84然后开始编辑沿着遥感影像勾画边界。勾画时可以把水系面数据作为底图参考但不要手动去描每一段河岸线工作量太大。正确做法是先复制水系面数据中的水面边界再用 Editor 的 Clip 功能裁出新图斑最后修改属性字段。这样创建的图斑天然贴合水系边界也不会因为误操作留下缝隙。5. 下游不给力时广东水系shp转txt、3dtiles与渔网分割5.1 把dbf属性表导成txtshp 转 txt 最常见场景是给水文模型或 CAD 提供坐标点串。用 ogr2ogr 一行命令就能把 shp 转成 CSV/txtogr2ogr -f CSV 广东省_水系线数据.csv 广东省_水系线数据.shp默认导出时线面几何会以 WKT 字符串形式放在geometry列里属性放前面一行就是一条要素。参数说明里值得注意的只有-f CSV它指定输出驱动为 Comma Separated Values如果你想要制表符分隔的真实 txt可以把输出驱动换成MySQL不用直接用-lco SEPARATORTAB再改后缀。排错经验转出来的 CSV 如果中文乱码加-lco ENCODINGUTF-8如果只需要坐标不想要属性在 ogr2ogr 里用-select NAME控制字段。这个 txt 后续可直接导入到 Surfer 或 MATLAB做断面绘制。5.2 把水系 shp 转成 3dtiles喂给三维场景广东河流水系做成三维流动效果用 Cesium 是很容易出彩的路径。流程是把 shp 先转成 GeoJSON再拖到 Cesium ion 平台由平台自动切片成 3D Tiles。上传前建议用 0.001 容差跑一遍 3.2 的脚本因为三维场景对河网细节的需求低太密的节点会让 b3dm 体积失控。如果不想上传公共平台离线方案是先把 GeoJSON 用 geojson2tiles 之类工具预处理再接本地 3dtiles 服务端。重点提醒线数据的 3dtiles 更适合用 polyline 而不是 extruded polygon 来表达水系面才需要拉伸。河宽属性如果没有建议根据河流等级设置 5 到 20 米不等的默认宽度避免全部挤成同一个粗细。5.3 用渔网分割shp解决大文件性能问题全省几万段水系线在大屏上全量加载很吃力。用渔网分割 shp 是常规优化手段把数据按网格分块发布前端只请求视口内的瓦片。打开 ArcGIS Pro 的 Create Fishnet 工具设置 Template Extent 为广东省_水系面数据.shpCell Width 和 Height 各填 0.05度Output Feature Class 生成一个渔网多边形。然后用 Clip 把原始线按渔网切片import arcpy arcpy.analysis.Clip( in_features广东省_水系线数据.shp, clip_features广东_渔网.shp, out_feature_class广东_水系线_分块.shp )in_features是被裁剪的图层clip_features是渔网out_feature_class是输出路径。注意渔网越密分块越多但每条边上被切断的线段数量会同步上升被切断的河段在分块边缘会丢失连通性后续做网络分析前要先做拼接处理。生成裁切后的线 shp 时记得在 Environments 里把输出坐标系固定为 WGS84否则系统会按渔网数据当前坐标系自动投影导致每个分块的坐标范围出现细微偏移。本文还有配套的精品资源点击获取