2017-09-27 2 views
2

Ich habe eine Video-Tracking-Software verwendet, um Tiere zu beobachten, die sich in einer Arena bewegt haben. Die Daten sind X-, Y-Koordinaten (in Pixel) der Tierposition zum Zeitpunkt Z (in der Bildnummer). Ein Beispiel Datenrahmen wie folgt aussieht:Breite eines Pfades definieren und Bereich berechnen

x <- c(1,2,3,4,4,4,4,3,2,1) 
y <- c(1,2,3,4,3,2,1,2,3,4) 
z <- 1:length(x) 
df <- data.frame(x, y, z) 

ich in das Verhalten des Tieres interessiert bin und möchte eine Metrik berechnen „Raum der Arena untersucht.“ Ich bin nicht sicher, der beste Weg, um darüber zu gehen, aber mein erster Gedanke ist es, einen schrittweisen Weg von den Punkten zu erstellen, definieren Sie dann eine Pufferbreite auf den Pfad, um ein Polygon zu erstellen, und schließlich berechnen Sie die Fläche von die Ebene unter dem Polygon. Optisch könnte ich so etwas vorstellen:

plot(x, y, type = "o", lwd = 20) 

enter image description here

Ich bin nicht in der räumlichen Daten wie diese erlebt, aber ich denke, 'ich diesen Weg rastern könnte? Leider ist der lwd Befehl nicht absolut, wenn also mein Flugzeug expandiert, wird die Linienbreite nicht mit skalieren.

Ich würde lieber R als GIS-Software verwenden.

Ich vermute, dass es eine elegantere Lösung gibt?

Antwort

2

Ich bin kein Experte in Tierpfad zu studieren, aber ich denke, das ist eine großartige Idee.

Wir verwenden das sf-Paket, das die nächste Generation Standard der Klasse und Methoden räumliche Daten in R. zu illustrieren

Um zu analysieren, wie es funktioniert, lassen Sie uns mit einem einfachen Beispiel beginnen. Wir werden eine Linie von c(0, 1) bis c(1, 1) zeichnen. Wir werden dann einen Puffer mit einem Abstand von 1 erstellen. Schließlich werden wir die Fläche der Pufferzone berechnen.

library(sf) 

# Create a simple feature object based on df 
ps <- as.matrix(rbind(c(0, 1), c(1, 1))) 
ls <- st_linestring(ps) 
# View the line 
plot(ls) 

enter image description here

# Create a buffer zone 
ls_buffer <- st_buffer(ls, dist = 1) 

# View ls_buffer 
plot(ls_buffer) 

enter image description here

# Calculate the area 
st_area(ls_buffer) 
[1] 5.140157 

Die Linie und Pufferzone sieht gut aus. Wir können den Bereich auch mit der Funktion st_area berechnen. Die Form der Pufferzone ähnelt einem Rechteck mit einer Breite von 1 und einer Höhe von 2 plus einem Kreis mit einem Radius von 1. Wir können die Fläche mit dem folgenden Code berechnen. Das Ergebnis ist ähnlich dem, was wir von der st_area-Funktion erhalten haben.

2 * 1 + 1 * 1 * pi 
[1] 5.141593 

Jetzt ist es einfach, die obigen Codes für Ihr Beispiel zu ändern. Ich stelle den Pufferabstand auf 0,1 ein, aber Sie müssen einen angemessenen Pufferabstand bestimmen.

# Create example data frame 
x <- c(1,2,3,4,4,4,4,3,2,1) 
y <- c(1,2,3,4,3,2,1,2,3,4) 
z <- 1:length(x) 
df <- data.frame(x, y, z) 

# Create a simple feature object based on df 
ps <- as.matrix(df[, c("x", "y")]) 
ls <- st_linestring(ps) 
# View the line 
plot(ls) 

enter image description here

# Create a buffer zone 
ls_buffer <- st_buffer(ls, dist = 0.1) 

# View ls_buffer 
plot(ls_buffer) 

enter image description here

# Calculate the area 
st_area(ls_buffer) 
[1] 2.263725 

Das sf Paket ist ziemlich neu, so lerne ich es immer noch und es gibt wahrscheinlich viele Funktionalitäten, die ich weiß nicht, noch. Bitte besuchen Sie diese Paket-Website auf CRAN (https://cran.r-project.org/web/packages/sf/index.html) und greifen Sie auf diese Vignetten, wenn Sie mehr erfahren möchten.

1

Dieser Ansatz beinhaltet GIS-Techniken innerhalb von R, aber ich denke, es ist ziemlich einfach und folgt den drei Schritten, die Sie angelegt haben.

library(sp) 
library(rgeos) 
library(dplyr) 

#Convert points to path (SpatialLines object)  
SOlines <- Line(coordinates(df[,1:2])) %>% list() %>% Lines(ID="test") %>% list() %>% SpatialLines() 
#Buffer the path into a polygon 
area <- rgeos::gBuffer(SOlines,width = .1, byid = T) 
#Calculate the area within the Polygon 
rgeos::gArea(area,byid=T) 
     test 
    2.262897 

Das sf Paket (wie in JOC Antwort) hat eine einfache Art und Weise den Leitungsweg zu schaffen. Ich bin mit diesem Paket noch nicht so vertraut, aber ich werde diese Antwort vorläufig behalten, da es eine gute Sache ist, mit SpatialLines Ansatz mehrere Zeilen (IDs) in einem Objekt zu speichern und dann alle Bereiche in einem Aufruf von zu berechnen gArea.

Verwandte Themen