简介:这份压缩包提供长江经济带覆盖各省、地级市与区县三级行政边界的shp矢量数据,面向GIS开发、城乡规划及区域经济研究人群,可用于地图可视化、空间统计、缓冲区分析等场景。包内共22个文件,以shp主文件为核心,配套dbf属性表、shx几何索引、prj坐标参考、sbn/sbx空间索引及xml元数据等辅助类型,另附一张预览图,可在ArcGIS、QGIS等软件中直接加载,整体大小约20.59MB。文件命名清晰,不同行政层级分别存放,便于快速定位。目前已有705人学习下载。数据细化到区县级,属性表通常附带人口、经济等基础字段,可支撑专题制图与区域对比。借助这些现成底图,研究者能更高效地开展长江经济带产业布局、交通网络、生态环境等空间分析,也为政策评估与项目选址提供了可靠的数据基础。
1. 长江经济带各区县shp文件.rar:解压之前先算清三笔账
同事扔过来一个“长江经济带各区各县shp文件.rar”,刚解压就懵了:十几个乃至几十个散落的文件夹,每个文件夹里都躺着四五个同名不同后缀的文件,坐标一加载对不上,属性表打开全是问号。这个场景对常年处理行政区划数据的工程师来说几乎成了日常。标题看起来直白,背后却是GIS数据交付里最典型也最折腾人的形态:区县粒度切分、RAR整体压缩、缺少配套说明。但麻烦往往不是数据本身,而是坐标系、属性编码、字段结构、几何边界这四类细节。下面按一条能直接走通的路径展开:把这份RAR盘清楚、做体检、合并成可用的长江经济带区县图层,再把属性连接、shp转txt、坐标转换和拓扑检查这些高频操作一次讲透。老手可以直接跳去第3章的合并策略和第5章的交付检查,新手建议从第2章的解压开始一步步跟。
2. 解压RAR与SHP体检:动手前先弄懂文件结构与坐标系
拿到压缩包的第一反应是解压,但解压前和刚解压完各有一件事要先确认。确认这个RAR是单层压缩还是多层嵌套,数据池里流出的包,外层是一个RAR,解开后里面往往又是几十个按地市命名的子文件夹,子文件夹里再装各县SHP。要不要全解到底,取决于你最终用哪一级粒度:只做全流域整体出图,可以按地市合并,甚至直接在ArcMap里全部加载后另存;要挂区县统计口径的数据,就得解到县这一层,并且保证每个县的.shp、.dbf、.prj几个配套文件齐全。
2.1 RAR解压的踩坑点:路径长度、中文乱码与分卷
Windows上解压这类行政区划SHP包,第一个坑是路径过长。区县文件夹经常是“长江经济带\安徽\安庆市\望江县2020区划.shp”这种长中文路径,再解压到“C:\Users\张三\Desktop\项目1\中间数据”这种桌面路径下,总长度轻松超过260个字符,部分版本WinRAR或Windows自带解压直接报“文件名太长”。常规做法是先建D:\gisdata这种短ASCII根目录,再解压进去,路径问题基本消失。
第二个坑是中文文件名在部分解压工具下乱码,这个多发生在Linux服务器上通过命令行解压RAR的场景。7-Zip的7z命令不支持RAR文件名编码转换,因为RAR内部并没有编码标记,最稳的方式是在Windows上用WinRAR解一遍,确认文件名正常后整体拷到服务器。真出现乱码就不要靠猜,找源头重新要一份干净包,猜乱码文件名是拿大量时间换不确定性,不划算。
分卷压缩不常见,但历史数据池里流传过。看到.part1.rar这类后缀时,把全部分卷放在同一目录,从.part1开始解压。缺任何一个分卷都会报“缺少卷”,分卷文件校验是强制的,不要试图用其他目录里的同名文件补位。
提示:偶尔有人搜“rar password cracker”想破解加密的SHP包。行政区划数据一般不会设置密码,遇到密码错误先检查下载的包是否完整、文件名大小写是否对得上。确认加密又确实需要这份数据,正确路径是联系数据提供方拿密码,暴力破解既不合适也不具备效率。
2.2 SHP由多个文件组成:扩展名各司其职
解压完之后,看到后缀各异的文件不要按扩展名随手删。SHP至少由三个文件组成,发布方还会额外带几个辅助文件,下表把每个扩展名的职责和缺失后果列清楚。
| 扩展名 | 作用 | 缺失后果 |
|---|---|---|
| .shp | 要素几何本体,点线面坐标全在这里 | 缺了就没法用 |
| .shx | 几何索引,记录每个形状的存储偏移量 | 缺了多数软件拒绝打开 |
| .dbf | 属性表,字段名和记录值全在这里 | 缺了只剩图形没有属性 |
| .prj | 坐标系描述,WKT格式的文本 | 缺失时软件无法自动识别坐标系 |
| .cpg | 属性表编码声明,如UTF-8、GBK | 缺失时中文属性极易乱码 |
| .sbn/.sbx | 空间索引,编辑时自动生成 | 删除不影响读取,软件会重建 |
一个完整可用的SHP,.shp、.shx、.dbf三件缺一不可;.prj和.cpg影响坐标系识别与中文显示,拷贝给别人时也必须一起带。拿到压缩包后,先把全部文件解到同一目录,然后按主文件名分组核对,确认每套SHP是否齐了这五个同名不同缀的文件。缺.prj的SHP基本等于半残品,加载后坐标系全靠猜,做面积量算和坐标转换时最容易出鬼;缺.cpg则属性表中文打开必是乱码。
2.3 用GDAL批量体检各区县SHP
不用打开ArcMap或QGIS,命令行里用GDAL就能快速确认每个区县SHP的几何类型、要素数量、范围、坐标系和属性字段。这个动作适合拿到包之后的第一件事,一次性掌握全局,而且为后面第3章的合并和第4章的坐标转换提前暴露问题。
# 遍历数据根目录下所有shp,输出关键描述行 for f in /d/gisdata/changjiang/*/*.shp; do ogrinfo -so "$f" | grep -E "Layer name|Geometry|Feature Count|Extent|PROJCRS|GEOGCRS" done逻辑说明:循环遍历长江经济带目录下每个子文件夹里的shp文件,ogrinfo -so表示只输出概要,不逐条展开要素;grep把图层名、几何类型、要素个数、范围框和坐标系这几行关键信息过滤到终端。一次执行就能看出这批数据是Polygon还是MultiPolygon、坐标系是CGCS2000还是WGS84,以及整个流域是否落在合理的经纬度区间内。
参数说明:
-so:summary only,不加的话会把每条要素的属性都打印出来,几十个县直接刷屏几千行Feature Count:一个县的SHP正常是1个面要素,如果这里显示几百上千,说明文件里装的其实是乡镇或村级边界,粒度比标题写的细PROJCRS:投影坐标系,带单位,说明数据已经做过投影变换;GEOGCRS:地理坐标系,经纬度,两类混在一起合并时会产生明显错位
如果本机还没装GDAL,Windows下可以用OSGeo4W安装包,装完打开OSGeo4W Shell运行命令;或者用conda装conda install -c conda-forge gdal。GDAL装好之后,第3、4、5章的批量处理全部可以复用。
3. 把各区县SHP合并成一张长江经济带区县图层
体检过了,数据整齐,接下来是多数人的核心需求:把散落在几十个文件夹里的区县边界合并成一张长江经济带区县面图层。这里有一个非常容易被混淆的选项:合并(Merge)和融合(Dissolve)。Merge是把多个要素类拼到一个新输出,每行要素及其属性原样保留;Dissolve是按照某个字段把几何形状融合,内部边界被打通。搜“shp只保留外边界线”的人,要的是后者。
3.1 合并之前先分清Merge与Dissolve
很多人的业务场景其实是两种不同的目标。做区县经济统计,每个县必须是独立图斑,属性里保留自己的名称和代码,这是Merge干的事。画一张长江经济带整体轮廓图,不需要内部县界,只要一条干净的外包络线,这是Dissolve干的事。两者顺序不能反:先Merge成一张带全部县的图层,再按需要的字段Dissolve掉内部边界,得到长江经济带或各省的外轮廓。
Merge完成的输出,属性表里每一行代表一个县,字段来自多个输入,缺字段自动填空。Dissolve通常按“省份”或“地市”字段融合,字段值相同的要素边界打通,输出要素数量等于字段取值个数。如果全部要素不选任何字段直接Dissolve,就得到整个长江经济带的一个外轮廓面,后续做裁剪掩膜非常实用。
3.2 用ogrmerge.py批量合并的命令与参数
GDAL自带一个python脚本ogrmerge.py,比手动写循环加ogr2ogr -append省事,支持目录递归匹配,适合几十个县文件的批量操作。
# 递归合并所有子目录下的shp为一个图层,保留源文件路径字段 ogrmerge.py -f GeoJSON -single \ -o /d/gisdata/changjiang_merged.geojson \ /d/gisdata/changjiang -lco RFC7946=NO \ -src_layer_field_name source_name逻辑说明:-f GeoJSON指定输出格式为GeoJSON而不是Shapefile,原因是合并几十个县的属性字段千奇百怪,GeoJSON对长字段名和中文内容保留得比dbf干净,而且单文件输出,后续转其他格式方便。-single让所有输入文件输出到同一个图层,-src_layer_field_name source_name在输出属性表里增加一个source_name字段,记录每个要素来自哪个原始文件,排查数据来源时可以直接按这个字段过滤。
参数说明:
-single:不加这个参数,输出GeoJSON会变成多图层结构,很多下游工具加载时只认第一个图层,要素会缺漏-o:输出路径,所在目录要存在,GDAL不会自动创建多级目录-lco RFC7946=NO:让输出坐标顺序保持为X,Y,兼容ArcMap等老软件-src_layer_field_name:自动附加源文件名字段,建议设成短英文,属性表列宽可控
如果坚持输出Shapefile,把-f改成ESRI Shapefile,输出路径扩展名写成.shp,但dbf格式对字段长度有10字符上限,中文长字段名会被截断,这是格式本身的约束,不是GDAL的缺陷。所以前面优先选GeoJSON,绕开这条限制。
3.3 ArcToolbox里的Merge操作与常见误用
只装了ArcMap、不想碰命令行的场景,ArcToolbox里的Merge工具也能完成。位置在ArcToolbox > Data Management Tools > General > Merge。输入要素逐个添加或通过添加文件夹一次性选入,输出位置填目标geodatabase或文件夹,字段映射保持默认即可,默认策略是取第一个输入源的同名字段。
与ogrmerge相比,ArcToolbox的Merge不会自动记录每个要素来自哪个文件,也没有目录递归,几十个县的shp要一个人工添加。超过10个输入的批量任务,建议直接用命令行跑GDAL,省时且结果可重复审计。Merge只是要素拼接,不处理几何相交;Union会对相交区域做拓扑分解,代价是要素数量暴增。区县SHP如果来源数据本身存在县与县边界重叠,Merge之后重叠部分依然存在,Union则会切成碎片,两个工具解决的问题完全不一样。
注意:做面积汇总之前,务必先确认相邻县之间没有重叠和缝隙。长江经济带涉及几十个县的接边,投影切换和制图综合很容易造成1米量级的接边误差,这种误差在肉眼看图时发现不了,但会在面积统计时变成可察觉的偏差。
4. 统一坐标系、shp转txt与属性连接:让区县数据真正可用
合并只是几何层面的拼接。真正让长江经济带区县SHP变成可分析资产,要过三关:坐标系统一、坐标文本导出、外部统计属性挂接。
4.1 坐标系统一:CGCS2000与WGS84混装的处理
不同来源的区县SHP坐标系不统一是常态。有的沿用CGCS2000高斯克吕格投影,有的经过一次格式转换变成了WGS84经纬度,还有的从公开地图服务导出时直接变成了Web墨卡托。如果只是当底图看,不量算面积距离,差异勉强能接受;一旦做面积统计、缓冲区或叠加分析,坐标系不统一的结果就是各算各的。最稳妥的做法是先全部统一到一个基准地理坐标系,再做后续操作。
# 批量把区县SHP转成CGCS2000地理坐标系并指定UTF-8编码 for f in /d/gisdata/changjiang/*/*.shp; do out=$(echo "$f" | sed 's|changjiang|changjiang_zh|; s|\.shp$|_4490.shp|') ogr2ogr -overwrite -t_srs EPSG:4490 "$out" "$f" -lco ENCODING=UTF-8 done逻辑说明:循环遍历每个区县shp,用ogr2ogr做投影转换,输出到另一个目录,同时强制把属性表写成UTF-8编码。-t_srs EPSG:4490指定目标坐标系为CGCS2000地理坐标系,源坐标系不管是什么,输出统一到这里。-lco ENCODING=UTF-8在创建输出dbf时声明字符编码,避免中文属性再次变成乱码。跑完后用第2.3节的ogrinfo命令抽查几个文件,确认输出均为4490,再进入后续合并或分析。
参数说明:
-overwrite:输出文件已存在时直接覆盖,避免重复执行报错-t_srs EPSG:4490:CGCS2000地理坐标系,全国范围不涉及跨带问题;要做面积量算的话,按所在经度带换成EPSG:4521等投影坐标系-lco ENCODING=UTF-8:有些数据集属性是GBK,这一步会读源文件自带编码并转写为目标编码,不必手动指定源编码
长江经济带东西跨度大,涉及多个投影分带,跨带县界接边处的图形在转投影后容易出现微小变形。只看形态用4490;做精确面积统计,建议按县逐个用其所在分带的高斯克吕格投影,统计完再汇总结果,而不是让所有县共用同一个投影带号。
4.2 shp转txt:把区县边界坐标导出成文本
把SHP边界导出成txt是很多业务系统的真实需求,例如做动态地图的原生路径数据、三维可视化平台用的轮廓点集,或者直接交换给不支持矢量格式的后端程序。本质是读取几何对象,把外环坐标按顺序序列化输出。
from osgeo import ogr import json ds = ogr.Open(r"D:\gisdata\changjiang_merged.shp") lyr = ds.GetLayer(0) with open(r"D:\gisdata\changjiang_bounds.txt", "w", encoding="utf-8") as fp: for feat in lyr: row = feat.items() name = row.get("NAME") or row.get("name") or "未知" geom = feat.geometry() if geom is None: continue if geom.GetGeometryName() == "MULTIPOLYGON": for i in range(geom.GetGeometryCount()): part = geom.GetGeometryRef(i) fp.write(f"{name}|{json.dumps(part.GetPoints())}\n") else: fp.write(f"{name}|{json.dumps(geom.GetPoints())}\n") del ds逻辑说明:用Python的GDAL绑定打开合并好的SHP,逐要素读取几何对象。先用GetGeometryName()判断是Polygon还是MultiPolygon。MultiPolygon说明这个县的政区包含飞地或江心洲,如果不遍历子多边形,输出就会漏掉部分边界。输出文本每行是“县名|坐标JSON数组”的结构,坐标JSON数组是一组[x, y]对,后续其他程序用json.loads就能还原整条边界。
参数说明:
feat.items():把整行属性转成字典并取值,比硬编码字段名更稳,因为每个来源的SHP字段名都不一样GetGeometryRef(i):取第i个子面坐标,序号从0开始json.dumps(part.GetPoints()):把坐标列表序列化成JSON文本,默认只有XY,原始几何带高程时要改用GetPoint(i)逐个取z值
导出的txt可以对接任意下游。做三维瓦片、渔网分割、道路线性参考的坐标预处理,走的都是同样的提取逻辑,区别只在输出格式。这里的脚本稍作改动,把json.dumps换成WKT文本或二进制数组,就能适配更多系统。
4.3 用区县编码连接统计数据
合并好的SHP属性表里通常有行政区划代码字段,外部Excel统计表也按区县编号建了口径,两者的连接就非常干净。代码是唯一稳定键,同名县在不同年份可能叫法不同,同名的概率远大于同名代码,因此优先用代码做JOIN,县名只做展示。
-- 在PostGIS中按行政区划代码连接统计表 SELECT a.name, a.geom, b.gdp, b.population FROM changjiang_shp a JOIN county_stats b ON a.adcode = b.county_code WHERE b.year = 2023;逻辑说明:adcode是SHP里的行政区划代码字段,county_code是统计表里同含义的字段,两边编码规则一致时直接等值连接。WHERE b.year = 2023按年份过滤,同一张表有多年的数据时不加这个条件会产生重复行。不走数据库的场景,ArcMap里用右键图层 > Joins and Relates > Join,字段选行政区划代码,另一张表选统计表,连接类型选“Keep all records”保留SHP全部要素。
| 字段名 | 建议类型 | 说明 |
|---|---|---|
| adcode | 字符串TEXT | 县级行政区划代码,不要用整数,前导0会丢 |
| name | 字符串 | 区县官方名称,统一口径 |
| province | 字符串 | 所在省级单位,用于后续分类汇总 |
| year | 整数 | 数据年份,边界跨年更新时必须带 |
行政区划代码存成字符串而不是整数,是很多统计分析翻车的根源。像“110101”这种以0开头的代码,存成整型后前导0消失,JOIN匹配立刻失败或错到其他县。建表一开始就定义成TEXT类型,后面省掉大量排查时间。
外部统计表如果只有经纬度坐标没有区县归属,要先把Excel导入ArcMap生成临时点要素,再做空间连接,方法是用Add Data > XY Data选择经纬度字段生成图层,然后右键图层执行Spatial Join,目标图层选长江经济带区县面,把每个点所属县的代码和名称写入点图层属性。这样生成shp文件的速度快,且不用手写代码,适合一次性临时分析。
5. 拓扑检查、修复与干净RAR再交付
合并、连接、转换都完成以后,还有一个容易跳过但直接影响交付质量的环节:拓扑检查。区县SHP合并后常见三类几何问题:相邻县边界不重合出现细缝、边界重叠覆盖、以及多部件几何被拆成孤立记录。细缝和重叠会造成面积统计偏差,多部件则可能是长江里的江心洲这类合理情况,要区分对待。
5.1 用Python检查无效几何
from osgeo import ogr ds = ogr.Open(r"D:\gisdata\changjiang_merged.shp") lyr = ds.GetLayer(0) bad = [feat.GetFID() for feat in lyr if feat.geometry() is None or not feat.geometry().IsValid()] print(f"无效几何FID列表:{bad}")逻辑说明:遍历所有要素调用IsValid(),返回False的要素记录FID后再逐个定位。修补方式有两种:返回原各区县SHP重新合并,跳过被破坏的个别县;或在ArcMap的拓扑编辑工具中手动修正边界。跨省县界出现小于1米的接边缝隙,属于投影切换和制图综合的正常产物,不需要手动修,后续面积分析时用1米缓冲吞掉缝隙即可。
5.2 重新打包RAR并核验完整性
数据整理完成,准备交付或归档,用低压缩率快速重打包RAR。SHP几何结构紧凑,高压缩率收益微乎其微,反而拖慢解压速度。
# 整目录打包,不保留源路径层级 rar a -m1 -ep -idq /d/gisdata/changjiang_final.rar /d/gisdata/changjiang_final/逻辑说明:-m1是最低压缩级别,速度快;-ep在压缩时不记录源路径层级,别人解压出来直接平铺在目标目录,不会套出多层文件夹。交付前用ogrinfo把关键字段核一遍,确认四件事:要素数量等于县级单位数量、属性中文正常、坐标系为约定的EPSG:4490、source_name字段内容完整。这四步做完,压缩包才算真正可以发出去,对方拿到手解压加载直接出图,不用再为坐标系偏移或属性乱码回头找你。
本文还有配套的精品资源,点击获取