Jarkus & Google Earth

This tutorial shows how to plot a jarkus transect in OpenEarth.

Contents

Extract data from netCDF database

extract lat, lon, z, data from the netCDF database. See the read JarKus tutorial if this is new to you.

url         = jarkus_url;
id          = nc_varget(url,'id');
transect_nr = find(id==8007000)-1;
year        = 1970 + floor(nc_varget(url,'time')/365);
year_nr     = find(year == 1993)-1;
lat         = nc_varget(url,'lat',[transect_nr,0],[1,-1]);
lon         = nc_varget(url,'lon',[transect_nr,0],[1,-1]);
z           = nc_varget(url,'altitude',[year_nr,transect_nr,0],[1,1,-1]);
Error using netcdflib
The NetCDF library encountered an error during execution of 'open' function - 'I/O failure (NC_EIO)'. If the data source was an  OPeNDAP URL, see the OPeNDAP Troubleshooting section in the Users Guide.

Error in netcdf.open (line 60)
        [varargout{:}] = netcdflib ( 'open', filename, varargin{1} );

Error in nc_varget_tmw>varget_nc (line 21)
ncid=netcdf.open(ncfile,'NOWRITE');

Error in nc_varget_tmw (line 5)
    [data,info] = varget_nc(ncfile,varname,varargin{:});

Error in nc_vargetr (line 38)
   		[data,info] = nc_varget_tmw(ncfile,varname,varargin{:});

...

Check the data

we will check the data with matlab line:

line(lat,lon,z)
view([-67 32])
grid on

Since there are NaN values in the data, not al datapoints are connected.

line(lat,lon,z,'lineStyle','none','marker','.','color',[1 0 0])

We can overcome this problem by linear interpolation of z to xRSP.

xRSP        = nc_varget(url,'cross_shore');
not_nan     = ~isnan(z);
zi          = interp1(xRSP(not_nan),z(not_nan),xRSP);

we will check the data again with matlab line:

clf; line(lat,lon,zi)
view([-67 32])
grid on

Make line plot

This works as expected, so now we will plot the data. We will exagerate the z data, by adding 20 and multiplying by 5, using the zScaleFun;

fname = 'Jarkus.kml';
KMLline(lat,lon,zi,'fileName',fname,'zScaleFun',@(z)(z+20)*5);

Animation in time

Get altitude for multiple years

z               = nc_varget(url,'altitude',[1,transect_nr,0],[-1,1,-1]);

interpolate z

zi = nan(size(z));
for yy = 1:size(z,1)
    not_nan     = ~isnan(z(yy,:));
    zi(yy,:)    = interp1(xRSP(not_nan),z(yy,not_nan),xRSP);
end

We must provide lat and lon data for every entry of z;

lat = repmat(lat,size(z,1),1);
lon = repmat(lon,size(z,1),1);

An we must get the times.

timeIn  = datenum(year,1,1);
timeOut = datenum(year+1,1,1);
KMLline(lat',lon',zi','timeIn',timeIn,'timeOut',timeOut,...
    'fileName',fname,'zScaleFun',@(z)(z+20)*5);

Multiple animated transects

Finally we can also plot multiple jarkus transects at once. We will start from the beginning, with querying the data

no_of_transects = 10;
no_of_years     = 15;
url             = jarkus_url;
id              = nc_varget(url,'id');
start_transect  = find(id==8007000)-1;
year            = 1970 + floor(nc_varget(url,'time')/365);
start_year      = find(year == 1990)-1;
lat             = nc_varget(url,'lat',[start_transect,0],[no_of_transects,-1]);
lon             = nc_varget(url,'lon',[start_transect,0],[no_of_transects,-1]);
z               = nc_varget(url,'altitude',...
                   [start_year,start_transect,0],...
                   [no_of_years,no_of_transects,-1]);
year            = 1970 + floor(nc_varget(url,'time',start_year,no_of_years)/365);
xRSP            = nc_varget(url,'cross_shore');

Interpolation of z, notice the use of squeeze.

zi = nan(size(z));
for yy = 1:no_of_years
    for nn = 1:no_of_transects
        not_nan     = squeeze(~isnan(z(yy,nn,:)));
        zi(yy,nn,:) = interp1(xRSP(not_nan),squeeze(z(yy,nn,not_nan)),xRSP);
    end
end

KMLline can not handle 3D inputs, so wil will have to put all the data in a 2D matrix. This requires some careful reshaping, to make sure the right lat/lon, z and time information are matched.

  • First step is expanding lat and lon to the same size as z
lat2 = nan(size(z));
lon2 = nan(size(z));
for yy = 1:no_of_years
    lat2(yy,:,:) =  lat;
    lon2(yy,:,:) =  lon;
end
  • Then we reshape the data to a 2D matrix
lat2    = reshape(lat2,no_of_years*no_of_transects,[]);
lon2    = reshape(lon2,no_of_years*no_of_transects,[]);
zi      = reshape(zi  ,no_of_years*no_of_transects,[]);
  • Time data also has to be reshaped
year    = repmat(year,no_of_transects,1)';
timeIn  = datenum(year,1,1);
timeOut = datenum(year+1,1,1);
  • And finally we can call KMLline
KMLline(lat2',lon2',zi','timeIn',timeIn,'timeOut',timeOut,...
        'zScaleFun',@(z) (z+20)*5,'fileName',fname);