2016-05-24 9 views
0

Wie erhalte ich nur eine Liste der SpatialLines der Unterschiede der sich kreuzenden SpatialLines?Wie erhält man Differenzen von sich überschneidenden SpatialLines in R?

erstellen 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)) 

resultierende SpatialLines ("SL") zeigen Kreuzungen und Unterschiede.

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

sehen nur für die Unterschiede der Schnitt SpatialLines Blick: die Unterschiede aller SpatialLines der Liste empfangen kann wie folgt erreicht werden. Ich dachte über etwas wie wenn die Bedingung gIntersect=TRUE dann gelten gDifference(). Allerdings kann ich nicht einen Weg finden, dass in R. zu tun Vielleicht wird leider eine intelligentere Lösung ...

Edit: Die Antwort von bogdata funktioniert, aber alle Unterschiede zweimal erscheinen. Das Manipulieren der Matrix in einer Weise, dass der untere dreieckige Teil entfernt wird, führte zu dem Ergebnis, dass einige doppelte Differenzen beibehalten werden, während andere entfernt werden.

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]])}) 

Irgendwelche Vorschläge?

Antwort

0

Verwenden Sie einfach gIntersects mit byid=T und die melt Funktion in 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

Es funktioniert, aber alle Unterschiede zweimal erscheinen. Irgendwelche Vorschläge, wie man jeden Unterschied nur einmal erstellt? –

+0

Um nur eine Zeile pro Differenz zu erhalten, kann 'gLineMerge()' angewendet werden. Dies ist jedoch ein zusätzlicher Schritt, der durch erweitertes Data Mining vermeidbar sein könnte. –

+0

Versuchen Sie eine Teilmenge auf 'Var1 bogdata