4

I have a gps units that records coordinates at rather random intervals (sometimes every 12 sec sometimes every 6 sec). There's another instrument that measures particulate matter at every second. I'm looking for a way to interpolate the coordinates at unrecorded timestamps for every second based on the existing coordinates and the speed of the movement, so that I can merge the gps data with the particulate matter dataset. To make things a bit easier, I can assume that the route between two consecutive coordinates is straight line and is travelled at a constant speed. So all I need to do is to assign every second in-between two coordinates with the difference between two consecutive coordinates recorded divided by the difference in time in second. Taking the dataset below for example, I can assign X and Y at 09:32:01 to 325695 + (325695-325695)/12 and 672878 + (672857-672878)/12. So is there any function in R that allows similar calculation. Since it seems to be a quite common operation in the GIS area, maybe there's a specific tool designed for this in ArcGIS?

date          time         X       Y    
04/06/2014  09:32:00    325695  672878  
04/06/2014  09:32:12    325695  672857  
04/06/2014  09:32:24    325694  672845  
04/06/2014  09:32:36    325690  672825  
04/06/2014  09:32:48    325685  672803  
04/06/2014  09:33:00    325685  672783  

Any suggestions and thoughts are welcome.

Thanks

SymbolixAU
  • 25,502
  • 4
  • 67
  • 139
moho wu
  • 471
  • 4
  • 13

1 Answers1

5

Since your data is a time series, you're better off using na.approx(...) in package zoo.

df$date.time <- with(df,as.POSIXct(paste(date,time),format="%m/%d/%Y %H:%M:%S"))
full.time    <- with(df,seq(date.time[1],tail(date.time,1),by=1))
library(zoo)
df.zoo <- zoo(df[,3:4],df$date.time)        # convert to zoo object
result <- na.approx(df.zoo,xout=full.time)  # interpolate; result is also a zoo object
head(result)
                         X        Y
2014-04-06 09:32:00 325695 672878.0
2014-04-06 09:32:01 325695 672876.2
2014-04-06 09:32:02 325695 672874.5
2014-04-06 09:32:03 325695 672872.8
2014-04-06 09:32:04 325695 672871.0
2014-04-06 09:32:05 325695 672869.2

There is also an na.spline(...) function if you need continuous derivatives at the grid points.

jlhoward
  • 58,004
  • 7
  • 97
  • 140
  • Thanks, this methods works great. I also managed to convert the zoo object to data frame based on this thread: http://stackoverflow.com/questions/14064097/r-convert-between-zoo-object-and-data-frame-results-inconsistent-for-different – moho wu Nov 10 '14 at 11:47