2015-10-21 46 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