2015-10-21 80 views
0

我有一個帶有道路像素的柵格和一組使用函數SpatialLines(程序包sp)定義的線條。對於每條線路,我想找到與道路交叉點的數量。我的想法是,在第一時間,對道路的像素轉換成類SpatialLines的對象,然後使用功能gIntersectionHow to get the intersection point of two vector查找沿着空間線的像素交叉點的數量

是否有任何職能道路像素轉換成類SpatialLines的對象或沒有任何人知道一個更好的方式來找到沿着每條線的道路交叉點的數目?

我開始重新分類我的光柵獲得唯一道路像素:

m <- c(1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,1) 
r <- matrix(m, ncol=2, byrow=TRUE) 
rc <- reclassify(data.raster, r) 
+0

執行道路具有唯一的ID? – johannes

+0

不,道路沒有獨特的ID。 – Marine

回答

2

有一對夫婦的道路,你可以用光柵包才能到達口岸的數量。例如:

library(raster) 
# Example data 
# lines 
cds1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60)) 
cds2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55)) 
cds3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45)) 
lines <- spLines(cds1, cds2, cds3) 

# raster 
r <- raster(ncols=90, nrows=45) 
values(r) <- sample(1:10, ncell(r), replace=TRUE) 


roads <- subs(r, data.frame(from=10, to=1)) 
rline <- rasterize(lines, roads, field=1, fun='sum') 

m <- mask(rline, roads) 
cellStats(m, 'sum') 

不同的路線:

e <- extract(r, lines) 
s <- sapply(e, function(x) sum(x==10, na.rm=TRUE)) 
sum(s) 

或許,這解決了皮埃爾的重複計算問題。只有非相鄰交叉計數:

e <- extract(r, lines) 
s <- sapply(e, function(x) sum(diff(c(FALSE, x==10)) == 1, na.rm=TRUE)) 
sum(s) 

鄰接也可以經由

e <- extract(r, lines, cellnumbers=TRUE) 

看了看,然後利用相鄰功能

+0

但是,如果道路的寬度對應於兩個像素和線穿過這些兩個像素,代碼將考慮的兩個像素作爲兩個不同的交叉點,而不是一個交叉點! – Pierre

+0

@Pierre:謝謝,良好的出發點。我想,我已經展示了一個處理這個問題的方法。雖然沒有進一步分析,但我們無法真正瞭解兩個相鄰道路柵格單元是否代表相同的道路。畢竟,提取道路線可能會更好。 – RobertH