How to link lat/lon to a variable based on time?

9 views (last 30 days)
Niky Taylor
Niky Taylor on 24 Feb 2021
Commented: KSSV on 28 Feb 2021
Hi,
I have two sets of data taken simultaneously. Dataset A includes a time vector, and a corresponding matrix of lat/lon values taken at those times. Dataset B has a different time vector, and corresponding reflectance data.
I want to link the lat/lon from Dataset A to the reflectance data from Dataset B Since I have time for both datasets, I was thinking I could interpolate the lat/lon values from Dataset A to new lat/lon values that match the Dataset B time, but am struggling. Does anyone know how to do this?
I tried:
B_lat= interp1(A_time, A_lat, B_time);
But I get the error "Sample points must be unique and sorted in ascending order," which makes sense because the latitude vector doubles back on itself occasionally.
I also tried:
[B_lat,B_lon] = interpm(A_lat,A_lon,0.0001);
Which works, but then the issue is that I'm just getting a new, larger vector to match to Dataset B.
Also, just for context, originally I was just finding the closest times in A and B and matching the lat/lon and reflectance data that way, but then I realized that means that sometimes I end up with the same lat/lon for different data points. The data was taken on a boat, and I'm comfortable with the interpolation just being linear.
Thanks in advanced for the help! If I've left off any information please let me know.
  2 Comments
Lei Hou
Lei Hou on 25 Feb 2021
Hi Niky,
In your case, it is recommened to use timetable. Timetable has many useful functions when your data is linked to time. I think timetable/synchronize is the thing you are looking for. I tried the following.
ttA=timetable(datetime(A_time,'ConvertFrom',"datenum"),A_latlon);
ttB=timetable(datetime(B_time,'ConvertFrom',"datenum"),B_reflectance);
synchronize(ttA,ttB)
There are some missing time in ttB. After you decide what to do with missing times, synchronize(ttA,ttB) can work without error. You can also refer to synchronize doc to learn more.
Niky Taylor
Niky Taylor on 26 Feb 2021
Edited: Niky Taylor on 26 Feb 2021
Hi Lei,
Thanks, this is exactly what I was looking for. I removed the missing time values and associated data from dataset B. I also discovered a few duplicate lat/lon values in dataset A, so I removed those as well. Once I did that, I needed to specify that the variables should be continuous in order for synchronize to interpolate. So I ended up running:
ttA=timetable(datetime(A_time,'ConvertFrom',"datenum"),A_latlon);
ttA.Properties.VariableContinuity = {'continuous','continuous'};
ttB=timetable(datetime(B_time,'ConvertFrom',"datenum"),B_reflectance);
S = synchronize(ttA,ttB);
Thanks again!

Sign in to comment.

Answers (1)

KSSV
KSSV on 25 Feb 2021
load ABdatasets.mat ;
% Remove NaN's from B_time
idx = isnan(B_time) ;
B_time(idx) =[] ;
B_reflectance(idx) =[] ;
A_reflectance = interp1(B_time,B_reflectance,A_time) ;
plot(B_time,B_reflectance,'r')
hold on
plot(A_time,A_reflectance,'b')
legend('B','A')
NOTE: 1. There are few nans in B_time, why?
2. A_time has first few and last few out of range with B_time; so this is extrapolation and cannot be trusted.
  2 Comments
Niky Taylor
Niky Taylor on 26 Feb 2021
It seems like this would interpolate the reflectance data to match the metadata, which isn't what I want to do. I'd rather interpolate the metadata (time/lat/lon) to match the reflectance values and leave those unchanged.
KSSV
KSSV on 28 Feb 2021
Then read about knnsearch; this will give you the nearest points. Also have a look on ismember, ismembertol.

Sign in to comment.

Categories

Find more on Descriptive Statistics in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!