
简介这份《中国人口密度公里格网栅格数据》面向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)表示像元是 1kmCoordinate System is用来确认投影Type例如UInt16表示无符号 16 位整型NoData Value常见-9999或0。第一次接触这份数据时把这几行截图保存后面所有统计结果都会用到。第三是 NoData。栅格覆盖全国时国界外、大面积水域、无人区很可能没有属性值。NoData 没有统一标准有的写 -9999有的写 0还有的不声明。用 ArcGIS 打开后右键图层属性里的“源”标签页能看到 NoData 设置如果 NoData 没被正确识别后期分区统计会把无数据区域当有效值处理这问题留到第 5 章详细说。现在先记结论任何运算之前先确认 NoData。2.3 栅格数据组织形式GeoTIFF、GRID 与 ASCIIzip 里最常见的是哪种解开 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 rE:\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 rE:\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 rD:\popwork arcpy.env.snapRaster rD:\popwork\chn_pop2020.tif zones rD:\popwork\province.shp zone_field 省代码 value_raster rD:\popwork\chn_pop2020.tif out_table rD:\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( rD:\popwork\chn_pop2020_albers.tif, rD:\popwork\chn_pop2020_wgs84.tif, arcpy.SpatialReference(4326), BILINEAR, )参数里arcpy.SpatialReference(4326)指定目标坐标系 WGS84BILINEAR是重采样方法。人口密度属于连续型数值用双线性插值比最近邻法更平滑缺点是会轻微改变数值分布。处理完后再叠加底图验证一次确认无偏移后再进行后续分析。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 StatisticsSUM 结果才可信。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 COMPRESSLZW \ ${year}/pop${year}_albers.tif unified/pop${year}_4326.tif done解释一下关键参数-tr指定输出栅格像元大小0.0083333333 度约等于 1 公里这是把米制投影转成经纬度坐标后的标准换算-r bilinear指定双线性重采样适合人口密度这种连续变量最近邻法会产生明显的锯齿-dstnodata -9999把所有年份的 NoData 统一成同一个值后续计算器里判断条件只需写一次-co COMPRESSLZW压缩输出文件全国范围的数据转完后仍有几百 MBLZW 能省不少磁盘。跑完后用下面的命令验证每个文件的像元大小和投影是否一致gdalinfo unified/pop2020_4326.tif | grep -E Pixel Size|Coordinate System如果输出里的Pixel Size都是(0.0083333333, 0.0083333333)说明对齐成功。这个过程虽然多花几分钟预处理但比到模型跑完才发现坐标错位再去返工省下的是几天的返工量。处理这类 zip 数据我学到的习惯是把原始 zip 原样保留只解压副本来做实验因为没准哪次你就会把栅格算错原始文件是最后的后悔药。希望这些经验能帮到你。本文还有配套的精品资源点击获取