Python空间分析 | 02 实战解析:如何构建与选择空间权重矩阵(以Queen与Rook为例)

发布时间:2026/7/15 19:48:22
Python空间分析 | 02 实战解析:如何构建与选择空间权重矩阵(以Queen与Rook为例) 1. 空间权重矩阵空间分析的基石第一次接触空间分析时我被一个看似简单却影响深远的问题困扰为什么相邻省份的经济数据会相互影响直到理解了空间权重矩阵才明白这就像社交网络中的好友关系——北京和天津的GDP相互影响程度可能比北京和新疆要密切得多。空间权重矩阵Spatial Weight Matrix本质上是描述空间单元之间邻接关系的数学工具。举个生活中的例子假设你正在研究全国连锁店的销售额分布两家店铺如果位于同一商圈空间相邻它们的销售数据可能存在协同效应这种相邻关系就需要用权重矩阵来量化。在Python中我们常用PySAL库的libpysal.weights模块构建权重矩阵。最基础的两种邻接规则是import libpysal as lps # 假设gdf是包含几何信息的GeoDataFrame w_queen lps.weights.Queen.from_dataframe(gdf) # Queen邻接 w_rook lps.weights.Rook.from_dataframe(gdf) # Rook邻接实际项目中遇到过这样的坑某次分析中国省份数据时直接使用默认参数导致海南岛被识别为孤岛没有邻居。后来通过设置silence_islandsTrue参数才解决这个问题。这也提醒我们空间权重的构建需要结合实际地理知识。2. Queen与Rook邻接规则详解2.1 Queen邻接共享边或顶点的亲密关系Queen邻接就像国际象棋中的皇后走法只要区域共享任一边界或顶点就被视为相邻。这种规则下两个省份哪怕只在一个角落相接如甘肃和内蒙古也会建立连接。我常用这种规则分析经济辐射效应因为现实中即便只有小范围接壤也可能存在产业协作。例如分析长三角城市群时# 可视化Queen邻接关系 import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(10,8)) w_queen.plot(gdf, axax, edge_kwsdict(linewidth1.5, colorred)) gdf.plot(axax, facecolornone, edgecolorblack) plt.title(Queen邻接关系图, fontsize15)2.2 Rook邻接只认共享边的严谨派Rook邻接则像象棋中的车只承认共享完整边界的区域为相邻。这更适合分析严格接壤地区的影响比如研究传染病扩散时可能更关注实际接壤情况。两种规则的差异在实际数据中非常明显。曾有个有趣案例分析省级空气质量时使用Rook规则会发现京津冀地区的连接比Queen规则更稀疏这正好反映了山脉对污染物传播的阻隔效应。# 对比两种规则的邻居数量差异 print(河北省的Queen邻居数量:, len(w_queen.neighbors[13])) # 假设河北的索引是13 print(河北省的Rook邻居数量:, len(w_rook.neighbors[13]))3. 权重矩阵的构建实战3.1 数据准备与常见问题处理构建权重矩阵前数据质量检查至关重要。我总结了几点经验几何类型必须是多边形Polygon检查坐标系一致性建议使用投影坐标系处理孤岛和飞地情况常见错误解决方案# 处理拓扑错误 gdf gdf.buffer(0) # 修复无效几何 # 处理孤岛警告 w_queen lps.weights.Queen.from_dataframe(gdf, silence_islandsTrue)3.2 权重标准化的重要性原始权重矩阵通常需要标准化我推荐行标准化row standardization它使得每个单位的权重和为1便于解释w_queen.transform R # 行标准化曾经分析城市灯光数据时未标准化的权重导致结果偏向面积大的省份标准化后才得到合理结论。这就像比较班级成绩时需要考虑各班人数差异。4. 如何科学选择邻接规则4.1 基于几何特征的决策选择Queen还是Rook我的经验法则是如果研究现象可能通过点接触传播如经济辐射选Queen如果只考虑实际接壤影响如土壤污染选Rook一个实用的决策流程图绘制区域几何的Voronoi图检查共享边和共享顶点的分布结合领域知识判断哪种接触方式更相关4.2 结合统计检验的验证方法我通常用Moran散点图辅助判断。好的权重矩阵应该使空间自相关指标显著from esda.moran import Moran moran Moran(y, w_queen) print(fQueen矩阵的Morans I: {moran.I:.3f}, p值: {moran.p_norm:.4f}) moran Moran(y, w_rook) print(fRook矩阵的Morans I: {moran.I:.3f}, p值: {moran.p_norm:.4f})在分析省级GDP时Queen矩阵的Morans I通常更高因为经济联系不局限于地理接壤。而分析降雨量分布时两种矩阵的结果差异可能较小。5. 进阶技巧与可视化呈现5.1 权重矩阵的优化策略当基础邻接规则效果不佳时我会尝试结合距离阈值DistanceBandK最近邻KNN自定义权重基于实际交通流或经济联系数据from libpysal.weights import DistanceBand coords gdf.geometry.centroid.apply(lambda p: (p.x, p.y)).tolist() w_dist DistanceBand(coords, threshold300000) # 300公里阈值5.2 专业可视化技巧好的可视化能直观展示空间关系。我常用的方法# 绘制权重矩阵热力图 plt.spy(w_queen.sparse.toarray(), markersize2) plt.title(权重矩阵稀疏表示, pad20) # 交互式地图展示 import folium m gdf.explore(columnGDP, schemequantiles) folium.plugins.HeatMap(datagdf[[lat,lon,GDP]]).add_to(m) m.save(heatmap.html)记得在某次汇报中用Folium制作的交互地图让客户一眼就理解了省际经济联系这比表格数据直观得多。