2016-05-24 6 views
0

Как получить список SpatialLines различий только для пересекающихся SpatialLines?Как получить различия между пересекающимися SpatialLines в R?

создать SpatialLines:

#from the sp vignette: 
l1 = cbind(c(1,2,3,4),c(3,2,2,4)) 
rownames(l1) = letters[1:4] 
l2 = cbind(c(2,2,3,3),c(3,2,2,5)) 
rownames(l2) = letters[1:4] 
l3 = cbind(c(1,2,3,4),c(1,2,2,1)) 
rownames(l3) = letters[1:4] 
Sl1 = Line(l1) 
Sl2 = Line(l2) 
Sl3 = Line(l3) 
Ll1 = Lines(list(Sl1), ID="a") 
Ll2 = Lines(list(Sl2), ID="b") 
Ll3 = Lines(list(Sl3), ID="c") 
Sl = SpatialLines(list(Ll1,Ll2,Ll3)) 

в результате SpatialLines ("Sl") показать перекрестки и различия. Получение различия всех SpatialLines списка может быть достигнуто следующим образом:

C = combn(1:length(Sl),2) 
C2 = cbind(C,C[2:1,]) 
MyDiffs = apply(C2, 2, function(x){gDifference(Sl[x[1]], Sl[x[2]])}) 

см spacedman´s answer to this question

В поисках различий только пересекающимися SpatialLines. Я думал о чем-то вроде, если условие gIntersect=TRUE затем применить gDifference(). Тем не менее, я не могу найти способ сделать это в R. Может быть there's умнее решение ...

Edit: Ответ bogdata работ, но все различия появляются дважды. Манипулирование матрицы таким образом, что нижняя треугольная часть удаляется, приводит к тому, что некоторые удвоенные различия сохраняются, а другие удаляются.

library("reshape2") 
# compute intersection matrix by ID 
intersections <- gIntersects(Sl, byid=TRUE) 
# set lower triangular part of matrix NA 
intersections[lower.tri(intersections, diag = TRUE)] <- NA 
# melt matrix into edge list (+remove NA) 
intersections <- melt(intersections, na.rm=TRUE) 
# compute differences 
MyDiffs = apply(intersections, 1, function(x){gDifference(Sl[x[1]], Sl[x[2]])}) 

Любые предложения?

ответ

0

gIntersects Просто используйте с byid=T и melt функция reshape2:

library("reshape2") 
# compute intersection matrix by ID 
intersections <- gIntersects(Sl, byid=T) 
# melt matrix into edge list 
intersections <- melt(intersections) 
# keep only intersecting lines, remove diagonals 
intersections <- subset(intersections, Var1 != Var2 & value) 
# compute differences 
MyDiffs = apply(intersections, 1, function(x){gDifference(Sl[x[1]], Sl[x[2]])}) 
+0

Он работает, но все различия появляются дважды. Любые предложения о том, как создавать каждую разницу только один раз? –

+0

Чтобы получить только одну строку за разницу, можно применить 'gLineMerge()'. Однако это дополнительный шаг, который можно было бы избежать с помощью расширенного интеллектуального анализа данных. –

+0

Попробуйте подмножество на 'Var1 bogdata