如何用R的spatstat包复刻ESRI Point Density工具?
用spatstat复刻ESRI Point Density的最优方案
核心逻辑对齐
ESRI Point Density本质是固定邻域的加权核密度估计:对每个栅格单元,计算指定邻域内所有点的属性权重总和,再除以邻域面积,输出单位面积的密度值。要对齐这个逻辑,优先用density.ppp配合参数设置,比smooth.ppp或自定义焦点分析更高效精准。
具体操作步骤
1. 数据预处理(单位统一是关键)
确保你的ppp对象坐标已转换为千米(最终要输出每平方千米的单位)。如果原始数据是米单位,用以下代码转换:
your_ppp_object <- rescale(your_ppp_object, s = 1/1000)
2. 用density.ppp实现核心功能
直接通过参数配置复刻ESRI工具的行为:
weights:传入遗址的规模属性(比如公顷数),对应ESRI里的「Population字段」,让每个点的贡献按自身规模加权;bw:设置为ESRI的搜索半径(千米为单位),比如搜索半径5千米就设bw=5;kernel:选"disc"对应ESRI默认的圆形邻域,选"square"对应方形邻域,这两个核都是邻域内权重均匀计算,完全匹配ESRI的逻辑;at = "pixels":指定输出栅格格式的密度表面。
示例代码:
# 假设your_ppp_object已转千米单位,site_size是每个遗址的公顷数属性 density_surface <- density.ppp(your_ppp_object, weights = your_ppp_object$site_size, bw = 5, # 5千米搜索半径 kernel = "disc", # 圆形邻域 at = "pixels")
3. 结果验证
density.ppp输出的单位正好是公顷/平方千米,完全符合你的需求。可以手动计算某点邻域内的总公顷数除以邻域面积(圆形邻域面积为π*r²),和栅格值对比验证准确性。
其他选项的优劣对比
smooth.ppp:默认用高斯核做平滑,是「渐变权重」的核估计,和ESRI「固定邻域均匀加权」的逻辑不符,不推荐;- 自定义焦点分析:比如用
raster包的focal函数,需要先把点转栅格再处理,效率远低于density.ppp,且spatstat对空间点的边界处理更专业。
时间序列追踪方法
把数据按时间切片(比如按朝代/时间段拆分ppp对象),对每个时间片重复上述步骤,即可得到不同时期的密度表面,进而分析变化趋势。
内容的提问来源于stack exchange,提问作者Michal Michalski
相关产品推荐
相关产品推荐

