FEATURED · 精选文章

长江经济带区县SHP数据处理:从解压到坐标系转换与GeoPandas合并

发布时间 / 2026/9/12 22:26:53
来源 / 创域科博编辑部
栏目 / 资讯中心
长江经济带区县SHP数据处理:从解压到坐标系转换与GeoPandas合并 简介长江经济带区县、地级市及省级行政边界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坐标系统定义文本图层显示未定义坐标系.cpgDBF 字符编码声明中文属性乱码可手动改编码补偿提示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/.sbxArcGIS 空间索引这两个文件不是必须的删除后不影响读取没必要保留。提示shp 转 txt 在这类数据中常用到。如果只是要把区县属性发给不装 GIS 的同事ogrinfo 加 -geomNO 再配合 -oo 参数输出 CSV比右键另存更稳定也不会受 Excel 打开 DBF 时的编码干扰。3. 用 gdalinfo 统一坐标系先解决 SHP 的 PRJ 问题3.1 区县数据最常见的四种坐标系统长江经济带数据来自不同单位坐标系统很杂。最常见的有四种处理前先分清楚用什么能省掉后面大量返工。EPSG名称坐标单位适合做什么4490CGCS2000 地理坐标系经纬度统一入库、空间连接、跨带数据合并4326WGS84 地理坐标经纬度GPS 采集点位、公开下载数据3857Web 墨卡托投影米在线底图切片不用于面积统计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 Systemgrep 的 -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再转成 4490ogr2ogr -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 读取、过滤和拼接区县 SHP4.1 读取时先处理中文字段编码GeoPandas 读取单个区县 SHP 最直接import geopandas as gpd gdf gpd.read_file( D:/gis/changjiang/hunan/yongzhou.shp, encodingutf-8 ) print(gdf.columns.tolist()) print(gdf.head())read_file 的 encoding 参数只作用于 dbf 属性部分shp 几何二进制不涉及文字编码。若打印的列名是乱码可换成 encodinggbk因为大多数国内 GIS 软件输出的 DBF 沿用的是 GBK 外置编码。读取时用什么编码后续 to_file 输出也应保持一致否则字段名在全流程中可能悄悄变化Excel 打开却一切正常反而更难排查。4.2 把一个市里的多个区县文件拼成一张表各区县常常拆成许多小 SHP我习惯在读取阶段统一字段名后把它们纵向拼接。常见字段名很不一致先做映射常见字段名含义统一后字段XZQMC / NAME / 名称区县名称NAMEADCODE93 / PAC / CODE行政区划代码ADCODEPROVINCE / PROV所属省份PROVINCEimport glob import pandas as pd import geopandas as gpd paths glob.glob(D:/gis/changjiang/**/*.shp, recursiveTrue) frames [] for p in paths: part gpd.read_file(p, encodingutf-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_indexTrue), crsEPSG:4490 ) print(whole.shape)拼合前先统一字段名可减少后续 merge 的意外。这里的 crsEPSG: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], keepfirst)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, geometrygpd.points_from_xy(tab[经度], tab[纬度]), crsEPSG:4490 ) points.to_file(points.shp, encodingutf-8)参数说明dtype 里把区县代码设为 str是为了保留行政区划代码的前导 0否则“110101000000”会变成科学计数法或首零被吃掉。points_from_xy 第一个参数是经度 x第二个是纬度 y别按国内制图习惯写成“纬度、经度”crs 必须与区县面图层一致否则空间连接结果会是空集。这样生成的 points.shp 就是基本可用的点图层能在 ArcMap 或 QGIS 中直接与面叠加显示。5.2 用行政区划代码关联统计表生成点 SHP 之后更常用的做法是把统计指标直接挂到区县面属性上whole whole.merge( stat_df, left_onADCODE, right_on区县代码, howleft )merge 的 left_on 是面图层的字段right_on 是 Excel 表字段。两列类型必须完全一致否则对比“110101”和数字 110101 时不会匹配。howleft 保留面图中所有区县未匹配到的统计字段为 NaN如果用 howinner缺统计数据的区县会直接从图里消失地图上出现缺口。关联后抽查几个已知区县的指标值比依赖字段名更可靠。5.3 空间连接把点 SHP 落回区县“这些检查点位分别在哪几个县”这类问题不能靠属性匹配必须做空间连接joined points.sjoin(whole, predicatewithin, howleft)sjoin 默认启用空间索引加速真正起作用的是几何关系而不是字段值。predicate 参数直接影响结果predicate几何判断适用场景within点在面内部点位严格落在某县内intersects点与面相交需要保留边界上的点touches点与面边界接触识别相邻县边界点位点恰好落在两县边界上时within 可能匹配不到改成 intersects 又可能同时落入两个县。此时先对线的方位做输出说明单独判断邻近县再指定归属不要依赖空间连接一步到位。数据量大时创建一次whole.sindex能明显加速后续多轮连接。6. SHP 交付前的最后一轮自检计数、面积、重叠与压缩6.1 用脚本把错误挡在交付前拿到整表后我习惯再跑一遍断言式检查而不是只看地图上有没有明显缺口。针对每个区县检查名称唯一性和面积是否大于 0for 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 命令复核一次就能确认收到的包没有被截断。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