
简介压缩包内含第一次至第七次全国人口普查的区县级人口数据以Shapefile矢量格式存储面向需要借助GIS工具开展人口时空分析的科研人员、城市规划者及社会科学研究者。压缩包共7个文件涵盖shp几何边界、dbf属性表、prj坐标系统、sbn/sbx空间索引、shx索引及shp.xml元数据总大小46.62MB解压后可直接在ArcGIS等平台读取分析。已有1174人学习下载数据覆盖历次普查关键指标可用于人口趋势分析、区域差异比较、城市规划参考及社会经济评估等多维场景。借助配套的行政区划矢量边界和规范化属性字段研究者能快速定位区县单元节省数据整理时间聚焦于人口迁移、老龄化等实质性问题的探索。1. 一普到七普shp人口数据包这份zip到底能解决什么做历史人口数据可视化的人大概率都遭遇过这种折磨七普数据网上有干净整洁的 Excel可一普、二普的纸质扫描数据连个带坐标的电子版都难找好不容易拿到一份带行政区划的人口统计表还得自己想办法把它和矢量边界做连接。而“一普到七普shp格式人口数据.zip”恰好把 1953 年到 2020 年七次全国人口普查的人口统计指标直接挂在对应年代的行政区划边界上——省、市、县三级的几何图形与人口字段一起以 shp 组织解压后就能在 QGIS、ArcGIS 或 GeoPandas 里直接读取。这篇文章我从文件结构、字段口径、空间挂接和常见坑四个层面讲清楚怎么把这份数据用稳。适合 GIS 数据处理和社科研究的初级到中级读者也适合被 Excel 统计表反复折磨、想换一条更直接路径的人。2. Shapefile 文件家族与 zip 包的组织方式读数据前先搞懂这几件事2.1 一个 SHP 不是单个文件shp、shx、dbf、prj、cpg 各管什么拿到“一普到七普shp格式人口数据”这类包第一反应是双击 .shp 文件直接打开结果发现什么也打不开或者在 QGIS 里加载后属性表全是乱码。这通常不是数据坏了而是文件家族没带齐或缺失了配置文件。Shapefile 是一个文件集合。最基本的三个文件缺一不可.shp主文件存储几何图形面、线、点。在人口普查场景里通常是一级行政边界的面要素。.shx形状索引文件负责快速定位几何记录没有它读取速度会变得极慢。.dbf属性表文件是 dBase III 格式的数据库人口统计字段都放在这里这也是乱码高发区。以上三个文件缺少任何一个shp 都无法正常打开。此外还常配套两个辅助文件。.prj 文件定义坐标系没有它读数据的软件会把坐标当作本机默认坐标系导致人口数据“飞”到错误的位置.cpg 文件声明字符集内容通常是 UTF-8 或 GBK。很多乱码问题的根源不在 .dbf 本身而在当前软件默认用 UTF-8 去解了 GBK 编码的字符串。在解压之前你完全不知道 prj 和 cpg 是否存在这一点让 shp 数据像个黑匣子。经常遇到的情况是压缩包里只有 .shp、.shx、.dbf 三个文件人口统计字段还在可位置和文字都不可信了。我的建议是拿到压缩包后不要急着双击加载先解压再快速浏览文件清单把缺失项记下来再动手。补充说明一点为什么人口普查数据喜欢用 shp 而不用 GeoJSON 或 KML。七次普查的时间跨度从 1953 年到 2020 年大量历史数据是在 GIS 技术成熟之前以纸质表格形式留存的早期入库时最通用的矢量格式就是 shapefile。dbf 属性表又与关系型数据库的概念天然吻合一个县一行记录、一个字段一个指标处理起来顺手。GeoJSON 虽然便于网络传输但二十年前的县级普查数据处理流程里还没有它的位置shp 由此成了历史人口空间数据的默认承载格式。2.2 为什么用 zip 多期打包解压前的目录规划与编码预判“一普到七普shp格式人口数据.zip”用 zip 打包是很自然的选择因为 shp 是多文件集合正好以目录为单位压缩成一个包。但 zip 不是为中文环境设计的有三件事可以提前预判。第一是压缩包内部目录结构。常见结构有两种一种是按普查年份分目录比如 1953、1964、1982、1990、2000、2010、2020 各一个文件夹每个文件夹里放当年省界、市界、县界的同名文件另一种是全部平铺所有年份的 shp 混在一起。如果是后者解压时一定要小心同名覆盖问题——不同年份的县界文件可能都叫 county.shp全部解压到同一目录后解压的文件会把前面的覆盖掉。这是最隐蔽的翻车现场也是解压这类历史数据包时我最警惕的事。第二是文件名编码。zip 的早期规范只支持 ASCII后来虽然支持 UTF-8但国内大量打包工具用的是 GBK 编码写文件名尤其是 Windows 上的老压缩软件。如果你解压后发现目录和 shp 文件名全是乱码不要先怀疑包损坏先试着用支持指定编码的工具重新解压。Python 的 zipfile 模块处理这种历史编码也有自己的坑实际命令行操作见第三章。第三是嵌套 zip。常见做法是很多制作团队会把每个普查年份再单独压一层形成双层 zip 结构外层解压后会看到一堆二级压缩包。如果只解了外层你会发现真正的 .shp 还淹没在小包里。正式动手前先看总目录结构有没有 .zip 后缀的嵌套项可以省很多事。我一般会在解压前先建一个干净的根目录比如 census_shp然后按年份建子目录把所有文件落位到对应年份。这样既避免了同名覆盖又为后面按年份遍历读取打好了基础。这一步做到位后面加载属性表、做空间连接都会顺畅很多如果贪方便一次性解压遇到同名覆盖就只能从头再来属于典型的没有后悔药吃。3. 用 GeoPandas 跑通最小读取流程从 zip 解压到属性表检查3.1 解压与体检unzip 命令、中文名乱码与文件完整性拿到 zip 之后我一般先在命令行做三步看目录、解压、核对文件清单。在 Linux 或 Git Bash 环境下最顺手的命令如下# 先列出压缩包内部结构不急着解压 unzip -l 一普到七普shp格式人口数据.zip | head -50 # 如果终端里文件名显示为乱码说明打包时用了GBK编码文件名 # 用 -O 参数强制指定编码再解压 unzip -O GBK 一普到七普shp格式人口数据.zip -d ./census_shp/ # 如果本机 unzip 不支持 -O比如 macOS 自带版本用 7-Zip 代替 7z x 一普到七普shp格式人口数据.zip -ocensus_shp这里用 unzip -l 而不是直接解压是为了先看清目录结构和文件层级判断是否存在嵌套 zip 和同名覆盖风险。如果存在二级 zip我会把二级包单独再解一层。指定 -O GBK 可以解决文件名乱码但只在部分平台生效macOS 的 unzip 通常不支持 -O改用 7-Zip 是比较稳的方案。解压之后还需要做一次文件完整性核对。shp 文件集合中同一个逻辑数据集的 .shp、.shx、.dbf 必须放在同一目录、使用相同主名。我会用 find 命令把文件找出来逐个目录确认伴生文件是否齐全# 统计每个目录下的 shp 数量以及同名 dbf 是否有缺失 find ./census_shp -name *.shp | wc -l find ./census_shp -name *.dbf | wc -l ls ./census_shp/1953/county/这个动作能查出不少问题。常见的是某个目录只有 .shp 和 .shx缺了 .dbf属性表完全读不出来或者是 .dbf 存在、.prj 缺失位置信息不可信。体检之后把缺失清单记下来再决定是接受现状还是换一份数据源。把这一步做在前面能省掉后面读一个坏一个、反复解压的重复劳动。我对这类历史人口数据包的习惯是先保证文件家族完整再做后续任何空间分析。3.2 打开 shp 并检查字段GeoPandas 的两个关键参数体检做完用 Python 读 shp 是最常见路径。我推荐 GeoPandas 搭配 pyogrio 引擎读历史 shp 时的兼容性和速度都优于默认的 fiona。最小读取代码如下import geopandas as gpd # 读取县界数据用 pyogrio 引擎显式指定编码为 UTF-8 gdf gpd.read_file( ./census_shp/2000/county.shp, enginepyogrio, encodingutf-8, ) print(gdf.shape) # 行数、列数 print(gdf.columns) # 列名清单 print(gdf.head(3)) # 前三条记录引擎参数和编码参数是这里最关键的两点。pyogrio 是近几年读取速度最快的矢量引擎dbf 这种老格式fiona 可能要花十几秒pyogrio 一两秒就完成。但 pyogrio 对中文字段的默认处理有自己的逻辑如果不显式指定 encoding它可能按系统默认的 UTF-8 去读遇到 GBK 写入的数据就会变成乱码。所以当你发现字段值“人口数”变成“浜哄彛鏁”这类乱码时先尝试把 encoding 改为 gbk 再读一次。另一个容易忽略的是几何列的有效性。历史数据偶尔会出现几何类型错误同一个 shp 里混合了面要素和多边形要素或者坐标范围明显异常。我习惯用两行代码快速检查# 检查几何类型 print(gdf.geom_type.unique()) # 检查坐标范围是否合理以经纬度或国家平面坐标的量级做初判 print(gdf.total_bounds)几何类型检查能在加载后第一时间发现文件是否有损坏或写入异常total_bounds 能发现 .prj 缺失导致的位置漂移。把这两步做完数据能不能用、要不要做清洗心里大概就有数了。不要跳过这一步直接去算人口增长率数据源本身的问题会在后面每一步被无限放大这是处理任何 shp 数据的通用原则。3.3 横向检查数据覆盖度哪些年份缺县、哪些字段为空拿到 shp 并成功读取只是第一关接下来要回答一个更重要的问题这份“一普到七普”的 shp 数据覆盖度到底怎么样。七个普查年份不见得每个年份都有完整的三级数据有些年份可能只有省级有些年份可能缺少个别县。这一步不做后面做跨期对比时口径不一致结果直接作废。我一般会构建一个最简覆盖度索引表用两段代码完成。第一段是按年份遍历所有目录下的县界 shp统计每个文件的行数import os import geopandas as gpd years [1953, 1964, 1982, 1990, 2000, 2010, 2020] for year in years: fp f./census_shp/{year}/county.shp if not os.path.exists(fp): print(year, 缺失) continue gdf gpd.read_file(fp, enginepyogrio, encodingutf-8) print(year, gdf.shape[0], 县) # 检查关键人口字段的空值比例 if total_pop in gdf.columns: print(空值率:, gdf[total_pop].isna().mean())这段代码把每个年份的行数、关键字段空值率打印出来一眼就能看出哪个时期普查数据质量最差。实际操作中早期年份缺县的概率明显更高部分边疆地区的县级单元缺失或合并。遇到缺失先记录后面在第 4 章的跨期对比里再想对齐策略不要直接丢弃那些县级记录不完整的年份。还有一类问题需要警惕字段类型。dbf 没有严格的数字类型一切数值都以字符或数字位宽形式存储。GeoPandas 读取时会做类型推断但“总人口”这类字段在不同年份里有时是整数、有时是浮点数有时甚至是带逗号的字符串。在进入跨期计算之前把人口字段统一转成 float64 是最稳的后面第 4 章的字段映射会一并处理。覆盖度检查和编码检查合在一起构成我面对任何 shp 人口数据的标准开场。宁可在这里多花十分钟不要在得出结果之后再回来说数据有问题。查漏补短的前置动作是这个方向最值得养成的习惯。4. 跨普查年份的字段口径对齐从字段名到行政区划代码的逐层处理4.1 一普到七普字段存在哪些真实差异等你把七个年份的数据都读进来真正的硬骨头才开始显露七次普查的字段名、字段含义、行政区划编码规则差异很大。把这些差异逐个说清楚才好继续动手。第一层差异是字段命名。一普、二普时期的数据是后来录入的属性表字段名往往沿用当年纸质表格的习惯比如“总人口”可能被记为 total、totpop、renkou_count或者干脆是拼音首字母缩写到五普、六普之后字段名逐渐规范但也没有统一国家标准很多数据提供商按自己的业务习惯命名。直接跨年份取同名字段大概率会得到大面积 NaN。第二层差异是统计口径。各次普查对人口的统计范围有差别有的按当年常住人口有的包含了外出人口有的只统计有户籍的人口还有在普查年份里对流动人口做了特殊处理。仅仅是“总人口”这几个字在不同普查年份背后对应的可能并非同一群人。做纵向对比时如果不先弄清这个差异1990 年与 2000 年的数字叠在一起可能出现不合理的突增或骤降。第三层差异是行政区划代码。1953 年还没有标准统计用区划代码县级单元的划分逻辑也与现在大不相同到五普以后12 位统计用区划代码才逐渐成为标准。如果你直接按县名做跨期关联同名不同地、同地不同名的情况比比皆是。比如某些县在 1980 年代拆分成了两个新县有的县被划归别的地级市还有县改区、县改市的变化。比较稳妥的处理方式是找到每个年份对应的 shp 边界基于几何与属性双重信息匹配而不是只靠一个县名字段。下表列出各普查年份常见的属性形态差异普查年份属性字段形态区划代码情况典型注意点一普1953字段少常见拼音或英文缩写无统一标准部分省级数据缺失县名与今差异大二普1964同上无统一标准部分县为空值三普1982中文或拼音混合开始有地区代码注意县改市、新设县四普1990字段渐规范有代码但未统一12位流动人口口径特殊五普2000中英文字段混合12位代码逐渐普及常住人口口径变化六普2010较规范12位代码与七普差异较小七普2020规范12位代码县级空缺较少表格里是常见特征具体到你的包要以实际读出的 columns 和 .cpg 文件为准。我处理这类数据的第一步永远是打印每个年份的列清单再对照表格里的典型形态判断应该映射到哪个标准字段名。4.2 用字段映射表和 12 位区划代码做对齐在正式分析之前第一步永远是建立字段映射表。实际操作我不会直接改原始数据而是为每个年份构建一份标准化字段映射把所有人口字段统一到一套标准命名上。以下代码用来做映射对齐核心是维护一个年份到标准字段名的映射字典再逐年份读取并重命名import geopandas as gpd # 每个年份的原始字段名对应标准字段名 FIELD_MAP { 1953: {county: county_name, population: total_pop}, 1964: {县名: county_name, 人口数: total_pop}, 1982: {NAME: county_name, POP: total_pop}, 1990: {NAME: county_name, TOTAL_P: total_pop}, 2000: {区县名称: county_name, 总人口: total_pop}, 2010: {CNAME: county_name, TOTPOP: total_pop}, 2020: {county: county_name, pop: total_pop}, } def read_standard(year: str): gdf gpd.read_file(f./census_shp/{year}/county.shp, enginepyogrio, encodingutf-8) rename_map FIELD_MAP[year] gdf gdf.rename(columnsrename_map) keep_columns list(rename_map.values()) [gdf.geometry.name] gdf gdf[keep_columns] if total_pop in gdf.columns: gdf[total_pop] gdf[total_pop].astype(float) gdf[year] int(year) return gdf这段代码的关键在 rename_map它是每个年份原始字段与标准字段的对照。实际项目中你可能需要先打印每个年份的 gdf.columns再逐个把对应关系填进去这个动作可以理解成建映射表。注意保留 year 这一列目的是把不同年份的数据纵向堆叠成面板数据对后面时间对比非常重要。字段类型转换也值得留意dbf 里的人口数字可能以字符串形式存储在 astype(float) 这一步之前需要先手动去掉空格和逗号。某些年份总人口字段如果混入了汉字注释比如“未统计”astype 会直接报错此时需要用 pd.to_numeric 的 errorscoerce 做软转换把不合法值变成 NaN后面再做填充或剔除。如果目录里的属性字段名与我给的示例完全不同不要慌对照 4.1 的表格和实际列名重新填映射即可。这条路径的核心思想是统一字段语义之后才能进入跨期计算否则后续所有 groupby 和 merge 都在比较不存在可比性的数据。4.3 行政区划漂移变化让跨期可比性成为一道必答题字段名统一了区划漂移的问题依然存在。1953 年的县界和 2020 年的县界不可能完全相同用同一套边界去承载不同年份的人口会造成系统性误差。这里要做一个选择是保留各自年份的原始边界做分年制图还是统一到某个参考年份的边界做跨期计算。前者展示历史状态最真实但不便于纵向对比后者便于做增长率计算和图表比较却需要你额外准备一份统一的参考矢量边界并且对人口数按参考边界做空间重分配。做跨期对比时常见做法是选择 2020 年七普的县界作为参考坐标系然后把更早年份的县级人口数据挂接到七普县界上。挂接逻辑可以按几何重叠面积加权分配也可以按已落位的县级单元一对一匹配。如果某个早期县能完整对应到七普的一个县直接映射即可如果它拆成了两个县就按面积比例把人拆开。用代码表达就是先做空间连接再按面积加权计算人口import geopandas as gpd # 早期人口 shp 和目标年份县界 shp old read_standard(1953) target gpd.read_file(./census_shp/2020/county.shp, enginepyogrio, encodingutf-8) # 空间求交保留人口字段与面积 inter gpd.overlay(old, target, howintersection) inter[area] inter.geometry.area # 按目标县归并人口按面积比例估算 gdf_result inter.groupby(target_id).apply( lambda df: (df[total_pop].fillna(0) * (df[area] / df[area].sum())).sum() ).reset_index(namepop_est)注意代码里的 target_id 是目标县界中每个县的唯一标识字段实际使用时你要把 target 里的县代码字段名填空进去。空间重分配得到的人口是近似值只在分县面积与人口均匀分布时比较合理如果只做省级分析误差可以接受下探到县级甚至乡镇级时结果只能当作近似。提示面积加权法建立在人口均匀分布在县域内的假设上用于省级尺度可信用于乡镇级精度明显下降。业务上更稳的方案是先检查有多少县可以一对一匹配。如果一对一匹配比例超过 90%直接走 ID 映射剩下的少数县再做空间分配这样能显著减少人为误差。空间挂接是一个很必要的技能但不要在不理解其假设的前提下盲用。字段映射、参考边界、匹配策略这三步做完才能放心地进入增长率计算和可视化阶段。5. 避坑排查最容易翻车的五个细节编码、边界、字段截断与解压陷阱5.1 DBF 中文乱码现象、原因与三行命令解决现象在 QGIS 或 GeoPandas 里打开某个年份的县界 shp属性表里省名、县名变成“娌冲寳鐪”“宀佺墰宀佸競”一类完全不可读的字符。原因dbf 文件里存的是 GBK 编码的中文但读取方没有按 GBK 解码。QGIS 默认假设 dbf 是 UTF-8GeoPandas 在未指定 encoding 时也走系统默认路径错位解码中文全部变成乱码。这与数据本身损坏无关。解决先确认 .cpg 文件是否存在存在则打开看它写的字符集然后用 read_file 时显式指定 encoding。命令行方案更彻底用 ogr2ogr 转一层编码再继续处理ogr2ogr -lco ENCODINGUTF-8 ./county_utf8.shp ./county.shp -nlt PROMOTE_TO_MULTI如果确认原数据是 GBK把上面的 ENCODING 参数换成 GBK 重新另存之后再用 GeoPandas 读取就不会乱码。这个坑几乎每个做 shp 中文数据的人都会踩一次知道原理后三分钟就能解决。5.2 同一县名在不同年份有不同区域边界漂移的排查法现象2000 年某县“A 县”的面积是 3000 平方公里到了 2020 年同名县只剩 2000 平方公里两期数据画出的人口密度图看起来像同一地名的完全不同图形。原因真实行政区划发生了变化。A 县在两次普查之间经历了撤县设区、部分乡镇划归邻县或者某个乡镇并入而 shp 文件里的几何边界忠实记录了这些变化。如果只认县名做连接肯定会算出错误的增长率。解决不要用“县名”作为唯一匹配键。首先用 total_bounds 比较同一县名的面积与边界范围看出入是否显著其次用 2020 年七普县界做参考做 overlay 求交看交叠面积占各自面积的比例。若交叠比例低于 95%打上“边界漂移”标记再对这部分县做专门处理。这段筛选逻辑可以用几十行 Python 完成但核心动作就是两件事对比面积、计算交叠比例。5.3 形状字段名被截断是 DBF 老格式的锅现象读取某个早期普查的 shp发现字段名只有十几个字符例如“population_1953”变成了“populatio”数据内容看起来也不对。原因dbf 格式对字段名长度有历史限制。老式 dBase III 字段名最长 10 个字节部分写入工具做了自动截断写入后实际存储的字段名与原始表头不一致读取时又按截断后的短名去访问于是数据被挤到相邻字段位置。解决这种问题没有完全自动修复的办法。比较有效的方案是先查看该年份属性表的完整字段列表与说明文档在读取时把截断字段名映射回正确的原名再重新导出。示例代码如下gdf gpd.read_file(./census_shp/1953/county.shp, enginepyogrio, encodinggbk) rename_map { populatio: total_pop, # 截断后的字段名 - 真实名 hou: household_num, } gdf gdf.rename(columnsrename_map)这种做法依赖文档或数据附带的 readme。见到截断时不要强行猜先找原始说明文本或者找同一年份其他层级的 shp 做交叉参考。需要明确一点这种截断是写入端的格式限制不是读取端的问题不要试图用改配置去解决。5.4 嵌套 zip 与深层目录解压后文件“失踪”的排查流程现象解压完成后某个年份的 county.shp 怎么都找不到或者在 QGIS 里加载一个 shp地图缩放到很远的位置看不到任何要素。原因常见原因是解压时丢失了文件路径层级或嵌套 zip 没有一并展开。还有一些包把数据放在深层目录下某些解压工具遇到路径过长或包含特殊字符时会跳过文件日志里有几行 warning多数人不会注意到。加载后位置不对则是 .prj 缺失或目录中残留了另一份同主名的 .prj。解决用 unzip -l 重新看内层结构对比已解压清单与包里清单找到遗漏的嵌套包后单独解检查 .prj 是否存在缺失就考虑用其它年份同层级的 .prj 复制过来试读但必须明确这是临时处理。位置不对的排查要打开 .prj 文件确认坐标系信息与原始数据一致。做到这一步文件“失踪”问题基本能定位。5.5 导出 CSV 后人口数变成科学计数法Excel 带来的假象现象把 shp 属性表导出为 CSV用 Excel 打开后人口数显示为 1.003E08 这类科学计数法部分数值看起来像被四舍五入了。原因这是 Excel 对长整型的默认展示方式不是 shp 数据本身的问题。dbf 中存储的数值是精确的只是导出到 CSV 之后 Excel 以默认格式显示数据本身并没有被修改。但如果你把这列导出后拿去做文本处理格式混乱的字符串就会污染后续计算。解决导出 CSV 时用 pandas 把人口字段保持为整数类型用 Excel 打开后选中整列将单元格格式改为数字小数位设为 0。如果要导入数据库直接用 pandas 的 dtype 指定列类型为 int64避免中间环节被 Excel 二次格式化gdf[[total_pop, male, female]].to_csv( census_2000.csv, indexFalse ) import pandas as pd df pd.read_csv(census_2000.csv, dtype{total_pop: int64})这一步处理不大但能避免很多人掉进“Excel 显示科学计数法”的坑。尤其当你把数据交接给同事时一份干净的 CSV 比一份被 Excel 改来改去的 CSV 省心得多。6. 进阶把七期数据转成时空长表并导出 WKT方便做跨期对比6.1 堆叠成一个长表多个年份的 shp 读进来之后最终要做成一张“长表”才方便纵向对比。长表的意思是每一行代表某一年份的某一个县包含 year 列、县名列、人口列和几何列。用第 4 章的 read_standard 函数把七个年份分别读入然后用 concat 纵向拼起来import pandas as pd frames [read_standard(y) for y in years] panel pd.concat(frames, ignore_indexTrue) panel panel.sort_values([county_name, year])拼接后就能像操作普通数据表一样做跨期计算比如用 groupby 算五年人口增长率或按年份做小倍数地图。这一步的核心价值是让不同年份的数据在同一个结构下可被直接索引省去后续反复 read_file 的重复动作也是做“人口变化地图”这类可视化最顺手的输入形态。6.2 导出 GeoJSON 和 WKT便于与其它系统对接很多下游系统不接受 shp却接受 GeoJSON 或 WKTWell-Known Text。把这份“一普到七普shp格式人口数据”转换成带边界文本的表格能极大方便跨团队协作。把人口字段和几何列导出为 WKT 文本列的常见做法如下panel[geometry_wkt] panel.geometry.apply(lambda g: g.wkt if g is not None else ) out panel.drop(columnsgeometry) out.to_csv(census_panel_wkt.csv, indexFalse)这里 apply 调用的 g.wkt 就是 Shapely 的矢量几何导出方法结果是一个纯文本字符串任何程序都能读。注意如果你的数据是面要素导出的 WKT 会以 POLYGON 或 MULTIPOLYGON 开头要导入数据库时直接用数据库自带的几何解析函数读这一列一般都能识别。除了 WKTGeoPandas 的 to_file 可以一行导出 GeoJSON 文件行数多时建议分层导出避免单文件过大拖慢下游读取。最后说一个我个人的血泪习惯再好的 shp 数据包到手的第一件事永远是做一份“数据体检报告”列出年份、层级、字段清单、坐标系、编码、空值率这六项指标。以前我拿到数据后直接上空间分析以为省了时间结果半年后从合作方那边反馈回一个数字对不上溯源才发现是最早读数据时字段名截断造成的。现在宁可先花半个小时检查也不想再因为基础字段问题返工。这套处理流程我重复用过很多次“一普到七普shp格式人口数据.zip”这类包里编码、区划漂移和嵌套压缩是三个最容易反复出问题的点把本章的方案和坑位记牢整份数据的价值才能稳定释放。希望帮到你。本文还有配套的精品资源点击获取