简介:这份《中国人口密度公里格网栅格数据》面向GIS使用者、城市规划者、研究人员及社会科学家,提供全国尺度的人口空间分布数据。数据采用公里格网组织,每个单元约1平方公里,便于统计和比较人口密度差异,可用于城市基础设施规划、生态承载力评估、人口迁移与城镇化趋势研究等场景。压缩包共240个文件,包括shp矢量要素、dbf属性表、prj坐标系定义、shx空间索引等标准GIS文件,以及adf栅格网格和xml元数据文件,整体约60.58MB,导入ArcGIS、QGIS等主流软件即可读取分析。数据包已做预处理,含分层结构与坐标系转换,支持直接开展空间查询、缓冲区分析和专题可视化。已有2731人学习下载,适合需要无偏移、可直接用于建模和制图的中国人口密度底图的用户,也可作为空间统计学和人文地理研究的入门练习数据;对于区域规划、灾害风险评估等专题同样具备实用价值。
1. 中国人口密度公里格网栅格数据.zip:一张全国尺度的人口底图怎么落地用
做选址评估、做城市群分析、做应急资源调配的人,大概率遇到过一种尴尬:手里有省市区县的人口统计表,却回答不了“目标位置周边 3 公里到底住了多少人”。中国人口密度公里格网栅格数据.zip 就是常见的数据解法——它用 1km×1km 栅格像元把全国人口密度铺成连续底图,单位通常是人/平方公里,下载后是一个 zip 压缩包,解开后是 tif 或 img 栅格文件,能直接参与缓冲区统计、分区汇总和建模。适合需要全国或大区域人口本底的研究者和 GIS 工程师,也适合刚开始碰栅格数据的新手。下面按实际处理顺序讲透:解压、读参数、验证、分区统计,以及五个高频坑。
2. 解开 zip 先读参数:人口密度栅格的分辨率、单位与投影怎么验
2.1 为什么“公里格网”够用:栅格人口密度在区域分析里的精度边界
人口栅格数据并不是分辨率越高越好。全国范围的数据,如果选 100m 甚至 10m 分辨率,单个文件动辄几十 GB,处理吃内存、存储吃阵列,很多时候只在图上看出城乡边界,性价比很低。1km 分辨率在区域分析和宏观建模里是一个很实际的中间档位:它足够捕捉到县域之间人口分布的差异,也足够支撑 5km、10km、15km 级的服务半径分析。相比之下,省市级边界数据虽然更齐整,但它没有内部差异——整个省的人口密度是一个常数值,明显不符合现实。
所以这份 zip 的核心价值在于它给了每个像元一个密度估计值,而不是把行政区当作均质空间。理解了这一点,后面所有操作的选择标准就清楚了:用栅格,是为了让“人口密度”这个变量能和其他 1km 尺度的数据(土地利用、夜间灯光、GDP 格网)在同一套空间框架里互相计算。1km 像元大小,在多数模型里已经能区分城市簇与乡村腹地,计算量也在单机可承受范围内。
我一般把 1km 人口栅格当“快筛工具”:它不能告诉你某个小区实际住了多少人,但能告诉你某片区域的人口量级和空间分布形态。精度方面,误差通常在公里级,用于全国或大区域横向比较没有问题。真要做街道级精细分析,那就得换 100m 格网或普查街区人口数据,两者适用场景完全不同。手里这份 zip 是给区域分析准备的,不是给小区物业用的。
2.2 解压 zip 后的三个关键参数:投影、单位与 NoData
拿到解压后的 tif,先不要急着加载出图,先确认三个参数。第一是投影。国内这类人口密度数据常见两种框架:一种直接用地理坐标系 WGS84,另一种用阿尔伯斯等积投影,比如基于 Krasovsky 椭球体的阿尔伯斯投影。如果后续要叠加 WGS84 的在线底图,栅格本身的投影信息必须搞清楚,否则会出现整体偏移。
第二是单位。多数 1km 人口密度栅格表达的是“人/平方公里”,但部分版本为了压缩存储,会把数值乘以 10、100 甚至取对数后转成整型。zip 里通常会附带说明文本或 PDF,比如“数据说明.txt”,里面会写着数值缩放关系。见过太多人忽略这个步骤,直接把栅格值当真实人口数去求和,结果区域人口比统计年鉴大了上百倍。下面是用 GDAL 快速查看参数的命令:
gdalinfo chn_pop2020.tif输出里重点看四行:Pixel Size,如果显示(1000.000000, 1000.000000)表示像元是 1km;Coordinate System is,用来确认投影;Type,例如UInt16表示无符号 16 位整型;NoData Value,常见-9999或0。第一次接触这份数据时,把这几行截图保存,后面所有统计结果都会用到。
第三是 NoData。栅格覆盖全国时,国界外、大面积水域、无人区很可能没有属性值。NoData 没有统一标准,有的写 -9999,有的写 0,还有的不声明。用 ArcGIS 打开后,右键图层属性里的“源”标签页能看到 NoData 设置;如果 NoData 没被正确识别,后期分区统计会把无数据区域当有效值处理,这问题留到第 5 章详细说。现在先记结论:任何运算之前,先确认 NoData。
2.3 栅格数据组织形式:GeoTIFF、GRID 与 ASCII,zip 里最常见的是哪种
解开 zip 你能遇到的栅格数据组织形式大体有三类。最普遍的是 GeoTIFF,也就是后缀.tif的文件,它把影像数据和地理参考信息放在同一个文件里,ArcGIS、QGIS、GDAL 都能直接读。其次是 ESRI GRID,它不是单文件而是一个目录,里面包含hdr.adf、w001001.adf等文件,在解压工具里显示为一个文件夹,直接拖进 GIS 软件常常打不开。还有一种 ASCII 栅格,后缀.asc,纯文本存储,文件体积大,多用于数值交换而不是制图。
打开 zip 后我先看文件后缀和目录结构:如果有README.txt或数据说明文档,优先读;如果看到一个无后缀目录,先试 ArcGIS 的“连接到文件夹”去识别,不要强行拆开。遇到.tif就用上面那行gdalinfo验证。遇到 GRID 目录则直接整目录加载,不要只拖其中一个adf文件进去,那样会提示“数据格式不支持”。
这种组织形式上的坑相当常见。比如 Windows 自带解压工具解 ESRI GRID 时偶尔会漏解一部分文件,加载到一半报错;还有的解压工具把 GRID 目录当作普通文件夹改名,导致无法识别。我的习惯是解压后立刻核实文件数量和字节数,再在 GIS 里验证,不要等分析阶段发现文件是坏的。另外,如果解压时出现“需要密码”的提示,但明明下载时没给密码,那多半是 zip 伪加密标志在作怪,这类问题放到第 5 章一起说。
3. 用 ArcGIS 和 QGIS 打开人口密度栅格:投影检查、显示修正和乱码排查
3.1 ArcGIS Pro 打开栅格的最小步骤:先建工程,再加数据,再看源信息
有些人拿到 tif 直接双击,系统用照片查看器打开,得到一片黑——这不算真打开。正确做法是新建一个空白地图工程,然后通过“添加数据”把 tif 加载进来。数据源、符号化、栅格信息都由 GIS 接管,接下来右键图层选择“属性”,切到“源”标签页,这里能看到投影坐标系、像元大小、波段数和 NoData 值。这些信息在分析前必须核对一遍。
我习惯用一段 Python 脚本直接在 ArcGIS Pro 里把关键参数打出来,比肉眼翻界面快,也方便留记录:
import arcpy raster_path = r"E:\popdata\chn_pop2020.tif" desc = arcpy.Describe(raster_path) print("投影名称:", desc.spatialReference.name) print("EPSG 编号:", desc.spatialReference.factoryCode) print("像元宽度:", desc.meanCellWidth) print("像元高度:", desc.meanCellHeight) print("像元类型:", desc.pixelType) print("NoData 值:", desc.noDataValue)这里有几个参数需要解释:spatialReference.name返回投影名称,如果是WGS_1984_Geographic_Coordinate_System说明它是地理坐标系;factoryCode是 EPSG 编号,比如 4326 就是 WGS84。meanCellWidth和meanCellHeight单位是米,理想情况下都接近 1000。pixelType决定数值范围,常见U16表示 0 到 65535 的无符号整型;如果密度被放大过 100 倍,这个类型最常见。noDataValue在你输入 NoData 之前可能返回None,需要手动确认。
如果栅格加载后发现位置不对,先看地图底部状态栏的坐标,再和已知地标对比。这一步不能省,很多叠图错位问题在刚加载时就能发现,而不是等到做缓冲区统计才发现所有结果都偏移了。
3.2 QGIS 快速验证:直方图检查数值范围,比肉眼识别更可靠
QGIS 打开人口密度栅格同样简单,把 tif 直接拖进图层区就能预览。但预览不等于验证,我一般会在 QGIS Python 控制台里跑一段同样的检查脚本,顺便把最小值和最大值读出来:
from qgis.core import QgsRasterLayer, QgsProject, QgsRasterBandStats layer_path = r"E:\popdata\chn_pop2020.tif" layer = QgsRasterLayer(layer_path, "pop2020") if not layer.isValid(): print("栅格加载失败,检查文件路径或格式") else: QgsProject.instance().addMapLayer(layer) print("CRS:", layer.crs().authid()) provider = layer.dataProvider() stats = provider.bandStatistics(1, QgsRasterBandStats.All) print("最小值:", stats.minimumValue) print("最大值:", stats.maximumValue) print("平均值:", stats.mean)layer.crs().authid()返回 EPSG 编号,例如EPSG:4326。bandStatistics(1, QgsRasterBandStats.All)表示对第一个波段统计全部基本指标,包括最小、最大、均值。这一步能快速确认数值量级:如果最大值只有几千,说明数据基本没缩放;如果最大值上百万甚至上亿,几乎可以断定数据乘以某个系数了。
3.3 中文路径和文件名编码:解压 zip 后为什么 GIS 打不开
这类国内数据包的 zip 里,文件名经常是中文,比如“中国人口密度2020.tif”。Windows 自带解压工具一般能识别,但在某些非中文系统或跨版本环境下,解压出来的文件名可能乱码,ArcGIS 加载时直接报“数据集不存在”。原因在 zip 内部文件名编码不一致,有的按 GBK 存,有的按 UTF-8 存,解压工具如果按错编码解出来,路径就变了。
解决办法有两种:一种是用 7-Zip 解压,并在选项中把文件名编码设为自动检测,通常能解出正确中文名;另一种更省事,解压后立刻把文件重命名为纯英文路径,比如pop2020.tif,数据本身内容不受影响。如果解压时弹出密码框而你没设过密码,多半是 zip 伪加密标志异常,可以这样处理:
7z x chn_pop.zip -y -p-y表示覆盖现有文件时不询问,-p后面没跟密码,代表用空密码尝试。这条命令能在不装额外工具的情况下绕过伪加密提示。如果 7-Zip 也解不开,再考虑用专门修复压缩包的工具,不要轻易相信网上所谓“暴力破解”工具。处理完文件名问题后再用 GIS 加载,能省掉一大半“打不开”的烦恼。
4. 把人口密度栅格换算成区域规模:分区统计、人口估算与分级出图
4.1 用 Zonal Statistics as Table 按行政区汇总,直接得到区域总人口
人口密度栅格配合行政区矢量边界,最常用的操作是按省、市、县汇总。基本原理很简单:栅格像元值是每平方公里人数,而像元面积正好约等于 1 平方公里,所以把落在某个行政区内所有像元的值相加,就得到该区域的总人口。如果用平均值就错了,平均值只是密度均值,不能代表总人口,尤其像北京这种内部密度差异极大的地方。
ArcGIS Pro 里我通常用 Zonal Statistics as Table,它输出一个属性表,每个行政区一行,包含总和、均值、最大值、最小值等统计值。示例代码如下:
import arcpy from arcpy.sa import ZonalStatisticsAsTable arcpy.env.workspace = r"D:\popwork" arcpy.env.snapRaster = r"D:\popwork\chn_pop2020.tif" zones = r"D:\popwork\province.shp" zone_field = "省代码" value_raster = r"D:\popwork\chn_pop2020.tif" out_table = r"D:\popwork\province_pop.dbf" ZonalStatisticsAsTable( zones, zone_field, value_raster, out_table, "DATA", "SUM" )这里的zone_field是行政区图层里的唯一标识字段,建议用行政区划代码,不要用中文名称,避免同名或编码问题。"DATA"表示忽略 NoData 参与统计,"SUM"指定汇总字段,最终结果里的 SUM 字段就是区域总人口。算完后我一般用 Toolbox 里的 Table To Excel 把 dbf 转成 xlsx,方便对比统计年鉴或做后续清洗。
多说一句粗心点:如果行政区边界和栅格边界没有严格对齐,边缘地区的像元会被部分裁掉,导致总人口略有偏差。大省偏差在可接受范围,但小乡镇可能差到几个百分点。想要更精确,可以用按面积加权的统计方式,或者先确保两个图层在统一投影坐标系下。
4.2 人口密度换算成人口数:栅格计算器里的单位与缩放校正
如果要做的不只是按行政区加和,而是生成一张“每个像元代表多少人口”的栅格,那就需要栅格计算器。严格来说,每平方公里人口数乘以像元面积(平方公里)才是像元内人口数。1km 网格下像元面积接近 1,可以直接用密度值当作人口数;如果将来重采样成 500m 网格,那就得乘 0.25,很多人在这步栽跟头。
还有缩放校正的问题。假设 zip 里的说明文件写明“原始密度放大了 100 倍”,那栅格计算器里应该这样写:
# 人口密度校正:原始值 / 100 = 实际人/平方公里 pop_actual = "chn_pop2020" / 100 # 像元人口数(当像元大小约 1km 时) pop_count = pop_actual * 1这里pop_actual先做缩放校正,pop_count是每个像元的估算人口。如果像元不是刚好的 1000 米,比如重投影后变成 990 米,可以用(像元宽度 * 像元高度) / 1000000作为面积系数乘回去。公式里的单位必须全程盯住,栅格计算器不会帮你换算单位,出问题也不会报错,只会给出很难看的结果。
4.3 分级设色:自然间断点比均匀分段更符合人口分布
人口密度分布极度偏斜,绝大多数区域密度不高,少数核心城市密度非常高。如果色带按均匀间距划分,比如 0-200、200-400、400-600,那么大多数区域会落在同一个色阶里,图面几乎没有层次。更合理的做法是使用自然间断点分类,即 Jenks 算法,它根据数据分布自动寻找分组边界,让组内差异最小、组间差异最大。ArcGIS 里在图层属性的符号系统下选“分类”,方法选“自然间断点”,类别数设为 5-7 类即可。
如果不想用自动分类,也可以手动设阈值。我做全国人口分布图时常用阈值:0、10、50、100、200、500、1000、5000。0 表示无人区,10 以下基本是山地或牧区,100 以上是城镇周边,1000 以上是城市核心。设色建议从浅黄到深红渐变,避免使用红绿对比色,色盲用户没法看。NoData 区域单独设为透明,不要参与显示,否则国界外的水域和邻国区域会带上一整片色块。
出图时把行政区界叠加在最上层,加一个细线表示县界,粗线表示省界,比例尺和图例放在图幅左下角。地图导出分辨率用 200dpi 以上,否则文字边缘发虚。这一步做完,一份“哪里人多、哪里人少”的地图底图就算落地了。
5. 人口密度公里格网 zip 使用避坑:5 个现象、原因与解决记录
5.1 叠底图整体偏移几十公里,边界对不上
现象:把人口密度栅格和一个在线影像底图叠加,边界错位明显,村子对不上村子,河流对不上河流。
原因:栅格用的投影坐标系跟底图不一致。底图一般是 WGS84 地理坐标系,而这类型栅格数据可能自带 Krasovsky 阿尔伯斯投影,坐标系一不同,图面自然错位。ArcGIS 界面里看有可识别投影信息,但不等同于和当前地图匹配。
解决:不要只靠动态投影,它只是临时显示,不改变数据本身。用 Project Raster 工具将栅格重投影到 WGS84,例如:
import arcpy arcpy.ProjectRaster_management( r"D:\popwork\chn_pop2020_albers.tif", r"D:\popwork\chn_pop2020_wgs84.tif", arcpy.SpatialReference(4326), "BILINEAR", )参数里arcpy.SpatialReference(4326)指定目标坐标系 WGS84,"BILINEAR"是重采样方法。人口密度属于连续型数值,用双线性插值比最近邻法更平滑,缺点是会轻微改变数值分布。处理完后再叠加底图验证一次,确认无偏移后再进行后续分析。
5.2 按省汇总的人口比统计年鉴大了 100 倍
现象:Zonal Statistics as Table 的 SUM 字段结果,和统计年鉴上的省人口数对不上,相差几十甚至上百倍。
原因:原始数据经过缩放。很多公开人口密度格网为了控制文件体积,把真实密度乘以 100 以后再存成整型,zip 内的数据说明文件会写明这个系数。没有读说明文件,直接把 SUM 拿出去用,必然翻车。
解决:先读 zip 里的全部文本文件,找到“缩放”“系数”“单位”等关键词。如果没有说明,可以用一个已知人口的省份做反推:把全省栅格像元值求和,除以该省已知总人口,得到一个近似系数。例如某省年鉴人口约 5000 万,栅格求和是 50 亿,那系数就是 100,所有区域结果除以 100 即可。这个反推误差不大,但只能说明该数据用的缩放系数,不能说明每个像元的局部准确性。
5.3 NoData 被当成有效值参与统计,区域人口明显偏低
现象:做分区统计后,某个区域总人口只有统计年鉴的十分之一,而且该区域恰好有大量河流或国境边界。
原因:NoData 区域没有被识别。数据在国边界外或水域通常没有属性,如果 NoData 值设置为 0,而统计时软件把 0 当作真实人口值参与平均或求和,就会出现大幅度偏低或计算错误。
解决:在统计前先用 SetNull 把 NoData 统一处理:
# 将等于 -9999 的像元设为 NoData clean_pop = SetNull("chn_pop2020" == -9999, "chn_pop2020")SetNull 的第一个参数是条件,第二个是符合条件的像元取多少,或者保持原值。执行后重新检查图层属性里的 NoData 设置。如果你用的是 QGIS,可以在“栅格”菜单下的“转换”里将 NoData 值设为无效,效果相同。这一步做完再跑 Zonal Statistics,SUM 结果才可信。
5.4 zip 解压提示要密码,或解压后栅格文件损坏
现象:下载回来的 zip 双击解压,弹窗让输入密码,可明明没设过密码;强行解压后又提示某个文件校验失败,或者栅格加载时只加载出一半。
原因:不是真正加密,多数是 zip 伪加密标志问题。文件头里加密标志被置位,但实际没有密码,Windows 自带解压工具遇到这种情况会要求输入密码;另外,如果 zip 里有中文文件名,编码不一致也可能导致解压时报错或漏文件。
解决:先用 7-Zip 试空密码解压,命令是这样:
7z x chn_pop.zip -y -p""-p""明确传入空密码,让工具跳过读密码步骤。另一个常见做法是在解压前用 7-Zip 打开 zip,点击“测试”按钮检查压缩包完整性,如果提示某个文件 CRC 失败,说明这个文件在下载或传输过程中损坏,需要重新下载。解压后立刻用第 2 章的gdalinfo验证,比等分析阶段发现数据缺失要好得多。
5.5 人口密度图全黑或全白,看不见任何分布
现象:把 tif 拖进 ArcGIS 或 QGIS,显示出来几乎全黑,只有零星亮点,完全看不出人口分布。
原因:数值范围被异常值或 NoData 拉大了。栅格可能包含几个异常高值,比如某个像元值 65535,导致软件自动拉伸的色带范围从 0 到 65535,而真实人口密度普遍集中在 0 到 3000,于是大部分区域在显示时被压成黑色。
解决:在符号系统里把拉伸方式改成“百分比截断”,比如设置最小值从第 2 百分位开始,最大值到第 98 百分位结束,然后再选色带。这样异常值和 NoData 不会撑爆色带范围。也可以手动设置最小值为 0、最大值为 5000,然后按自然间断点分类。记住,这只影响显示,不影响底层数据值,无论你看到什么颜色,原始像元值不会改变。
6. 多期人口密度栅格统一网格:用 gdalwarp 做重投影与重采样的参考操作
如果你想把手头的人口密度栅格和另一期数据做时间序列对比,比如 2000 年对 2020 年,或者和其他 1km 格网数据做叠加建模,最忌讳的就是两个栅格投影、像元大小不统一。这样直接在栅格计算器里跑运算,结果和对齐误差交织在一起,难以排查。我的做法是先写一个批处理脚本,把所有年份统一到 WGS84 和 0.00833333 度网格:
mkdir -p unified for year in 2000 2005 2010 2015 2020; do gdalwarp -t_srs EPSG:4326 \ -tr 0.0083333333 0.0083333333 \ -r bilinear -dstnodata -9999 \ -co COMPRESS=LZW \ ${year}/pop${year}_albers.tif unified/pop${year}_4326.tif done解释一下关键参数:-tr指定输出栅格像元大小,0.0083333333 度约等于 1 公里,这是把米制投影转成经纬度坐标后的标准换算;-r bilinear指定双线性重采样,适合人口密度这种连续变量,最近邻法会产生明显的锯齿;-dstnodata -9999把所有年份的 NoData 统一成同一个值,后续计算器里判断条件只需写一次;-co COMPRESS=LZW压缩输出文件,全国范围的数据转完后仍有几百 MB,LZW 能省不少磁盘。
跑完后用下面的命令验证每个文件的像元大小和投影是否一致:
gdalinfo unified/pop2020_4326.tif | grep -E "Pixel Size|Coordinate System"如果输出里的Pixel Size都是(0.0083333333, 0.0083333333),说明对齐成功。这个过程虽然多花几分钟预处理,但比到模型跑完才发现坐标错位再去返工,省下的是几天的返工量。处理这类 zip 数据,我学到的习惯是把原始 zip 原样保留,只解压副本来做实验,因为没准哪次你就会把栅格算错,原始文件是最后的后悔药。希望这些经验能帮到你。
本文还有配套的精品资源,点击获取