关于raster::adjacent()输出值的疑问:创建车氏邻接矩阵遇阻
问题解析:为什么
raster::adjacent()的邻接关系看起来不符合预期? 你的困惑主要来自两个核心误解:对raster包的像元编号规则不熟悉,以及默认的像元顺序和你预想的不一样,我们一步步拆解清楚:
1. 先搞懂raster的像元编号逻辑
你创建的3x3栅格,像元编号是列优先的:从左上角开始,先按列从上到下编号,再切换到下一列。具体对应关系是:
| 行\列 | 第1列 | 第2列 | 第3列 |
|---|---|---|---|
| 第1行 | 1 | 4 | 7 |
| 第2行 | 2 | 5 | 8 |
| 第3行 | 3 | 6 | 9 |
所以你看到的from=1, to=3,并不是同一行的左右两个像元,而是第1列的第1行和第3行像元——它们是垂直相邻的,完全符合车氏(rooks)邻接的定义(上下左右相邻)。
2. 确认directions参数的正确性
你用directions=4是完全正确的!根据raster包的文档:
directions=4对应Neumann邻接,也就是上下左右四个方向(车氏邻接)- 如果你想让代码更直观,也可以写成
directions='rook',效果完全一致
你之所以觉得1和3的邻接关系有问题,是因为默认像元编号是行优先(同一行从左到右1→2→3),但raster包的核心操作都是基于列优先编号的,这才是误解的根源。
3. 验证邻接关系的正确性
我们可以用xyFromCell()函数查看像元的坐标,直接验证邻接逻辑:
# 查看像元1和3的中心坐标 xyFromCell(r, 1) # 返回 (0.5, 2.5) → 第1列第1行 xyFromCell(r, 3) # 返回 (0.5, 0.5) → 第1列第3行
这两个像元在同一列,垂直相邻,确实是车氏邻接的合法关系。
内容的提问来源于stack exchange,提问作者gvan
相关产品推荐
相关产品推荐

