简介:这份2024年安徽省村级(居委会)行政区划shp数据集面向GIS从业者、空间数据分析人员及需要基层行政边界的研究者,提供覆盖省、市、县、乡、村五级行政边界的矢量数据,采用WGS1984坐标系,属性字段包含村、乡镇、县、市、省名称,可直接用于地图制图、空间统计、区域规划与人口经济数据关联分析。压缩包共34个文件,约217.02MB,以shp、shx、dbf、prj为核心,分别承载几何图形、索引、属性表与投影信息,并附带xml、sbx、sbn、cpg等辅助文件,保证在ArcGIS、QGIS等平台中稳定读取与空间索引加速。目前已有253人学习下载。数据层级完整、字段命名规范,适合作为基层治理研究、城乡规划、POI落位与专题图制作的基础底图,也可用于行政单元汇总与空间连接操作,减少自行采集与清洗边界的工作量。
1. 村级行政区划 shp 数据:从一份 2024 年安徽数据包说起
如果你做过 GIS 相关的数据分析,大概率遇到过这样的场景:项目需要精确到村一级的边界数据,用来做人口估算、物流网点覆盖分析、或者农业补贴发放范围核定,结果翻遍公开渠道,能拿到的往往只到区县一级。乡镇边界已经算稀缺资源,村级(居委会)行政区划更是难找。2024 年安徽省村级行政区划 shp 数据集,解决的正是这个断层问题——它把安徽全省的村级行政单元边界以 shapefile 格式组织起来,让需要做精细化空间分析的人有了可用的底图。
这份数据适合三类人:一是做国土空间规划或乡村振兴相关研究的,需要村级尺度做统计单元;二是做商业选址、物流配送范围计算的,村级边界比区县更贴近实际服务半径;三是做数据可视化或地图产品的,村级边界能显著提升地图的信息密度。但拿到 shp 文件只是第一步,坐标系对不对、属性字段全不全、拓扑有没有问题,才是决定这份数据能不能真正用起来的关键。下面按实际使用流程,把从数据检查到落地分析的完整路径拆开讲。
2. 拿到 shp 先别急着加载:坐标系与属性字段的检查方法
2.1 为什么坐标系是第一个要确认的参数
Shapefile 本身不存储坐标系信息,而是依赖同目录下的 .prj 文件来定义。很多人在拿到数据后直接拖进 QGIS 或 ArcGIS 就开始画图,结果发现和底图对不上,或者面积计算结果离谱,根源往往就在坐标系上。安徽省常用的坐标系有两类:地理坐标系如 GCS_WGS_1984(EPSG:4326),投影坐标系如 CGCS2000 3-degree Gauss-Kruger zone 39(EPSG:4547)或 WGS_84 UTM Zone 50N(EPSG:32650)。如果 .prj 文件缺失或内容为空,软件会默认按未知坐标系处理,后续所有空间运算都不可靠。
检查方法很简单,用 Python 的 geopandas 读一下就能看到:
import geopandas as gpd # 读取 shp 文件,注意路径不要有中文 gdf = gpd.read_file(r"D:\data\anhui_village_2024\anhui_village.shp") # 查看坐标系信息 print("CRS:", gdf.crs) # 查看数据范围和要素数量 print("要素数量:", len(gdf)) print("边界范围:", gdf.total_bounds) # 查看属性表字段 print("字段列表:", gdf.columns.tolist()) print(gdf.head(3))这段代码做了四件事:读取文件、输出坐标系、输出要素总数和四至范围、列出所有属性字段。如果gdf.crs返回 None,说明 .prj 文件有问题,需要手动指定坐标系。如果返回的是一个投影坐标系,而你需要做面积统计,那可以直接用;如果需要和经纬度底图叠加,则要转换到地理坐标系。
参数说明:gpd.read_file()支持直接读取 shp 及其关联文件(.dbf、.shx、.prj),路径中如果有中文,建议用原始字符串r""避免转义问题。total_bounds返回的是[minx, miny, maxx, maxy],可以用来快速判断数据范围是否覆盖安徽全省(安徽大致经度范围 114.9°E–119.6°E,纬度范围 29.4°N–34.6°N)。
2.2 属性字段决定了你能做什么分析
村级 shp 数据的价值不仅在于边界,更在于属性表里挂了什么信息。常见的关键字段包括:村级行政区划代码(通常 12 位或 17 位)、名称、所属乡镇、所属区县、城乡分类代码等。城乡分类代码尤其重要,它区分了主城区、城乡结合区、镇中心区、乡中心区、村庄等类型,直接影响后续按城乡分组统计的逻辑。
用 pandas 快速统计字段分布:
# 查看关键字段的唯一值数量 for col in ['NAME', 'TOWN', 'COUNTY', 'URBAN_RURAL']: if col in gdf.columns: print(f"{col}: {gdf[col].nunique()} 个唯一值") print(gdf[col].value_counts().head(5)) print("---")如果发现某个字段全是空值或唯一值数量异常少,说明数据在整理过程中可能丢失了信息。比如城乡分类代码如果只有一两种取值,那按城乡分组分析就没有意义。这一步花五分钟,能省掉后面返工的两小时。
提示:不同来源的 shp 数据字段命名不统一,有的用拼音缩写,有的用英文,有的用中文。建议先
print(gdf.columns.tolist())看清楚再操作,不要凭经验猜字段名。
3. 用 geopandas 做村级边界清洗与拓扑修复
3.1 常见的几何问题与检测手段
村级边界数据因为来源多样,经常存在几何错误:自相交、重复节点、缝隙、重叠等。这些问题在简单可视化时看不出来,但一旦做空间叠加分析(比如用村级边界裁剪土地利用数据),就会导致结果错乱甚至程序报错。geopandas 提供了is_valid属性来检测几何有效性:
# 检测无效几何 invalid = gdf[~gdf.geometry.is_valid] print(f"无效几何数量: {len(invalid)}") # 查看具体错误类型 from shapely.validation import explain_validity for idx in invalid.index[:5]: print(idx, explain_validity(gdf.loc[idx, 'geometry']))explain_validity会返回具体的错误原因,常见的有 "Self-intersection"(自相交)、"Ring Self-intersection"(环自相交)、"Hole lies outside shell"(孔洞在壳外)等。知道原因后,修复就有针对性了。
3.2 批量修复与面积字段重算
最通用的修复方法是buffer(0),它对大多数自相交和重复节点问题都有效:
# 备份原始几何 gdf['geometry_raw'] = gdf['geometry'].copy() # 修复无效几何 gdf['geometry'] = gdf['geometry'].buffer(0) # 再次检测 still_invalid = gdf[~gdf.geometry.is_valid] print(f"修复后仍无效: {len(still_invalid)}") # 重算面积(投影坐标系下单位为平方米,转为平方公里) gdf['area_km2'] = gdf['geometry'].area / 1e6 print(gdf['area_km2'].describe())buffer(0)的原理是把几何向外缓冲 0 距离,这个过程会触发 GEOS 库的几何重建,从而消除自相交。但要注意,buffer(0)对某些复杂几何可能产生意外结果,比如把原本相连的多边形拆成多个部分。所以修复后要检查要素数量是否变化,如果变了,说明有几何被拆分,需要进一步处理。
面积字段重算后,用describe()看一下分布,如果出现面积为 0 或异常大的值,说明对应几何有问题。安徽村级单元的面积一般在几平方公里到几十平方公里之间,如果出现几百平方公里的村级单元,大概率是几何合并错误。
注意:
buffer(0)会改变原始几何,建议先备份geometry_raw字段,方便对比和回退。
4. 避坑:村级 shp 数据使用中的五个血泪教训
4.1 编码问题导致属性表乱码
现象:用 ArcGIS 打开 shp 后,属性表里的中文名称显示为乱码或问号。原因:shp 的 .dbf 文件默认使用系统编码,中文 Windows 下可能是 GBK,而 QGIS 或 Python 默认按 UTF-8 读取。解决:在 geopandas 中读取时指定编码gpd.read_file(path, encoding='gbk'),或者在 QGIS 中通过「图层属性 → 源 → 数据源编码」改为 GBK。如果数据要长期使用,建议用gdf.to_file(path, encoding='utf-8')重新导出为 UTF-8 编码。
4.2 村级代码不统一导致关联失败
现象:用村级代码和统计数据进行表关联时,匹配率很低。原因:不同年份、不同来源的村级代码可能不一致,比如有的用 12 位统计用区划代码,有的用 17 位城乡分类代码,还有的因为行政区划调整导致代码变更。解决:关联前先检查两边的代码长度和格式,必要时截取前 12 位或前 9 位做匹配。对于行政区划调整过的区域,需要手动建立映射表。
4.3 边界重叠导致面积重复计算
现象:把各村面积加总后,发现总和大于所属区县的官方面积。原因:相邻村级单元之间存在边界重叠,或者飞地处理不当。解决:用gdf.overlaps()检测重叠对,对重叠区域做裁剪或合并。更彻底的方法是做一次拓扑检查,用gdf.geometry.unary_union合并所有边界后重新切分,但这会改变原始边界,需谨慎。
4.4 坐标系误判导致面积偏差巨大
现象:计算出的村级面积比实际小了几个数量级。原因:数据实际是地理坐标系(度),但被当作投影坐标系(米)计算面积。解决:先用gdf.crs.is_geographic判断,如果是 True,说明是地理坐标系,需要先投影到合适的投影坐标系再算面积。安徽地区建议用 EPSG:4547 或 EPSG:32650。
4.5 数据现势性与行政区划调整不同步
现象:分析结果和最新统计公报对不上。原因:2024 年的数据可能反映的是 2023 年底或更早的行政区划状态,而期间可能发生了村级合并、拆分或更名。解决:使用前对照安徽省民政厅发布的行政区划调整公告,确认数据现势性。如果分析精度要求高,需要手动更新调整过的村级单元。
5. 从村级边界到分析结果:空间叠加与统计的进阶技巧
5.1 用村级边界做统计单元的空间连接
拿到村级边界后,最常见的操作是把点数据(如 POI、农户位置)或栅格数据(如人口格网、夜间灯光)汇总到村级单元。以点数据为例,用sjoin做空间连接:
# 读取点数据 points = gpd.read_file(r"D:\data\poi_anhui.shp") # 确保坐标系一致 points = points.to_crs(gdf.crs) # 空间连接:每个点匹配到所在的村级单元 joined = gpd.sjoin(points, gdf[['geometry', 'VILLAGE_CODE', 'NAME']], how='left', predicate='within') # 按村级单元统计点数量 count_by_village = joined.groupby('VILLAGE_CODE').size().reset_index(name='poi_count') # 合并回村级边界 result = gdf.merge(count_by_village, on='VILLAGE_CODE', how='left') result['poi_count'] = result['poi_count'].fillna(0)predicate='within'表示点完全落在多边形内部才匹配。如果点恰好落在边界上,可能匹配不到,这时可以用predicate='intersects',但要注意一个点可能匹配到多个多边形。how='left'保证所有点都保留,匹配不到的点的VILLAGE_CODE为空。
5.2 用村级边界裁剪栅格并分区统计
如果要做人口密度或土地利用分析,需要把栅格数据按村级边界分区统计。用rasterstats库可以一行搞定:
from rasterstats import zonal_stats # 分区统计:均值、总和、最大值 stats = zonal_stats(gdf, r"D:\data\population_2024.tif", stats=['mean', 'sum', 'max'], geojson_out=False) # 转为 DataFrame 并合并 import pandas as pd stats_df = pd.DataFrame(stats) result = pd.concat([gdf.reset_index(drop=True), stats_df], axis=1)zonal_stats的第一个参数是矢量边界,第二个是栅格路径。stats指定要计算的统计量。注意栅格和矢量的坐标系必须一致,否则结果会错位。如果栅格很大,可以加nodata参数排除无效值。
5.3 村级边界的简化与可视化优化
村级边界数据在省级尺度下可视化时,节点太多会导致渲染卡顿。可以用simplify做几何简化:
# 简化几何,容差根据尺度调整 gdf_simplified = gdf.copy() gdf_simplified['geometry'] = gdf_simplified['geometry'].simplify(tolerance=0.001, preserve_topology=True) # 导出为 GeoJSON 用于 Web 可视化 gdf_simplified.to_file(r"D:\data\anhui_village_simplified.geojson", driver='GeoJSON')tolerance的单位和坐标系一致,地理坐标系下 0.001 度约等于 100 米。preserve_topology=True保证简化后不会产生自相交。导出 GeoJSON 时注意文件大小,安徽全省村级边界简化后通常在几十 MB 级别,适合 Web 端加载。
我自己的习惯是:拿到任何 shp 数据,先花十分钟做坐标系确认、几何有效性检查和面积重算,这三步做完再开始正式分析。看起来慢,实际上省掉了后面反复排查问题的时间。希望帮到你。
本文还有配套的精品资源,点击获取