добавление границы при расчете SpatialLinesLengths - PullRequest
0 голосов
/ 10 апреля 2019

Я рассчитываю расстояние, пройденное человеком между несколькими точками вокруг объекта. Я создал полигон SpatialLines как для объекта (границы, которую нельзя пересечь), так и для движений человека. Есть ли способ включить границу в расчет объекта SpatialLinesLengths? Я понимаю, что это возможно при расчете KUD, но я не смог выяснить, как преобразовать эту информацию для использования при расчете пройденных расстояний.

Во-вторых, есть ли способ добавить граничный объект на график и заставить линейные движения обойти объект? Если так, есть ли способ слегка изогнуть линию, чтобы сюжет выглядел немного более реалистичным?


proj4string(dat.sp) <- CRS("+init=epsg:4326") #set that projection to actual data

dat.proj <- spTransform(dat.sp, CRS("+init=epsg:32611")) #transform data to the correct spatial projection

isle.shp <- readOGR(dsn = "C:////isle.shp", layer = "isle) #load in the boundary object

isle.sp <- spTransform(isle.shp, CRS("+init=epsg:32611")) #transform the shapefile to spatial points

datline.proj <- list(0)

ID <- sort(unique(dat.proj$ID)) #creates a vector of ids

for(i in 1:length(ID)){
  datline.proj[[i]] <- Lines(list(Line(coordinates(dat.proj[dat.proj@data$ID==ID[i],]))), ID=ID[i])
} #for every ID, set spatial 'coordinates' and assign a 'Line' object to the list of 'Lines'

track.proj <- SpatialLines(datline.proj) #coerce 'Lines' objects into a 'SpatialLines' object

proj4string(track.proj) <- CRS("+init=epsg:32611") #make it follow the the same projection

isle.bound <- as(isle.sp, 'SpatialLinesDataFrame') #convert the boundary object spatial polygons df to a spatial lines df

Теперь я могу как-нибудь добавить это в код ниже?

distance <- SpatialLinesLengths(track.proj, longlat = TRUE) #calculating distance traveled

distravel <- data.frame(Transmitter = ID, distance) #combine distance info with the individual data

track.proj <- SpatialLinesDataFrame(track.proj, data = distravel, match.ID = FALSE) #attach the df to generate a SpatialLinesDataFrame

track.proj@data #view the movements of individuals

Вторая часть вопроса относится к графике ниже

#now plot the SpatialLines object for every individual
plot_list <- list() #create an empty list

for(i in 1:length(ID)){ #for every iteration 
  file_name = paste("Spatial Lines Plots_", ID[i], ".png", sep="")
  #create a file name for each plot
  png(file_name) #save as a .png
  p <- plot(isle.sp, col = "grey80")
  p <- title(main = ID[i], col.main = "black", cex.main = 2)
  p <- plot(track.proj[i,], lwd = 3, col = "black", add = TRUE)
  plot_list[[i]] <- p #fill the plot_list with the plot created in the previous lines
  dev.off() #turn plotting off after each run of the loop
} #close for loop
...