QGIS核密度分析实战:从原理到参数调优的热点识别指南
发布时间:2026/10/2 19:49:12 作者:尧图编辑部 阅读量:1,286

做空间分析这些年QGIS里的核密度分析算是我用得最频繁的工具之一。它能把一堆看似杂乱无章的点位比如门店、事故点、采样点、行为事件变成一张连续平滑的热度栅格一眼就能看出哪里是高聚集区、哪些地方存在明显的热点结构。这篇文章我会把核密度分析从原理讲到实操从参数配置讲到结果解读顺带把我在实际项目里踩过的坑都整理出来以“连锁咖啡品牌门店选址”为例完整过一遍流程。不管你是刚接触QGIS的规划从业者还是做商业分析、公共安全、人口研究的朋友这篇内容都能直接拿去用。1. 核密度分析是什么概念、原理和适用场景1.1 核密度分析的本质核密度分析Kernel Density EstimationKDE本质上是一个非参数统计方法放在GIS里就是让每个输入的点在它周围一定范围内形成一个“影响面”点越密集的地方这些影响面叠加起来的数值就越高。你可以想象成把一颗颗糖果撒在面板上每颗糖都自带一圈缓慢扩散的“温度”糖多的地方温度自然就高最后画出来的热力图就是这圈温度的叠加效果。数学上它做的事情是在每个点位置上放置一个核函数然后对搜索半径内的点做加权求和。核函数决定了权重衰减的方式搜索半径也叫带宽决定了影响范围有多大。QGIS实现的时候会把研究区域切成一个个像元每个像元的值就是落在它附近所有点贡献值的总和最终输出的是一张连续的栅格表面而不是一个简单的计数结果。这里有一点要和点密度分析区分开。点密度分析是画一个固定半径的圆滑窗统计窗口里点的个数再除以窗口面积窗口内的点权重完全相同。核密度分析则给每个点赋予随距离衰减的权重离中心越近贡献越大结果也更平滑、更接近真实的空间分布趋势。说得直白点点密度是“一刀切”核密度是“渐变过渡”。1.2 核密度能解决哪些空间问题不能解决哪些核密度在空间分析里的典型应用场景非常多。我做过的项目中频率最高的是这几类商业选址分析现有门店的空间聚集特征判断哪些区域已经是成熟商圈哪些区域还有市场空白公共安全交通事故点、犯罪事件点的热点识别辅助巡逻和设施布点公共卫生病例分布的热区探测判断传播是否呈现聚集性生态与物种动物活动位点、植物分布点的密度估计找出核心栖息地城市研究与交通共享单车、网约车上下车点、人口活动轨迹的聚集热点。不过核密度分析不是万能的。它本质上描述的是“过去和现在的分布状态”不是预测模型没法告诉你未来某个新店开在这里会吸引多少客流。想预测得用回归、机器学习或者空间统计模型。另外核密度的结果受带宽影响非常大带宽小了热点碎带宽大了趋势糊所以它更适合做探索性分析帮你发现“哪里有异常聚集”而不是替代严谨的统计检验。2. 环境准备QGIS安装与数据预处理2.1 QGIS下载、安装与版本选择QGIS是一款开源跨平台的桌面GIS软件官方下载地址是qgis.org直接选对应操作系统的安装包就行。版本上我强烈建议选长期支持版LTR目前常用的3.28和3.34系列都比较稳。没必要追最新版核密度分析这种核心功能在LTR上成熟度最高插件兼容性也更好。安装的时候有一点要注意虽然QGIS默认安装路径可以一路下一步但如果你电脑上已经装了Python环境安装时不要勾选“随QGIS安装Python”相关选项免得和系统Python冲突。我遇到过好几回用户装了Anaconda之后再装QGIS结果PyQGIS模块怎么都导入不了最后全部卸载重装才解决。QGIS自带一套独立的Python运行时不需要也不应该和系统Python混用。装完之后打开主界面第一次启动会提示设置数据源和默认工程文件夹按默认走就行。后续用到栅格分析工具不需要额外装插件核密度分析已经集成在处理工具箱里。如果你要加载在线影像底图也不依赖插件用XYZ Tiles就能加。2.2 数据准备点图层、坐标系与字段核密度分析的输入必须是点要素图层支持Shapefile、GeoJSON、GeoPackageGPKG等常见格式。我建议实际项目一律用GeoPackage字段名长度限制少不用像Shapefile那样担心字段重命名问题也不会像Shapefile那样丢失属性编码信息。坐标系是核密度分析里最先遇到的一个大坑。QGIS的核密度工具要求输入的坐标系统单位是“地图单位”如果用的是WGS84经纬度坐标EPSG:4326那输出栅格的像元大小和搜索半径单位就是“度”1度纬度约等于111公里1度经度在不同纬度差距又很大出来的结果基本没法看。正确的做法是先把点数据重投影到一个合适的投影坐标系如UTM、高斯-克吕格或者适合你城市范围的局部投影再做核密度。如果你不确定该用什么投影可以用QGIS内置的“按区域选择适合的投影”工具或者直接根据你所在城市的中央经线选UTM带。还有一个数据准备环节容易被忽略权重字段。核密度工具支持给每个点设置权重比如咖啡店的门店面积、客流量、营业额或者事故严重程度都可以作为权重字段。在做分析之前我习惯先在属性表里做一遍字段汇总确认权重字段的类型是数值型没有空值、负值。QGIS属性表工具栏里有个“字段统计”按钮能快速算出每个数值字段的最小值、最大值、平均值和标准差这比打开Excel来回倒腾高效得多。如果你手里的原始数据是CSV表里面有经纬度两列那先用“添加分隔文本图层”导成点图层再右键图层导出为GeoPackage完成坐标系定义和字段类型整理再进入下一步。2.3 加载底图与影像数据核密度出来的栅格如果没有底图衬底读者很难判断热点到底在城市的什么位置。我通常会在QGIS里叠加一张在线底图或者本地影像。在线底图最通用的方式是使用XYZ Tiles。在图层面板右键选择“添加图层 → 添加XYZ图层”输入一个可用的瓦片URL模板刷新后就能显示。网上有很多公开的瓦片服务模板国内可用的一般是天地图、高德和OSM天地图需要申请一个免费的密钥高德和OSM的公开瓦片地址在官方文档和很多技术帖里都能找到。直接百度“QGIS XYZ 国内可用 URL”就能拿到一堆现成模板拿来即用。如果是在内网环境或者想要更稳定的底图我推荐把影像下载成GeoTIFF后拖进QGIS。本地影像的好处是加载速度快不依赖网络出图的时候也不会因为底图瓦片加载失败留下大片空白。加载影像的方法非常简单直接把GeoTIFF文件拖进图层面板或者在“图层 → 添加图层 → 添加栅格图层”里选择文件。这里唯一要注意的是影像本身的坐标系和点数据坐标系要一致否则叠加时会错位或者被QGIS自动转换后边缘有偏移。3. 核密度分析实操全流程以门店选址为例3.1 调出处理工具箱与核密度工具这个案例我用了某连锁咖啡品牌在杭州主城区的120家门店点位每条记录都有一个“月营业额万元”字段作为权重想看看现有门店的热点区域长什么样以及有没有值得关注的新区域。在QGIS主界面点击菜单“处理 → 工具箱”右侧会弹出处理工具箱面板。在搜索框里输入“核密度”或者“kernel density”就能看到工具栅格分析 → 核密度估计Kernel Density Estimation。双击打开工具对话框。如果搜索框里找不到这个工具绝大多数情况是因为处理插件没有启用。检查“设置 → 选项 → 处理 → 提供程序”确保QGIS原生算法提供程序QGIS Native已加载然后重启一次QGIS就好。3.2 参数面板逐项解读与推荐配置核密度工具的界面很简洁核心参数就六个输入点图层选择刚才加载的咖啡店点图层权重字段选“monthly_revenue”该字段必须是数值型半径带宽单位与图层坐标一致这里我先填1000代表1000米搜索半径像元大小我填10单位也是米表示输出栅格的每个像元是10米乘10米输出栅格默认是临时文件建议指定保存路径为GeoTIFF方便后续加载其他参数默认即可。点开“高级参数”里面还有几个选项最常用的是“输出类型”。QGIS核密度工具支持输出为“密度”或“核强度”两者的计算公式略有差异。默认输出类型是密度适合大多数场景我一般不改。参数填完之后先不要着急点运行我先说明一下我为什么选1000米半径和10米像元。杭州主城区面积约三百多平方公里120家门店的平均间距差不多在800到1500米之间1000米搜索半径能让每个点都影响到周边几个相邻门店。10米的像元大小对出图来说足够精细而且120个点、主城区范围下生成栅格也就几百万个像元计算完全没压力。如果点一个不落的全部跑完结果会是一张浮点型的密度栅格。数值本身没有绝对意义主要是相对大小反映聚集程度。比如某个像元值是0.42另一个是2.6那2.6那个位置就是相对更热点的地方。3.3 输出结果的可视化设置与出图核密度结果默认加载进来通常是一张全黑的影像这并不代表分析失败而是默认渲染方式没法直接反映数据分布。右键栅格图层打开“属性 → 符号化”把渲染类型改成“单波段伪彩色”色带选择“Viridis”或者“YlOrRd”分位数模式选择“自然断点Jenks”再点击“分类”生成色带。这里有一个我特别推荐的小技巧在渐变色渲染的分级设置里点一下“分类”右侧的“数据定义覆盖”小按钮选择“按数据范围自动计算”可以让QGIS根据当前可见区域动态调整分级区间。做多尺度分析时这个操作能省下大量手工调整色带断点的时间而且能让每张图在各自尺度下都显示出最清晰的细节。为了更直观地表达热点边界我会额外生成一组等值线叠加在栅格上。操作方法是“处理 → 工具箱 → 搜索‘等高线’”工具输入栅格选核密度结果设置等值线间距比如每0.5生成一条线跑完后将生成的线图层叠加在核密度图层之上透明度调至50%左右。这样从热力云图到等值线边界一张完整的核密度分析图就成型了。出图之前别忘了调整图层的顺序影像底图放最底层核密度图层放中间设为半透明我一般用60%到70%的透明度等值线和门店点放在最上面。底图叠加后再配合矢量点的分布整个空间关系才真正清楚。3.4 用PyQGIS批量跑核密度分析当方案迭代比较多的时候比如想同时对比500米、800米、1200米三种带宽的结果手动在工具栏里一遍遍点参数就很痛苦。这时候可以直接用QGIS内置的Python控制台批量执行。在“插件 → Python控制台”里粘贴下面这段代码按目标带宽批量运行核密度工具import processing from qgis.core import QgsVectorLayer layer_path rD:/data/coffee_stores.gpkg layer QgsVectorLayer(layer_path, coffee_stores, ogr) for radius in [500, 800, 1200]: out_path rD:/data/kde_{}m.tif.format(radius) params { INPUT: layer, WEIGHT: monthly_revenue, RADIUS: radius, PIXEL_SIZE: 10, OUTPUT: out_path } processing.run(qgis:kerneldensityestimation, params) print(完成, radius, 米带宽)这段代码会把三个带宽的结果分别输出为三个GeoTIFF文件。你在实际项目中可以再加上循环修改权重字段、像元大小等参数甚至配合QGIS的批量处理模型Graphical Modeler做更复杂的分析流程。我自己的习惯是先用Python跑出8到10个备选方案然后一次性加载到地图界面里对比效率比手动一个个跑高太多了。4. 参数背后的计算逻辑如何把核密度做准4.1 带宽到底选多少从理论公式到经验法则带宽是核密度分析里最关键的参数直接决定结果的平滑程度。带宽选择过小每个点周围只有极少数邻居参与计算结果呈现出一堆孤岛状的高值碎片热区被切得细碎带宽选择过大所有点都被大范围平滑掉结果变成一张近似平原的均匀分布图热点信息完全丢失。理论界对带宽估计有不少研究其中最常用的是Silverman经验法则h 0.9 * min(sd, IQR / 1.34) * n^(-0.2)其中sd是点集的x或y坐标标准差IQR是四分位距n是点的数量。这个公式可以快速给出一个合理化建议值但其计算结果基于点坐标的方差和点的空间分布形态关系很大并不是每个数据都适合直接套用。我自己的经验是从来不看单一的“最优带宽”而是做多尺度对比。先用一个比较小的带宽看局部聚集再用一个比较大的带宽看宏观趋势最后综合判断。比如咖啡店案例里我对比了500米、1000米、1500米三档结果500米能看出每个商圈内部的密集位置1000米能看到街区级的热点板块1500米则能看出城市层面的热点轴带。三张图叠在一起才能回答“现状热点在哪”和“未来拓展往哪走”两个问题。4.2 像元大小与输出范围的影响像元大小决定输出栅格的粒度。像元越小结果越精细但计算量和文件体积会成倍增加。这里有个经验值把像元大小设为带宽的1/100到1/50既不会损失太多细节也不会让栅格文件膨胀到不可接受。举个例子带宽1000米时像元设为10到20米带宽500米时像元设为5到10米。如果设置得太细比如带宽500米时像元设成1米那整个栅格动辄上亿个像元跑起来又慢又卡出图也看不出额外信息。输出范围默认是输入图层的范围加上带宽范围的缓冲。实际分析中如果你只想关注特定行政区或者特定区域可以在“高级参数”里手动指定输出范围。注意这个范围和图层显示范围是两个概念它决定了实际参与计算的栅格区域不是简单的显示裁剪。另外一个容易被忽略的点是栅格背景值。QGIS核密度工具会把没有数据的位置设为NoData出图时会显示为透明这是正常的。但如果你要把结果导出给同事或者导入ArcGIS别忘了勾选“在输出数据中保留NoData作为背景值”否则栅格文件里所有NoData位置会变成0很容易被误读为“这里密度为零”而不是“这里没有数据”。4.3 核函数与算法实现的差异核密度分析里的“核”kernel是一个决定权重衰减形状的函数。常见的有均匀核、三角形核、高斯核、Epanechnikov核和quartic四次多项式核。QGIS内置核密度工具在算法实现上默认使用quartic核函数ArcGIS中经典的核密度工具默认也是quartic核这保证了两个软件在相同参数下的结果可以直接互相验证对比。R语言里的density()函数默认用高斯核如果你习惯用R做分析转过来用QGIS时要注意这个细微的差别。不同的核函数对结果整体形状影响不大真正影响大的是带宽和像元大小。所以我在实际项目中很少纠结“这个工具到底用哪种核”更关注的还是参数的合理性以及结果的解释方式。换句话说算法背后的数学差异属于锦上添花不是你做不好核密度分析的核心瓶颈。权重字段也是容易踩坑的地方。QGIS核密度工具支持权重字段但如果你选的字段里有空值或乱码工具会直接报错或者输出结果里对应点的贡献变为零。处理办法是先用字段统计检查数据完整性必要时用字段计算器重建一个权重字段把空值替换为0或剔除。现在这个案例里我用的是月营业额因为营业额和门店周边的商圈热力正相关用营业额作为权重能突出高价值门店聚集区比单纯用点数更有商业参考意义。5. 常见问题与排查技巧实录5.1 结果全黑或全空白这是核密度分析新手问得最多的问题。结果加载进来是全黑的第一反应是“是不是跑失败了”但绝大多数情况只是渲染设置的问题。核密度输出的浮动栅格默认用“单波段灰阶”渲染而且范围拉伸没有按数据范围计算所以看起来就是一片黑。解决方法是右键图层 → 属性 → 符号化改成“单波段伪彩色”在“颜色渐变”下拉选一个合适的色带然后点击“分类”。如果分类后还是全黑检查一下拉伸模式改成“按实际数据范围拉伸”问题立刻消失。5.2 坐标系导致单位异常之前提过如果输入的是经纬度坐标带宽填1000意味着1000度这个范围大到全中国都糊成一片。怎么快速判断是不是坐标系问题打开图层的属性 → 信息看坐标系是“EPSG:4326”还是“EPSG:32650”这类投影坐标系。如果是4326用“处理 → 矢量通用 → 重投影图层”工具把点转到合适的投影坐标系再重新跑一遍核密度。有时候原始数据虽然是投影坐标系但单位不是米而是英尺美国数据常见比如某些State Plane坐标系。这个也容易坑人。我吃过一次亏拿到一个美国的点数据带宽设置成1000以为是米结果单位是英尺出来的热点范围整整缩水了约三分之一。所以跑之前一定要确认图层单位。5.3 栅格范围不对或文件巨大如果输出栅格范围比预期大出很多大概率是坐标系或者输出范围设置有误。比如点数据本身只有城市中心一小块但坐标范围因为某个异常点被拉得特别远核密度结果也会把范围扩展到那个异常点附近。排查方法是先打开点图层的属性表按坐标字段排序看是不是有坐标异常的点比如经纬度写反、坐标多一位小数之类的。文件巨大一般是像元大小设置太小所致。一个10000×10000的栅格大小差不多是几十MB到上百MB如果像元设成1米而研究范围是几十平方公里那直接变成十亿级像元电脑肯定扛不住。我的建议是如果带宽在1000米级别像元至少设10米以上如果带宽只有100米像元设2到5米就足够了。5.4 特殊数据格式问题NetCDF与数据定义覆盖群里经常有人问“QGIS能不能对NetCDF数据做核密度”。答案是核密度工具的核心输入一定是点矢量图层NetCDF是栅格或多维多维数据不能直接作为输入。你如果把NetCDF数据先通过“栅格转矢量点”工具转成点再进入核密度流程是可以的但要注意转出来的点数量可能非常大几百万个点是常有的事这时务必先用“点抽样”或“随机提取”做一次抽稀否则工具跑几个小时都出不来。另一个我特别喜欢但很多人不知道的功能是“数据定义覆盖”Data-defined Override。它其实遍布QGIS的符号化、标注、布局等大量设置项中表现形式是一个带粗算符号的按钮。核密度结果出图时我经常用它在“按数据范围自动计算”中动态调整色带区间这样在缩放扫描地图时热力渲染会跟着当前浏览范围变化做多尺度探索分析时效率极高。很多教程只会让你手动改色带区间没提这个入口属于典型的“官方文档没细讲但巨好用”的隐藏功能。5.5 与点密度、插值结果的对比核密度结果到底对不对一个比较直接的验证方法是和点密度结果对比。把核密度输出的热点区域和人工圈选的高密区重叠如果两者出现明显错位比如核密度显示A区是热点但点密度显示B区是热点那大概率是带宽或者权重设置出了问题。更严谨一点还可以把点数据按网格聚合做一个渔网统计和核密度结果做相关性分析。这个做法在论文或项目报告里经常被用来证明热点识别的稳健性。6. 实操心得与进阶建议6.1 三步快速出热力图的个人工作流我做了大量核密度分析之后目前个人工作流已经固定为三步。第一步是数据预处理把点数据整理成坐标系正确、字段完整的图层第二步是多尺度试探同时跑小、中、大三档带宽的结果快速锁定合理的带宽量级第三步是结果精修确定最终带宽后调像元大小、选渲染色带、叠加等值线和底图完成出图。整个过程从拿到原始数据到出图熟练的话半小时内能搞定。这套流程我在不同的项目里几乎原样套用非常稳定。6.2 容易踩的坑汇总前面在常见问题里分散讲了一部分坑这里我再汇总几条最容易犯的权重字段用了字符串类型工具直接报错做法是先字段计算器转成整数或浮点数图层文件是中文路径部分插件或工具可能在输出时把临时文件名搞乱建议所有路径都改成英文输出栅格保存为GeoTIFF时如果没有指定压缩方式文件可能很大。在“另存为”对话框中选“LZW压缩”或者“DEFLATE”能明显缩小文件体积而且几乎不损失精度结果图里如果想显示门店点本身注意点的符号大小不要压过热力图的色彩对比用半透明小圆点最合适。6.3 后续扩展PyQGIS与Qt集成核密度分析做完一次以后如果你想把整套流程固化到自己的工具里QGIS给你留好了两条路。一条是图形化建模器在“处理 → 图形化建模器”里把核密度工具和重投影工具、字段统计工具串起来做成一个可视化流程以后换数据直接重新跑一遍。另一条是用PyQGIS把核密度算法嵌入到自研的Qt桌面应用或者Web服务里。很多做桌面GIS开发的朋友问过“Qt怎么使用QGIS”。其实就是在你的Qt项目里链接QGIS的C API或者用Python绑定PyQGIS把qgis.kerneldensityestimation这个算法当作一个后端处理函数调用。底层的核心函数和你在QGIS界面里手动点的完全是同一个东西所以效果完全一致。在QGIS Python控制台里一句processing.run(qgis:kerneldensityestimation, params)就能完成一次核密度运算这种封装方式让二次开发变得非常轻量。如果你的业务需要每天自动跑一批新数据的核密度挂一个定时任务循环运行PyQGIS脚本再把结果发布成WMS服务给前端展示整条自动化链路就通了。最后再分享一点个人体会。核密度分析这个工具门槛不高但想真正用得好功夫往往在参数之外。我见过很多人拿默认参数跑出一张红彤彤的图然后对着图说“这里密度高、那里密度低”这其实只算完成了一半。真正的分析应该包含至少一次多尺度对比以及对你所选参数的合理解释。你选1000米还是3000米背后应该有一个和业务场景强关联的理由而不是因为默认值是1000就直接用了。下次你在QGIS里跑核密度不妨多花十分钟把一两个对比方案的图也跑出来你会发现对这个数据空间结构的理解会深一个层次。