
简介全国县级行政区划shp文件面向GIS从业者、地理信息专业学生及区域研究人员提供中国全部县级行政区域的精确边界数据可用于地图制作、人口统计、资源管理、城市规划与灾害响应等空间分析场景。资源包共14个文件约29.94MB以shp、shx、dbf三类核心文件为主分别承载几何边界、空间索引与属性数据另含prj投影定义、xml元数据及sbx、sbn空间索引文件采用GCS_WGS_1984经纬度坐标系可直接在ArcGIS、QGIS等主流软件中打开、编辑与分析。目前已有3477人学习下载。借助这套数据读者可完成投影转换、数据裁剪、缓冲区分析等操作并与人口密度、地形地貌、交通网络等图层叠加支撑区域研究与规划决策是理解中国地理空间格局的实用基础数据。1. 县级行政区划 shp 文件从“找不全”到“一把过”的落地笔记做区域统计、选址分析或者地图底图的时候很多人卡在第一步手头只有全国省界想拆到县一级要么字段缺、要么边界对不上、要么属性表里连行政区代码都没有。我最近把一份全国县级行政区划 shp 文件完整跑了一遍从字段结构到坐标系再到和业务数据挂接踩了几个不大不小的坑。这份资源解决的就是“县级粒度底图从哪来、怎么用、怎么保证能挂上自己的数据”这件事。适合做 GIS 分析、数据可视化、区域报表的从业者也适合刚接触空间数据、需要一份能直接上手底图的新手。下面按我实际拆包的顺序把能复现的步骤和参数选择讲清楚。2. 拆开这份 shp字段、坐标系与几何类型怎么读拿到一个 shp 文件别急着往 QGIS 或 ArcGIS 里拖。先搞清楚三件事它是什么几何类型、用的什么坐标系、属性表里有哪些字段。这三样决定了后面能不能直接算面积、能不能和你的业务表关联、能不能做空间查询。2.1 用 Python 快速体检 shp 文件我一般先用geopandas做一次“体检”比在桌面软件里点来点去快得多。下面这段代码会输出几何类型、坐标系、字段名、记录数和前几行属性。import geopandas as gpd # 读取 shp 文件注意路径不要带中文和空格 gdf gpd.read_file(./data/county_boundary.shp) # 基本信息 print(几何类型:, gdf.geom_type.unique()) print(坐标系:, gdf.crs) print(字段列表:, gdf.columns.tolist()) print(记录数:, len(gdf)) # 看前 3 行属性确认行政区代码和名称字段 print(gdf.head(3).drop(columnsgeometry))逻辑说明geom_type告诉你里面是 Polygon 还是 MultiPolygon。县级行政区划经常出现 MultiPolygon因为一个县可能包含岛屿或飞地。crs是坐标系常见的是 EPSG:4326经纬度或 EPSG:4490CGCS2000 地理坐标。字段列表里重点找行政区代码可能是adcode、code、xzqhdm之类和名称字段。参数说明gpd.read_file默认用 pyogrio 或 fiona 引擎如果报编码错误加encodingutf-8或encodinggbk试。路径尽量用英文Windows 下中文路径偶尔会让底层驱动读不到。2.2 坐标系选型别在 4326 上直接算面积这是血泪经验EPSG:4326 是经纬度单位是度直接拿它算面积得到的是“平方度”没有任何业务意义。要做面积统计、缓冲区分析必须投影到等面积或等距坐标系。常见做法是全国范围用 Albers 等面积投影比如 EPSG:102025 或自定义中央经线 105°省级范围用 UTM 对应带号。如果你只是做展示底图4326 没问题一旦涉及距离和面积先投影。# 投影到 Albers 等面积投影以中国为例中央经线 105 gdf_proj gdf.to_crs(projaea lat_125 lat_247 lat_00 lon_0105 x_00 y_00 datumWGS84 unitsm no_defs) # 现在算面积才是平方米 gdf_proj[area_km2] gdf_proj.geometry.area / 1e6 print(gdf_proj[[name, area_km2]].head())逻辑说明to_crs不改变属性表只重算几何坐标。lat_1和lat_2是双标准纬线中国常用 25°N 和 47°N。算完面积再除 1e6 转平方公里。参数说明如果你的分析只涉及某一个省用该省中央经线的 Albers 或 UTM 更准。不要全国和局部混用同一个投影边缘变形会让你怀疑数据本身有问题。2.3 属性表挂接行政区代码是唯一桥梁县级数据要和你的业务表比如销售额、人口、设备数关联靠的是行政区代码。但这份 shp 里的代码字段名不一定叫adcode可能是code、xzqhdm、district_id。先确认代码位数县级通常是 6 位比如 110101。如果只有 4 位或带省市前缀挂接前要统一。# 假设业务表里也有 6 位行政区代码 biz pd.read_csv(./data/biz_county.csv, dtype{county_code: str}) # 统一 shp 里的代码字段为字符串避免前导零丢失 gdf[adcode] gdf[adcode].astype(str).str.zfill(6) biz[county_code] biz[county_code].astype(str).str.zfill(6) # 挂接 merged gdf.merge(biz, left_onadcode, right_oncounty_code, howleft) print(未匹配上的记录数:, merged[county_code].isna().sum())逻辑说明zfill(6)保证“110101”不会变成“110101”以外的形式也防止 Excel 打开 CSV 时把前导零吃掉。howleft保留所有县级单元未匹配的会显示 NaN方便你排查是代码对不上还是业务表本身缺这个县。参数说明如果未匹配数很多先检查两边代码位数是否一致再检查是否有撤县设区导致的历史代码差异。这类问题没有捷径只能拿代码表逐条对。3. 从 shp 到可用底图裁剪、筛选与导出体检完下一步是把全国数据变成你真正要用的范围。全量县级 shp 动辄几百 MB直接拖进可视化工具会卡。按需裁剪和筛选既省内存也省时间。3.1 按省市筛选用属性查询比空间裁剪快如果你只要某个省的县别用空间裁剪去切直接用属性表筛选更快。前提是属性表里有省代码或省名字段。# 按省筛选假设有 province 字段 gdf_henan gdf[gdf[province].str.contains(河南, naFalse)] print(筛选后县级单元数:, len(gdf_henan)) # 导出为新的 shp gdf_henan.to_file(./output/henan_county.shp, encodingutf-8)逻辑说明str.contains比精确匹配容错高能处理“河南省”“河南”混用。naFalse防止空值报错。导出时指定encodingutf-8避免中文属性乱码。参数说明如果属性表里只有省代码没有省名先用代码表映射。导出 shp 时注意字段名长度限制shp 格式字段名最多 10 个字符超长会被截断建议导出前重命名。3.2 空间裁剪当你只有研究区边界时有时候你手头是一个流域、一个都市圈或者一个自定义多边形没有对应的属性字段。这时候用空间裁剪。from shapely.geometry import box # 定义一个矩形研究区经纬度范围 study_area box(113.0, 34.0, 116.0, 36.0) # 裁剪 gdf_clip gpd.clip(gdf, study_area) print(裁剪后记录数:, len(gdf_clip)) gdf_clip.to_file(./output/clip_county.shp, encodingutf-8)逻辑说明gpd.clip会保留与研究区相交的县级单元并裁掉边界外的部分。如果你只想保留完全落在研究区内的县用gdf[gdf.within(study_area)]。参数说明box的坐标顺序是(minx, miny, maxx, maxy)别写反。裁剪前确保两个数据坐标系一致否则结果会偏移到离谱。3.3 导出 GeoJSON 与 CSV给不同工具留后路shp 不是万能的。前端地图常用 GeoJSON数据分析常用 CSV。同一份数据导出多种格式后面换工具不用重新处理。# 导出 GeoJSON注意指定坐标系 gdf_henan.to_file(./output/henan_county.geojson, driverGeoJSON) # 导出属性表为 CSV去掉几何列 gdf_henan.drop(columnsgeometry).to_csv(./output/henan_county_attr.csv, indexFalse, encodingutf-8-sig)逻辑说明GeoJSON 默认用 WGS84 经纬度如果原数据是投影坐标导出前先to_crs(4326)。CSV 用utf-8-sig是为了 Excel 打开不乱码。参数说明driverGeoJSON是固定写法。如果数据量很大GeoJSON 会膨胀建议先简化几何或只导出需要的字段。4. 避坑与排查县级 shp 最容易翻车的五个地方这一章是我实际用下来最耗时间的部分。很多问题不是数据本身错而是处理方式不对。下面五条按“现象 → 原因 → 解决”写遇到对应情况直接对号入座。4.1 中文属性乱码打开全是问号或方块现象用 QGIS 或 ArcGIS 打开 shp属性表里县名显示为乱码。原因shp 的.dbf文件编码和软件默认编码不一致常见是 GBK 和 UTF-8 冲突。解决在 QGIS 里右键图层 → 属性 → 源把编码改成 GBK 或 UTF-8 试用 Python 读取时显式加encodinggbk。如果导出给别人统一用 UTF-8 并附带说明。4.2 行政区代码前导零丢失现象用 Excel 打开导出的 CSV110101 变成 110101 但 110001 变成 110001更常见的是 110101 变成 110101 没问题但 110001 变成 110001 也没问题——真正的问题是 110101 被存成数字后前导零在位数不足时丢失比如 011101 变成 11101。原因Excel 默认把数字列当数值处理。解决导出 CSV 时用utf-8-sig并提醒对方用“文本”格式导入或者在代码里统一zfill(6)后再挂接。4.3 边界重叠或缝隙相邻县对不上现象把多个县拼起来发现相邻边界有细缝或重叠。原因数据来源不同、精度不一致或者做过简化。解决如果只是可视化缝隙不影响如果要算总面积先做unary_union再算或者用buffer(0)修复几何。注意buffer(0)对某些自相交多边形有效但会轻微改变边界。4.4 坐标系误判地图跑到海里去了现象加载后图层不在中国范围或者和底图对不上。原因把投影坐标当成经纬度或者 crs 定义缺失。解决先用gdf.crs看有没有定义。如果没有根据数据范围判断是 4326 还是投影坐标手动set_crs。如果定义错了用to_crs转不要直接改crs属性。4.5 字段名截断导出后属性列少了一半现象导出 shp 后原本叫county_name的字段变成county_nam。原因shp 格式限制字段名最多 10 个字符。解决导出前重命名字段或者改用 GeoJSON/GPKG 格式这两种没有字段名长度限制。如果必须用 shp提前把字段名控制在 10 字符以内。5. 进阶技巧用县级 shp 做空间聚合与可视化验证数据能用之后真正体现价值的是聚合和验证。这一章讲两个我常用的技巧按省聚合县级数据以及用分级设色快速检查数据质量。5.1 按省聚合从县到省的汇总逻辑如果你有县级业务数据想汇总到省不能简单按省名字段分组求和因为同一个省名可能对应多个县但几何要合并。正确做法是先按省分组再对几何做unary_union。# 按省聚合几何合并数值字段求和 province_gdf gdf_proj.dissolve(byprovince, aggfunc{population: sum, area_km2: sum}) print(province_gdf[[population, area_km2]].head()) # 导出 province_gdf.to_file(./output/province_agg.shp, encodingutf-8)逻辑说明dissolve是 geopandas 里做空间聚合的标准方法by指定分组字段aggfunc指定数值字段的汇总方式。几何会自动合并成该省的整体边界。参数说明如果某个省下面有飞地dissolve会生成 MultiPolygon这是正常的。聚合前确保所有县都属于同一个投影坐标系否则面积汇总会出错。5.2 分级设色验证一眼看出数据有没有问题做完聚合或挂接别急着出图。先用分级设色快速看一眼有没有某个县数值异常大或异常小有没有该有数据的县是空白。import matplotlib.pyplot as plt fig, ax plt.subplots(1, 1, figsize(12, 8)) merged.plot(columnsales, axax, legendTrue, cmapOrRd, missing_kwds{color: lightgrey}) ax.set_title(县级销售额分布灰色为缺失) plt.savefig(./output/check_map.png, dpi150, bbox_inchestight)逻辑说明missing_kwds把没有匹配上业务数据的县标成灰色一眼就能看出是哪些县缺数据。cmap选 sequential 色带适合数值型字段。参数说明dpi150够用再高文件太大。bbox_inchestight去掉多余白边。如果图太卡先筛选再画不要全量渲染。5.3 一个我常犯的错误忘了检查几何有效性有次做空间叠加结果死活对不上排查半天发现是某个县的几何自相交。后来我养成了一个习惯拿到任何 shp先跑一遍is_valid。# 检查几何有效性 invalid gdf[~gdf.geometry.is_valid] print(无效几何数:, len(invalid)) # 修复无效几何 gdf[geometry] gdf.geometry.buffer(0)逻辑说明is_valid返回布尔序列~取反拿到无效的。buffer(0)是常用的修复手段但对复杂自相交可能不完美修复后要再检查一次。参数说明如果无效几何很多别急着全部buffer(0)先看看是不是数据本身有问题。有些无效几何来自坐标精度修复后面积会变做面积统计时要留意。从那以后我每次拿到新的 shp都强制走一遍“体检 → 投影 → 有效性检查 → 挂接验证”这个流程再也没出现过数据对不上的玄学问题。希望帮到你。本文还有配套的精品资源点击获取