Определение пространственных соседей и учет NA в R (sp, rgeos)

Я пытаюсь идентифицировать соседний пространственный многоугольник с набором пространственных многоугольников, принимая во внимание, существует ли сосед или нет. Я использую функцию gTouches() из пакета rgeos, чтобы определить, какие геометрии имеют общую границу, однако я не знаю, как заставить ее учитывать, является ли значение соседа NA, и в этом случае я хотел бы, чтобы он найти следующую ближайшую геометрию. В следующем примере кода я хотел бы, чтобы соседи для tr2, которые включают NA, отличались от tr:

library(rgeos)
library(sp)

grid <- GridTopology(c(0,0), cellsize = c(1,1), cells.dim = c(5,5)) 
poly <- as(grid, "SpatialPolygons")         
id <- names(poly)   

tr <- 13                            ### Define this as the grid for which to find neighbors         
g.id <- sprintf("g%i", tr)              ###     
tr <- ifelse(id %in% g.id, 1, 0)    
tr2 <- ifelse(id %in% g.id, 1, 0)   
tr2[8] <- NA

ex <- SpatialPolygonsDataFrame(poly, data = data.frame(id = id, tr = tr, tr2 = tr2, row.names = row.names(poly)))   
adj <- gTouches(poly, poly[which(ex$tr==1)], byid = TRUE)
nbrs <- as.vector(apply(adj,1,which))

adj2 <- gTouches(poly, poly[which(ex$tr2==1)], byid = TRUE)
nbrs2 <- as.vector(apply(adj2,1,which))

nbrs            
  [1]  7  8  9 12 14 17 18 19
nbrs2   ### Should be 2,3,4 (replace 8), 7, 9, 12, 14, 17, 18, 19
  [1]  7  8  9 12 14 17 18 19

Любые мысли о том, как это сделать? Спасибо.


person coding_heart    schedule 11.02.2016    source источник
comment
Следуя этой логике, я предполагаю, что вы хотите, чтобы 2 3 4 заменил 8, а не только 3?   -  person Edzer Pebesma    schedule 12.02.2016
comment
Да все верно; редактировать это сейчас.   -  person coding_heart    schedule 12.02.2016


Ответы (1)


Если в nbrs2 есть NA, вы можете соединить начальный полигон с тем, у которого есть NA в tr2, и использовать gTouches в объединенном полигоне:

library(maptools)
if(any(is.na(tr2[nbrs2]))) {
        to_join <- nbrs2[which(is.na(tr2[nbrs2]))]
        joined_polygon <- unionSpatialPolygons(poly[c(which(tr2==1),to_join)],rep(1,length(to_join)+1))
        adj2 <- gTouches(poly,joined_polygon,byid=TRUE)
        nbrs2 <- as.vector(apply(adj2,1,which))
}
nbrs2


#[1]  2  3  4  7  9 12 14 17 18 19

to_join найдите номер многоугольника, следующего за 13 и имеющего NA в tr2. Затем мы можем использовать unionSpatialPolygons из maptools, чтобы соединить полигон 13 и полигон 8, а затем использовать gTouches, как вы сделали в своем коде, чтобы найти все соседние полигоны.

person NicE    schedule 13.02.2016