news 2026/10/14 15:58:48

中国分省SHP使用指南:坐标系、投影转换与常见问题排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
中国分省SHP使用指南:坐标系、投影转换与常见问题排查

简介:这份资源面向GIS从业者、地理信息专业师生及需要中国行政区划底图的数据分析人员,提供一套完整的中国省级行政区划Shapefile数据,可用于地图绘制、区域统计与空间分析等场景。压缩包共20个文件,约3.27MB,以shp、shx、dbf三类核心文件为主,分别存储几何边界、索引与属性数据,另附txt说明与m脚本,便于在ArcGIS、MATLAB等环境中直接加载与可视化。数据覆盖内地31个省份及台湾省、香港、澳门特别行政区,确保领土完整无遗漏,属性表可支撑人口、经济等专题制图。目前已有1549人学习下载,适合用作区域划分分析、城市规划、交通网络研究及灾害影响评估的基础底图,也可作为教学演示与项目开发的可靠数据源。

1. 拿到「中国完整领土分省SHP.zip」之后,先想清楚三件事

很多做数据可视化、GIS 分析或者地图产品的同行,第一次拿到「中国完整领土分省SHP.zip」这类资源时,第一反应是解压、拖进 QGIS 看一眼,然后直接开始画图。我见过太多人卡在下一步:省级边界对不上、南海诸岛显示不全、投影一换整个图就变形、属性表里连个省名都没有。问题不在数据本身,而在于没搞清楚这份 SHP 到底包含什么、用什么坐标系、边界精度到什么级别。

这份分省 SHP 本质上是一套矢量面数据,通常由 .shp、.shx、.dbf、.prj 四个核心文件组成,有的还会附带 .cpg 指定编码。它解决的核心问题是:让你在本地就能拿到一套可编辑、可裁剪、可叠加的省级行政区划边界,而不是每次去调在线地图接口。适合做专题图、做空间统计、做区域裁剪、做底图叠加的人。但前提是,你得先确认它的坐标系、字段结构和边界口径,否则后面全是返工。

2. 解压后先别急着画图:文件结构与坐标系确认

2.1 一套完整 SHP 到底该有哪些文件

很多人解压完只看到一堆同名不同后缀的文件,不知道哪个能删哪个不能删。我一般会先列一遍目录,确认核心文件齐全。常见做法是用命令行快速看一眼:

# 列出解压目录下的所有文件,确认 SHP 配套文件是否齐全 ls -lh ./china_province_shp/ # 典型输出: # china_province.shp 主几何文件,存坐标 # china_province.shx 索引文件,加速空间查询 # china_province.dbf 属性表,存省名、编码等字段 # china_province.prj 投影定义,决定坐标系 # china_province.cpg 编码声明,常见为 UTF-8 或 GBK

逻辑说明:.shp 和 .shx 必须成对出现,缺一个就打不开;.dbf 决定你能不能按省名筛选;.prj 决定坐标单位是度还是米;.cpg 决定中文省名会不会乱码。参数上,如果 .prj 缺失,QGIS 会提示「未知坐标系」,这时候不要随便选一个,宁可去问数据来源。

注意:如果 .cpg 显示 GBK 而你的工具默认按 UTF-8 读,属性表里的省名会变成乱码,这不是数据坏了,是编码没对上。

2.2 用 QGIS 或 Python 确认坐标系与字段

确认坐标系最直接的办法是用 Python 的 geopandas 读一遍,看 CRS 和字段:

import geopandas as gpd # 读取分省 SHP,注意指定编码,避免中文乱码 gdf = gpd.read_file("./china_province_shp/china_province.shp", encoding="utf-8") # 打印坐标系信息 print("CRS:", gdf.crs) # 打印字段名和前几行属性 print("字段:", gdf.columns.tolist()) print(gdf[["name", "adcode"]].head() if "name" in gdf.columns else gdf.head()) # 打印几何类型和范围 print("几何类型:", gdf.geom_type.unique()) print("范围:", gdf.total_bounds)

逻辑说明:gdf.crs 如果是 EPSG:4326,说明是经纬度坐标,单位是度,适合做全国概览;如果是 EPSG:3857 或其他投影坐标,单位是米,适合做面积计算。字段里常见的有 name(省名)、adcode(行政区划代码)、geometry。参数上,encoding 要根据 .cpg 来定,不确定就试 utf-8 和 gbk 各读一次,看哪个省名正常。

如果 total_bounds 的纬度范围大致在 3°N 到 54°N 之间,经度在 73°E 到 136°E 之间,说明边界范围是完整的。如果少了南海诸岛那一块,纬度下限会偏高,这时候就要检查数据是否包含了完整领土口径。

3. 把分省 SHP 用起来:裁剪、筛选与投影转换

3.1 按省筛选并导出单省 SHP

拿到全国分省数据后,最常见的操作是筛出某一个省做专题图。用 geopandas 一行代码就能搞定:

import geopandas as gpd gdf = gpd.read_file("./china_province_shp/china_province.shp", encoding="utf-8") # 按省名筛选,注意省名要和属性表里完全一致 target = gdf[gdf["name"] == "某省"] # 导出为新的 SHP,注意指定编码 target.to_file("./output/mou_province.shp", encoding="utf-8") print("导出完成,要素数:", len(target))

