如何估算空间权重矩阵的缺失邻居(queen contiguity)
How to impute missing neighbours of a spatial weight matrix (queen contiguity)
我有一个很大的形状文件,其中包含大约 180.000 个 250m^2 多边形。
我想创建一个空间权重矩阵(queen contiguity)。
所以如果它是邻居则为 1,否则为 0。
但是,有几个没有任何邻居(岛)的多边形。
如何为那些没有任何直接邻居的单元估算最近邻居?
(使用 sf 或 sp 包 - 在 R 中)
................................................ .....................
使用数据样本并绘制它,它看起来像:
sample shape file
然后我可以使用以下代码创建一个 W-Matrix:
Create NB List
sample_queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=T)
# Create Weights/list
sample_W.list.queen <- nb2listw(sample_queen_nb, style="W", zero.policy = TRUE)
# Create Matrix
sample_W.queen <- listw2mat(sample_W.list.queen)
并通过绘图检查其连通性:
# Plot ShpPolygons
plot(sp.sample)
# plot weightsmatrix to see connectivity
plot(sample_queen_nb, coords, add=TRUE, col="green", cex=0.5)
得到这个:
Connectivity Matrix
如您所见 - 有一个未连接的岛屿。我想为这个岛网格单元归因于附近的相邻单元。我该怎么做?
这就是我制作样本数据集的意思:
> library(spdep);example(columbus)
> sp.sample = columbus[c(1:5,10,23),]
> plot(sp.sample)
首先让我们检查一下我们有断开连接的区域:
> coords = coordinates(sp.sample)
> queen_nb = poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)
> plot(sp.sample);plot(queen_nb, coords, add=TRUE)
这里有一个函数,它接受一组区域,计算相同的邻接关系,然后如果有任何区域没有邻居,它会找到最近的邻居并将其添加到邻接对象中:
addnbs <- function(sp.sample){
queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)
count = card(queen_nb)
if(!any(count==0)){
return(queen_nb)
}
## get nearest neighbour index, use centroids:
nnbs = knearneigh(coordinates(sp.sample))$nn
no_edges_from = which(count==0)
for(i in no_edges_from){
queen_nb[[i]] = nnbs[i]
}
return(queen_nb)
}
让我们测试一下。
> n2 = addnbs(sp.sample)
> plot(sp.sample);plot(n2, coords, add=TRUE)
我有一个很大的形状文件,其中包含大约 180.000 个 250m^2 多边形。 我想创建一个空间权重矩阵(queen contiguity)。 所以如果它是邻居则为 1,否则为 0。 但是,有几个没有任何邻居(岛)的多边形。
如何为那些没有任何直接邻居的单元估算最近邻居?
(使用 sf 或 sp 包 - 在 R 中)
................................................ .....................
使用数据样本并绘制它,它看起来像:
sample shape file
然后我可以使用以下代码创建一个 W-Matrix:
Create NB List
sample_queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=T)
# Create Weights/list
sample_W.list.queen <- nb2listw(sample_queen_nb, style="W", zero.policy = TRUE)
# Create Matrix
sample_W.queen <- listw2mat(sample_W.list.queen)
并通过绘图检查其连通性:
# Plot ShpPolygons
plot(sp.sample)
# plot weightsmatrix to see connectivity
plot(sample_queen_nb, coords, add=TRUE, col="green", cex=0.5)
得到这个:
Connectivity Matrix
如您所见 - 有一个未连接的岛屿。我想为这个岛网格单元归因于附近的相邻单元。我该怎么做?
这就是我制作样本数据集的意思:
> library(spdep);example(columbus)
> sp.sample = columbus[c(1:5,10,23),]
> plot(sp.sample)
首先让我们检查一下我们有断开连接的区域:
> coords = coordinates(sp.sample)
> queen_nb = poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)
> plot(sp.sample);plot(queen_nb, coords, add=TRUE)
这里有一个函数,它接受一组区域,计算相同的邻接关系,然后如果有任何区域没有邻居,它会找到最近的邻居并将其添加到邻接对象中:
addnbs <- function(sp.sample){
queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)
count = card(queen_nb)
if(!any(count==0)){
return(queen_nb)
}
## get nearest neighbour index, use centroids:
nnbs = knearneigh(coordinates(sp.sample))$nn
no_edges_from = which(count==0)
for(i in no_edges_from){
queen_nb[[i]] = nnbs[i]
}
return(queen_nb)
}
让我们测试一下。
> n2 = addnbs(sp.sample)
> plot(sp.sample);plot(n2, coords, add=TRUE)