Finding the closest coordinate from a surface plot based on a X, Y location
87 views (last 30 days)
Show older comments
Jorge Luis Paredes Estacio
on 16 Aug 2024 at 16:48
Commented: Voss
on 20 Aug 2024 at 14:26
Hello, I want to extrapolate a point (longitude,latitude) from the coordinates of a surface file (attached here as "slab_strike") as it is empty (Strike=NaN) when using interp2 as the points are outside the boundary. Despite I used the option "nearest", it is empty anyway.
% Coordinates of the points:
lat_GMM= -17.8990;
lon_GMM=-73.5295;
% The surface plot
load slab_strike % Loading the slab strike
Slab_strike.x=x;
Slab_strike.y=y;
Slab_strike.z=z;
Strike = interp2(Slab_strike.x,Slab_strike.y,Slab_strike.z,lon_GMM,lat_GMM)
As Strike=NaN, there is a way I can choose the closest point value from the surface avoiding any NaN value and select the closest non-NaN value.
I would appreciate the help
0 Comments
Accepted Answer
Voss
on 16 Aug 2024 at 18:17
Moved: Torsten
on 16 Aug 2024 at 21:11
load slab_strike
is_ok = ~isnan(z);
[X,Y] = meshgrid(x,y);
X = X(is_ok);
Y = Y(is_ok);
Z = z(is_ok);
lon_GMM = -73.5295;
lat_GMM = -17.8990;
[~,idx] = min((X-lon_GMM).^2+(Y-lat_GMM).^2);
figure()
hold on
surf(x,y,z,'EdgeColor','none')
h1 = plot(lon_GMM,lat_GMM,'.r');
h2 = plot3(X(idx),Y(idx),Z(idx),'.k');
legend([h1 h2],{'Requested Point','Nearest Non-NaN z'})
xlim(lon_GMM+[-5 5])
ylim(lat_GMM+[-5 5])
6 Comments
Jorge Luis Paredes Estacio
on 20 Aug 2024 at 13:02
Edited: Jorge Luis Paredes Estacio
on 20 Aug 2024 at 13:02
More Answers (2)
Torsten
on 16 Aug 2024 at 17:08
Edited: Torsten
on 16 Aug 2024 at 17:22
lat_GMM and lon_GMM are not within the rectangle in which data for z are supplied.
In this case, interp2 returns NaN because it does not extrapolate.
Choose lat_GMM and lon_GMM in the limits for x and y where values are given for z.
Else you could use
[~,idx] = min(abs(x-lon_GMM))
[~,idy] = min(abs(y-lat_GMM))
Strike = z(idy,idx)
But it seems that your z-matrix contains NaN values.
6 Comments
Jorge Luis Paredes Estacio
on 16 Aug 2024 at 17:50
Edited: Jorge Luis Paredes Estacio
on 16 Aug 2024 at 17:52
Torsten
on 16 Aug 2024 at 17:56
Then try whether z is NaN in the 8 points surrounding (x(idx),y(idy)).
If this also doesn't work, test z for NaN in the 16 following points and so on.
Matt J
on 16 Aug 2024 at 17:15
Edited: Matt J
on 16 Aug 2024 at 17:19
F=griddedInterpolant({Slab_strike.x,Slab_strike.y},Slab_strike.z,'linear','nearest');
Strike = F(lon_GMM,lat_GMM);
See Also
Categories
Find more on Geographic Plots 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!