逻辑说明:筛选条件里的省名必须和 .dbf 里的字段值完全匹配,差一个字都筛不出来。如果属性表里用的是简称而你想用全称,就得先做映射。参数上,to_file 的 encoding 建议和源数据保持一致,避免二次乱码。

3.2 投影转换:什么时候该转,转成什么

经纬度坐标做全国图没问题,但一旦你要算面积、算距离,就必须转成投影坐标。常见做法是转成 Albers 等面积投影,适合全国范围:

import geopandas as gpd gdf = gpd.read_file("./china_province_shp/china_province.shp", encoding="utf-8") # 从经纬度转到 Albers 等面积投影,中央经线 105°E,双标准纬线 25°N 和 47°N gdf_albers = gdf.to_crs("+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +datum=WGS84 +units=m") # 此时面积计算才是准确的 gdf_albers["area_km2"] = gdf_albers.geometry.area / 1e6 print(gdf_albers[["name", "area_km2"]].head()) # 导出投影后的数据 gdf_albers.to_file("./output/china_province_albers.shp", encoding="utf-8")

逻辑说明:Albers 投影的参数里,lat_1 和 lat_2 是双标准纬线,lon_0 是中央经线,这三个参数决定了变形分布。对全国数据,常用 25°N、47°N 和 105°E。参数上,units=m 表示输出单位是米,area 除以 1e6 得到平方公里。如果不转投影直接算面积,得到的是平方度,没有物理意义。

提示:投影转换不可逆地改变几何坐标,但不会改变属性表。转完之后再筛省、再裁剪都没问题,但别再转回经纬度去对在线底图,除非你明确知道自己在做什么。

3.3 用裁剪框提取局部区域

做区域分析时,经常只需要某个矩形范围内的数据。用 shapely 构造裁剪框再求交集:

import geopandas as gpd from shapely.geometry import box gdf = gpd.read_file("./china_province_shp/china_province.shp", encoding="utf-8") # 构造裁剪框,坐标顺序是 (minx, miny, maxx, maxy),这里是经纬度 clip_box = box(110, 20, 120, 30) # 求交集,得到裁剪后的几何 gdf_clip = gdf[gdf.intersects(clip_box)].copy() gdf_clip["geometry"] = gdf_clip.geometry.intersection(clip_box) gdf_clip.to_file("./output/clip_region.shp", encoding="utf-8") print("裁剪后要素数:", len(gdf_clip))

逻辑说明:intersects 先筛出和裁剪框有交集的省,再做 intersection 得到实际裁剪后的几何。参数上,box 的坐标顺序容易写反,记住是 minx, miny, maxx, maxy。如果裁剪框跨了多个省,结果里会保留每个省被裁后的部分,属性表不变。

4. 避坑与排查:分省 SHP 最常见的五个翻车现场

4.1 省名乱码,筛选全失败

现象:用 name 字段筛省时一个都筛不出来,打印属性表发现省名是问号或方块。原因:.dbf 的编码和读取时指定的 encoding 不一致,常见是源数据 GBK 而代码用 UTF-8。解决:先确认 .cpg 内容,再用对应编码读;如果 .cpg 缺失,用 gbk 和 utf-8 各试一次,看哪个能正常显示中文。

4.2 边界对不上在线底图

现象:把 SHP 叠加到在线地图上,省界整体偏移几百米。原因:SHP 用的是某个地方坐标系或旧版基准,而在线底图是 WGS84 或 GCJ02。解决:先确认 .prj 里的 datum,如果是 Beijing54 或 Xian80,需要做基准转换;如果只是偏移,检查是不是把投影坐标当经纬度用了。

4.3 南海诸岛缺失或显示为一个小点

现象:全国图右下角没有南海诸岛,或者只有一个小方块。原因:部分分省数据为了图面整洁,把南海诸岛单独作为一个要素或直接省略。解决:检查属性表里有没有「南海诸岛」相关记录,如果没有,需要单独补充该区域数据,或者确认数据口径是否包含完整领土。

4.4 面积计算结果离谱

现象:算出来的省面积比实际大几十倍或小几十倍。原因:没转投影直接算,得到的是平方度;或者投影参数选错,中央经线偏得太远。解决:全国范围用 Albers,中央经线 105°E,双标准纬线 25°N 和 47°N;单省可以用该省中央经线做高斯克吕格投影。

4.5 导出后文件打不开

现象:to_file 导出成功,但用其他软件打开报错。原因:导出时没指定 encoding,或者目标路径不存在。解决:导出前先创建目录,导出时显式指定 encoding="utf-8",导出后用 geopandas 再读一次验证。

5. 进阶技巧:用分省 SHP 做一套可复用的底图流水线

如果你不是做一次性的图,而是要把分省 SHP 当成长期底图用,我建议把它封装成一个可复用的读取和预处理函数。这样每次换数据源或者换投影,只改参数不改逻辑。

