简介:长江经济带区县、地级市及省级行政边界shp矢量数据包,覆盖上海、江苏、浙江等11个省市,是GIS空间分析与专题制图的常用基础数据,尤其适合区域经济研究、城乡规划、交通物流、环境监测等相关从业者及高校师生使用。压缩包共22个文件,标准Shapefile组件齐全,包含3个shp几何数据、3个dbf属性表、3个prj投影坐标、3个shx位置索引、3个sbn/sbx空间索引及3个xml元数据,另附预览图,整体约20.59MB。已有705人学习下载。数据粒度细至区县级,自带精确地理坐标与投影参数,可直接导入ArcGIS、QGIS进行地图可视化、叠加分析、缓冲区计算等操作;也可结合人口、GDP等属性字段做分级渲染与区域对比,相比自行采集整理能显著节省数据预处理时间,为长江经济带空间格局、产业布局、生态治理等课题研究提供可靠底图支撑。
1. 长江经济带各区县 SHP 数据包:从哪里开始下手
长江经济带各区各县shp文件.rar 这类压缩包,可以看作一套“边界基础数据”,里面通常是上海、江苏、浙江、安徽、江西、湖北、湖南、重庆、四川、贵州、云南这些省级单位的区县级矢量边界。对做区域分析的人来说,它的价值不在图层多精致,而在于行政代码和面要素已经按区县粒度切好,拿到就能和统计年鉴、夜间灯光、路网数据做空间关联。适合刚接手区域项目、需要快速搭底图的 GIS 工程师。以下按我平时处理这类数据包的顺序展开:先拆包和验文件,再统一坐标系统,随后用 GeoPandas 读取与合并,最后做属性连接和交付前自检。
2. 解开 RAR 压缩包:先做 SHP 四件套完整性检查
2.1 RAR 打包方式对 SHP 部件损耗的影响
一个 SHP 面要素图层不是单文件,而是由 .shp、.shx、.dbf、.prj 四个核心文件共同组成,实际分包中还会带 .cpg、.qpj。.shx 是记录几何偏移量的索引,没有它 QGIS 还能凭 .shp 硬读,ArcGIS 则经常直接报错;.dbf 存的是区县名称和行政代码,编码不对时中文全变成乱码;.prj 丢失最麻烦,数据会以“未知坐标系”出现,后续所有投影转换都要先手工假定。很多共享包用 RAR 压缩成 长江经济带各区各县shp文件.rar,一方面是因为零散文件太多,另一方面 RAR 对纯文本坐标数据的压缩率优于 ZIP。拆包后不能用“文件图标还能看”判断完整,我的做法是先核对计数再验证读取。
| 文件后缀 | 实际作用 | 缺失时的典型现象 |
|---|---|---|
| .shp | 面要素几何主体 | 图层空白或无法加载 |
| .shx | 几何位置索引 | ArcGIS 提示“无法打开”,QGIS 可自动回退 |
| .dbf | 属性表字段与记录 | 要素能看,属性表打不开或为空 |
| .prj | 坐标系统定义文本 | 图层显示未定义坐标系 |
| .cpg | DBF 字符编码声明 | 中文属性乱码,可手动改编码补偿 |
提示:Windows 下若没有 RAR 专用环境,先从正规渠道安装 7-Zip。标准库 zipfile 不支持 RAR 算法,单独装 rarfile 又要额外找 unrar 后端,为一个数据包折腾不值得。
2.2 用 7-Zip 命令行解压并统计 .shp 数量
在 GUI 里右键解压没问题,但要脚本化重复处理数据包时,命令行更可控。Windows 下安装 7-Zip 之后,我一般这样解压:
7z x 长江经济带各区各县shp.rar -oD:/gis/changjiang -y参数说明:x 表示全路径解压,把压缩包里的目录结构还原到 -o 指定的目录 D:/gis/changjiang;-y 表示所有确认都选 Yes,避免同名文件弹出交互对话框。注意 -o 后面不能加空格,否则 7-Zip 会把空格当作路径的一部分。解压完先数一下文件:
find D:/gis/changjiang -name "*.shp" | wc -l find D:/gis/changjiang -name "*.dbf" | wc -l如果两个计数不一致,说明解压过程不完整或原始分包里本来就缺属性表。更严谨的做法是同时数 .prj 文件,少一个 .prj 就意味着有一个区县图层处在未知坐标系状态,要多花一轮人工排查。
2.3 用 ogrinfo 检查图层级完整性
文件数量对上还不够,我会用 GDAL 自带的 ogrinfo 逐图层看一遍摘要信息:
ogrinfo -so -al D:/gis/changjiang/hunan/yongzhou.shp其中 -so 只读取 summary 信息,不输出逐要素坐标,-al 表示列出所有图层。输出里能看到 Feature Count、Extent、Geometry 类型和字段列表。若字段中的区县名称为空或者 Feature Count 为 0,就回到第 2.2 步重新解压,而不是直接在 ArcGIS 里反复试加载。有的数据包会同时提供 .sbn/.sbx(ArcGIS 空间索引),这两个文件不是必须的,删除后不影响读取,没必要保留。
提示:shp 转 txt 在这类数据中常用到。如果只是要把区县属性发给不装 GIS 的同事,ogrinfo 加 -geom=NO 再配合 -oo 参数输出 CSV,比右键另存更稳定,也不会受 Excel 打开 DBF 时的编码干扰。
3. 用 gdalinfo 统一坐标系:先解决 SHP 的 PRJ 问题
3.1 区县数据最常见的四种坐标系统
长江经济带数据来自不同单位,坐标系统很杂。最常见的有四种,处理前先分清楚用什么,能省掉后面大量返工。
| EPSG | 名称 | 坐标单位 | 适合做什么 |
|---|---|---|---|
| 4490 | CGCS2000 地理坐标系 | 经纬度 | 统一入库、空间连接、跨带数据合并 |
| 4326 | WGS84 地理坐标 | 经纬度 | GPS 采集点位、公开下载数据 |
| 3857 | Web 墨卡托投影 | 米 | 在线底图切片,不用于面积统计 |
| 4522 等 | CGCS2000 3 度分带投影 | 米 | 面积计算、缓冲区分析 |
EPSG:4490 和 EPSG:4326 在区县尺度上的差异较小,但严谨项目还是先转到 4490 再做。EPSG:3857 是瓦片地图默认投影,它的纬线距离会被拉长,直接统计面积会得到明显偏大的结果。长江经济带横跨多个投影带,做省级汇总时,我通常保留 4490 这套地理坐标系,只在需要算面积或做缓冲区时临时转投影。
3.2 从 PRJ 里的 WKT 文本判断原始坐标系
不带投影的数据包,解压后大多能看到 .prj 文件。用 gdalinfo 读一下就知道坐标系定义:
gdalinfo D:/gis/changjiang/hunan/yongzhou.shp | grep -A 12 "Coordinate System"grep 的 -A 12 是让输出多带 12 行,覆盖常见的 WKT 描述。PRJ 中写的是 GCS_China_Geographic_Coordinate_System_2000,对应的就是 CGCS2000 地理坐标;如果写 WGS_1984_Web_Mercator,则明显是 EPSG:3857。值得警惕的是老数据里可能出现 Beijing_1954、Xian_1980,这些旧坐标系基准和现代卫星定位数据相差几十米到上百米,面图层的边界位置会整体偏移,不能直接和其他数据叠加。
3.3 没有 PRJ 文件时如何强制指定再转换
最麻烦的是 .prj 缺失。未见 prj 就无法自动读出原生坐标系,只能先根据数据范围判断。若经纬度在 73°E 到 135°E、17°N 到 54°N 范围内,且数值是十进制度格式,可以先用 -a_srs 强制赋予 4326,再转成 4490:
ogr2ogr -a_srs EPSG:4326 -t_srs EPSG:4490 D:/gis/changjiang/out.shp D:/gis/changjiang/in.shp参数说明:-a_srs 是“为无坐标系定义的数据强制指定”,它不会改变坐标值,只写入一条坐标系记录;-t_srs 是输出目标坐标系,ogr2ogr 在写入时自动调用 Proj 完成转换。强制指定前必须先确认原始数据不是 3857 的米值范围,否则相当于把经纬度当成米传给投影转换,结果会被放大数万倍。转换后如果 Extent 的数值量级没有变化,就说明坐标系判断有误,需要核对边界经纬度与已知城市位置的偏差。
提示:转换完成后不要删掉原始文件。保留一份 in.shp 和一份 out.shp,后续若发现范围判断错误至少还能回到原始状态重做,而不是重新下载整包数据。
4. 用 GeoPandas 读取、过滤和拼接区县 SHP
4.1 读取时先处理中文字段编码
GeoPandas 读取单个区县 SHP 最直接:
import geopandas as gpd gdf = gpd.read_file( "D:/gis/changjiang/hunan/yongzhou.shp", encoding="utf-8" ) print(gdf.columns.tolist()) print(gdf.head())read_file 的 encoding 参数只作用于 dbf 属性部分,shp 几何二进制不涉及文字编码。若打印的列名是乱码,可换成 encoding="gbk",因为大多数国内 GIS 软件输出的 DBF 沿用的是 GBK 外置编码。读取时用什么编码,后续 to_file 输出也应保持一致,否则字段名在全流程中可能悄悄变化,Excel 打开却一切正常,反而更难排查。
4.2 把一个市里的多个区县文件拼成一张表
各区县常常拆成许多小 SHP,我习惯在读取阶段统一字段名后把它们纵向拼接。常见字段名很不一致,先做映射:
| 常见字段名 | 含义 | 统一后字段 |
|---|---|---|
| XZQMC / NAME / 名称 | 区县名称 | NAME |
| ADCODE93 / PAC / CODE | 行政区划代码 | ADCODE |
| PROVINCE / PROV | 所属省份 | PROVINCE |
import glob import pandas as pd import geopandas as gpd paths = glob.glob("D:/gis/changjiang/**/*.shp", recursive=True) frames = [] for p in paths: part = gpd.read_file(p, encoding="utf-8") if "XZQMC" in part.columns and "NAME" not in part.columns: part = part.rename(columns={"XZQMC": "NAME"}) if "ADCODE93" in part.columns: part = part.rename(columns={"ADCODE93": "ADCODE"}) frames.append(part) whole = gpd.GeoDataFrame( pd.concat(frames, ignore_index=True), crs="EPSG:4490" ) print(whole.shape)拼合前先统一字段名,可减少后续 merge 的意外。这里的 crs="EPSG:4490" 只是声明合并后的坐标系,不参与实际重投影;若每个分片本身投影不同,先逐个调用.to_crs(4490)再 concat 才安全。合并后查看 whole.shape:行数应大于分片个数,但仍要检查重复记录,因为同一个区县可能出现在两个分片中。
4.3 几何有效性检查与修复
区县边界经常伴随微小裂缝、重叠和自相交,最典型的坑是同一个 ADCODE 出现两条记录。修复和去重我放在同一段做:
from shapely.validation import make_valid whole["geometry"] = whole.geometry.apply(make_valid) whole = whole[whole.is_valid & ~whole.is_empty] whole = whole.drop_duplicates(subset=["ADCODE"], keep="first")make_valid 只做局部几何修复,不改变属性字段;过滤条件 is_valid 和 is_empty 排除坏面。drop_duplicates 按 ADCODE 去重,能避免后续统计被同一区县重复计数。删除前值得多看一眼:如果重复记录里的 NAME 相同但 ADCODE 不同,往往是“县改区”造成的新旧两期数据叠加,应保留新代码,而不是机械去重。
5. 为区县 SHP 接入属性表:坐标导入与空间连接参数
5.1 从 Excel 经纬度导入并生成点 SHP
把统计表里的经纬度生成点、再与区县面叠加,是区县数据分析里的高频操作。在 GeoPandas 中按字段类型严格读取:
import pandas as pd import geopandas as gpd tab = pd.read_excel("统计表.xlsx", dtype={"区县代码": str}) tab = tab.dropna(subset=["经度", "纬度"]) points = gpd.GeoDataFrame( tab, geometry=gpd.points_from_xy(tab["经度"], tab["纬度"]), crs="EPSG:4490" ) points.to_file("points.shp", encoding="utf-8")参数说明:dtype 里把区县代码设为 str,是为了保留行政区划代码的前导 0,否则“110101000000”会变成科学计数法或首零被吃掉。points_from_xy 第一个参数是经度 x,第二个是纬度 y,别按国内制图习惯写成“纬度、经度”;crs 必须与区县面图层一致,否则空间连接结果会是空集。这样生成的 points.shp 就是基本可用的点图层,能在 ArcMap 或 QGIS 中直接与面叠加显示。
5.2 用行政区划代码关联统计表
生成点 SHP 之后,更常用的做法是把统计指标直接挂到区县面属性上:
whole = whole.merge( stat_df, left_on="ADCODE", right_on="区县代码", how="left" )merge 的 left_on 是面图层的字段,right_on 是 Excel 表字段。两列类型必须完全一致,否则对比“110101”和数字 110101 时不会匹配。how="left" 保留面图中所有区县,未匹配到的统计字段为 NaN;如果用 how="inner",缺统计数据的区县会直接从图里消失,地图上出现缺口。关联后抽查几个已知区县的指标值,比依赖字段名更可靠。
5.3 空间连接把点 SHP 落回区县
“这些检查点位分别在哪几个县”这类问题,不能靠属性匹配,必须做空间连接:
joined = points.sjoin(whole, predicate="within", how="left")sjoin 默认启用空间索引加速,真正起作用的是几何关系而不是字段值。predicate 参数直接影响结果:
| predicate | 几何判断 | 适用场景 |
|---|---|---|
| within | 点在面内部 | 点位严格落在某县内 |
| intersects | 点与面相交 | 需要保留边界上的点 |
| touches | 点与面边界接触 | 识别相邻县边界点位 |
点恰好落在两县边界上时,within 可能匹配不到,改成 intersects 又可能同时落入两个县。此时先对线的方位做输出说明,单独判断邻近县再指定归属,不要依赖空间连接一步到位。数据量大时,创建一次whole.sindex能明显加速后续多轮连接。
6. SHP 交付前的最后一轮自检:计数、面积、重叠与压缩
6.1 用脚本把错误挡在交付前
拿到整表后,我习惯再跑一遍断言式检查,而不是只看地图上有没有明显缺口。针对每个区县检查名称唯一性和面积是否大于 0:
for adm, subset in whole.groupby("ADCODE"): area = subset.geometry.area.sum() assert area > 0, f"{adm} 面积异常" assert subset.NAME.nunique() == 1, f"{adm} 名称不唯一" if subset.geometry.count() > 1: print(adm, "含多部件,已提醒")代码逻辑:逐 ADCODE 分组,area 检查排除空几何和拓扑错误,名称唯一性检查能发现“同名不同县”。多部件提醒只打印不断言,因为重庆、上海等直辖市存在飞地式区划,多部件不一定是错误。这一轮通过了,再进入制图阶段。
6.2 按 RAR 原始语义回压成单个包
区县 SHP 单个文件只有几 MB,成百上千个文件散落在多个目录里反而难管理。我通常把干净的结果回压成一个 zip,兼容性比 RAR 更好,在线发布不涉及注册格式:
zip -r changjiang_all.zip D:/gis/changjiang/whole/zip 的 -r 递归子目录,把整张表连带 shp/shx/dbf/prj/cpg 一起归档。压缩后保留一份清单文件,记录每个文件的来源和转换日志。以后任何人拿到这个 zip,先解压再用第 2 章的 ogrinfo 命令复核一次,就能确认收到的包没有被截断。
本文还有配套的精品资源,点击获取