Как интерполировать точечные данные, используя наземный барьер в качестве эталона в R
У меня есть данные о местонахождении (широта / долгота) рыбы, движущейся вдоль прибрежной зоны. Я пытаюсь создать анимацию пути движения путем интерполяции пропущенных пропусков пути. Я пробовал разные методы приближения, но путь часто создается через сушу, потому что вдоль побережья нет непрерывных точек. Я также пробовал разные методы сплайн-функций, но это тоже не помогло. Я думал, что, возможно, интерполяция, которая использует контур земли в качестве ориентира, но не знаю точно, как это сделать.
Вот пример с некоторыми данными:
library(RgoogleMaps)
# Import data
data<-read.table(text="X Y dyear
151.3072 -33.8041 8
151.2894 -33.83614 9
151.2884 -33.83732 17
151.2891 -33.83643 18
151.2899 -33.83555 23
151.2883 -33.89567 29
151.2908 -33.83449 31
151.2905 -33.83479 34
151.3024 -33.9039 48
151.2888 -33.83681 54
151.2896 -33.8359 55
151.3091 -33.90823 61
151.353 -33.93437 69
151.3186 -33.91378 71
151.3048 -33.90545 92
151.3168 -33.9127 94
152.0964 -23.49146 117
152 -23.42931 356",header=TRUE)
## Define the time steps for smoothing:
times <- seq(min(data$dyear), max(data$dyear), by=1)
## Smoothing the data by using a interpolation method on both axes
x <- approxfun(data$dyear, data$X)
y <- approxfun(data$dyear, data$Y)
dy <- approxfun(data$dyear, data$dyear)
d <- data.frame(dy=round(dy(times)), X=x(times), Y=y(times))
d <- d[d$dy %in% times,]
names(d) <- c("times", "X", "Y")
## Use RgoogleMaps package to access the google server for background image:
# Using the parameters of your data you
lats = range(d$Y)
lons = range(d$X)
map <- GetMap.bbox(lons, lats, maptype="satellite",destfile="Map.png",
size=c(640,450), MINIMUMSIZE=F, SCALE=2) ## find backgound image using bounding box
pb <- txtProgressBar(min = 0, max = nrow(d), style = 3)
for(l in seq(1,length(d$times), by=1)) ## decrease the by value to slow down the animation
{
filename <- paste(sprintf("%05.0f", l),".png",sep="") ## individually name the .png created
png(file=filename, width=640, height=450) ## start creating the .png frame
PlotOnStaticMap(map, d$Y, d$X, type="n", add = F) ## background map
PlotOnStaticMap(map, d$Y[l:(l+100)],d$X[l:(l+100)], col="grey90", type="l",lwd=1.85, add =T) ## overlay trail
PlotOnStaticMap(map, d$Y[1:(l)],d$X[1:(l)], col="white", type="l",lwd=1.85, add =T) ## overlay remaining path
PlotOnStaticMap(map, d$Y[l+100],d$X[l+100], col="red", add = T, pch=16, cex=2) ## overlay moving point
Sys.sleep(0.001)
setTxtProgressBar(pb, l)
dev.off() ## complete creating the .png frame
}
Для создания анимации вам необходимо установить / вызвать Imagemagick. Вы можете использовать следующую ссылку>
http://www.imagemagick.org/script/index.php
# convert the .png files to one .gif file using ImageMagick.
system('"C:\\Program Files\\ImageMagick-6.9.1-Q16\\convert.exe" -delay 9 *.png test.gif"')
# To remove all the .png frames in you working directory (optional)
file.remove(list.files(pattern=".png"))