import geopandas as gpd from shapely.geometry import box def load_province_shp(path, encoding="utf-8", target_crs=None): """ 读取分省 SHP,可选投影转换 :param path: SHP 文件路径 :param encoding: 属性表编码,默认 utf-8 :param target_crs: 目标投影,None 则不转换 :return: GeoDataFrame """ gdf = gpd.read_file(path, encoding=encoding) if target_crs: gdf = gdf.to_crs(target_crs) return gdf def filter_by_name(gdf, name_field, name_value): """按省名筛选""" return gdf[gdf[name_field] == name_value].copy() def clip_by_bbox(gdf, minx, miny, maxx, maxy): """按矩形框裁剪""" clip_box = box(minx, miny, maxx, maxy) result = gdf[gdf.intersects(clip_box)].copy() result["geometry"] = result.geometry.intersection(clip_box) return result # 使用示例 gdf = load_province_shp( "./china_province_shp/china_province.shp", encoding="utf-8", target_crs="+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +datum=WGS84 +units=m" ) mou = filter_by_name(gdf, "name", "某省") mou_clip = clip_by_bbox(mou, 110, 20, 120, 30) mou_clip.to_file("./output/mou_clip.shp", encoding="utf-8")

逻辑说明:load_province_shp 把读取和投影转换合并,filter_by_name 和 clip_by_bbox 各自独立,方便组合。参数上,target_crs 传字符串时用 PROJ 格式最灵活,也可以传 EPSG 代码。这套函数的好处是,下次换一份新的分省 SHP,只要字段名一致,代码不用改。

还有一个我常用的技巧:把分省 SHP 的省名和 adcode 单独抽出来存成 CSV,做数据关联时直接 merge,比每次读 SHP 再取属性快得多。

# 抽取省名和编码,存成 CSV 供后续关联 attr = gdf[["name", "adcode"]].drop_duplicates() attr.to_csv("./output/province_attr.csv", index=False, encoding="utf-8-sig")

逻辑说明:encoding="utf-8-sig" 是为了 Excel 打开不乱码。参数上,drop_duplicates 防止一个省多个要素导致重复。这个 CSV 可以当字典用,做数据可视化时按 adcode 关联统计值,比按省名关联更稳,因为省名可能有简称全称的差异。

最后说个我自己的习惯:每次拿到新的分省 SHP,先跑一遍「读—看 CRS—看字段—看范围—筛一个省—转投影—算面积」这七步,确认没问题再往项目里放。这套流程帮我省过至少三次返工。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 15:58:32

禁毒展厅设计施工方案哪家好:禁毒教育基地策划落地与互动设备一体化厂商,易传诚实力领衔

禁毒展厅要做出冲击力,既要有专业内容策划,也要有可靠的施工落地。本文盘点禁毒展厅设计、施工与互动设备一体化厂商,帮助建设单位打造专业震撼的禁毒阵地。TOP 1 陕西易传诚垂直深耕的行业标杆,综合实力更均衡——专业、省心、划…

作者头像 李华
网站建设 2026/10/14 15:58:32

专有云CSB运维实战:从部署到故障排查的全面指南

简介:阿里云专有云企业版V3.7.1的云服务总线CSB运维指南官方文档,主要面向负责专有云环境运维的工程师、系统管理员及架构师,用于掌握CSB从系统架构到日常维护的完整知识体系。资源包含1个PDF文件,整包大小约986KB,内容…

作者头像 李华
网站建设 2026/10/14 15:58:14

show full processlist实战:MySQL慢查询与锁等待排查指南

深夜接到报警,线上一个核心接口的响应时间从平均200毫秒直接飙到了3秒。登录数据库后我二话没说,先执行了show full processlist,很快看到一条update语句在列表里挂了132秒,State列显示Updating。顺着这条线程找到源头&#xff0c…

作者头像 李华
网站建设 2026/10/14 15:57:19

恶意样本分析实战:远控后门从静态特征到动态行为全解析

拿到一个来路不明的可执行文件,第一反应不是双击运行,而是先问一句:它到底是什么?这正是我写这篇“某后门病毒详细分析报告”的初衷。作为安全分析入门的第一课,我用一个实际捕获的远控后门样本,完整演示从…

作者头像 李华
网站建设 2026/10/14 15:57:07

STM32片内Flash读写测试避坑指南:从扇区擦除到掉电保护

简介:这份资源面向嵌入式开发初学者与STM32工程师,聚焦片内Flash非易失性数据存储这一核心技能,帮助解决掉电数据丢失、扇区擦写策略与编程保护等实际问题。压缩包共140个文件,约2.96MB,以34个c源文件与35个h头文件为主…

作者头像 李华
网站建设 2026/10/14 15:56:57

T2000边缘计算模组开箱教程:从上电到跑通第一条NPU推理指令

简介:这份T2000使用简易教程面向华为网管系统的初学者与一线运维人员,帮助零基础用户快速掌握T2000的日常操作与业务排查方法。教程围绕网元管理器与以太网专线业务展开,涵盖展开隐藏路径、确认端口业务状态、查看端口带宽、追踪以太口与业务…

作者头像 李华