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?
Es funktioniert, aber alle Unterschiede zweimal erscheinen. Irgendwelche Vorschläge, wie man jeden Unterschied nur einmal erstellt? –
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. –
Versuchen Sie eine Teilmenge auf 'Var1
bogdata