Skip to content
Snippets Groups Projects
plot_map.m 8.06 KiB
Newer Older
function plot_map(hTsgGUI, hPlotAxes)
% Function to plot the earth map and ship trackline
%
% Input
% -----
% hTsgGUI ............ Handel to the main user interface
% hPlotAxes .......... Handels to the graphic axes
%
% Output
% ------
%
% Library : 'M_MAP'
% note that a decimal degree notation is used, so that a longitude of
% PROBLEM NOT YET RESOLVED
%
% $Id$

% Retrieve named application data
% -------------------------------
tsg = getappdata( hTsgGUI, 'tsg_data');

% save pointer and change it to watch
% -----------------------------------
pointer = get(hTsgGUI, 'pointer');
set(hTsgGUI, 'pointer', 'watch');
set(get(hPlotAxes(4), 'parent'), 'pointer', 'watch');

% Retrieve map border
% --------------------
border = tsg.preference.map_border;
% Retrieve map resolution 
% set 'checked' property to 'on' for current map resolution if user
% change it from menu option/preferences
% ------------------------------------------------------------
hdl = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_RESOLUTION_'));
set(hdl, 'Checked', 'off');  % set all menu off
set(hdl(tsg.preference.map_resolution), 'checked', 'on');

% Get the Geographic limit of the TSG time series
% -----------------------------------------------
dateLim = get(hPlotAxes(1), 'Xlim');
ind = find( tsg.DAYD >= dateLim(1) & tsg.DAYD <= dateLim(2));

% m_grid need the use of double instead single
% --------------------------------------------
latx = double(tsg.LATX);
lonx = double(tsg.LONX);

if ~isempty( ind )
  if latMin < -90
    latMin = -90;
  end
  if latMax > 90
    latMax = 90;
  end
  lonMin = min( lonx(ind) );
  lonMax = max( lonx(ind) );
  % Oversize window due to the large frame
  %--------------------------------------
  latRange = (latMax-latMin);
  latMin = max(floor(latMin), -90);
  latMax = min(ceil(latMax), 90);
  lonRange = (lonMax-lonMin);
  lonMin = floor(lonMin);
  lonMax = ceil(lonMax);
  lonRange = (lonMax-lonMin);
  if lonRange>=360
    lonMin = -183.6;     %to account for fancy frame
    lonMax = 183.6;
    tsg.lonplus = 180;
    tsg.lonmod = 360;
  % Positionning the right axes (set map current axe)
  % -------------------------------------------------
  axes(hPlotAxes(4));
  % Use of Mercator projection
  % --------------------------
  m_proj('Mercator','lat',[latMin-border latMax+border],'long',[lonMin-border lonMax+border]);
  % plot climatology mean contour if available
  % ------------------------------------------
  hdl = findobj( '-regexp', 'tag', 'PUSHTOOL_CLIM');
  if strcmp(get(hdl, 'state'), 'on')
    climato = tsg.levitus.data.(['WOA_MEAN_' tsg.plot.sample]);
    % get last selected climatology structure
    s = get(findobj('Tag', 'TAG_UIMENU_CLIMATO_MAIN'), 'Userdata');
    level = tsg.preference.levitus_depth_value;
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % extract the matrix
    climato = squeeze(climato(s.time, level,:,:));
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % use local var for quick access
    LATX = tsg.levitus.data.WOA_LATX;
    LONX = tsg.levitus.data.WOA_LONX;
    
    % swap negative value (west) to 180-360
    if ~isempty(tsg.indcross)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
      LONX(LONX < 0) = LONX(LONX < 0) + 360;
      [val, indval] = sort(LONX);
      LONX          = LONX(indval);
      climato       = climato(:,indval);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    
    % find  indices for the selected area
    indLat = find(LATX > latMin-border & LATX <latMax+border);
    indLon = find(LONX > lonMin-border & LONX <lonMax+border);
    lon = LONX(indLon);
    lat = LATX(indLat);
    
    % plot climatogogy
    m_pcolor(lon, lat, climato(indLat, indLon));
    shading flat;
    %colormap(m_colmap('jet','step',10));
    colorbar;
  else
    colorbar('off');
  end
  
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  % select map type and resolution
  switch tsg.preference.map_resolution
      if tsg.preference.map_patch_value == 2
        m_coast('patch',[.7 .7 .7], 'TAG', 'TAG_PLOT4_LINE_COAST');
      else
        s = load('world_c.mat');
      end
      
    case 2
      % Medium-resolution coast lines
      % -----------------------------
      if tsg.preference.map_patch_value  == 2
        m_gshhs_l('patch',[.7 .7 .7], 'TAG', 'TAG_PLOT4_LINE_COAST');
      else
        s = load('world_l.mat');
      end
      
      
      if tsg.preference.map_patch_value  == 2
        m_gshhs_i('patch',[.7 .7 .7], 'TAG', 'TAG_PLOT4_LINE_COAST');
      else
        s = load('world_i.mat');
      end
      
      
    case 4
      % High-resolution coast lines
      % ----------------------------
      if tsg.preference.map_patch_value  == 2
        m_gshhs_h('patch',[.7 .7 .7], 'TAG', 'TAG_PLOT4_LINE_COAST');
      else
        s = load('world_h.mat');
      end
      
    otherwise
      tsg.preference.map_resolution = 1;
      % Low-resolution coast lines
      % --------------------------
      if tsg.preference.map_patch_value  == 2
        m_coast('patch',[.7 .7 .7], 'TAG', 'TAG_PLOT4_LINE_COAST');
      else
        s = load('world_c.mat');
      end
      
  % Make a grid on the map with fancy box
  % -------------------------------------
  m_grid('box', 'fancy', 'tickdir', 'in', 'TAG', 'TAG_PLOT4_LINE_GRID', ...
    'Fontsize', tsg.fontSize);
  
  
  % use 'world_x.mat' as tsg.preference.map_patch_string == 'off'
  % --------------------------------------------------------------
  if tsg.preference.map_patch_value == 1
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    % swap negative value (west) to 180-360
    if ~isempty(tsg.indcross)
      x(x < 0) = x(x < 0) + 360;
      % remove line horizontal lines
      x(x == 0) = nan;
    end
    
    % plot coast
  % Plot the ship track - Check if LAT-LON in deg-decimal
  % -----------------------------------------------------
  %m_line(lonx, latx, 'TAG', 'TAG_PLOT4_LINE_SHIPTRACK', 'marker','.','markersize',3,'color','b');
  %   m_line(lonx, latx, 'LineStyle', 'none', 'marker','*','markersize',2,'color','b');
  % Plot using QC
  % -------------
  % Get list of keys from hashtable tsg.qc.hash, defined inside
  % tsg_initialisation.m
  % -----------------------------------------------------------
  % Plot Sample/TSG differences on axe 2
  % iterate (loop) on each key store inside hastable
  % Iterate from the end of the cell array : fliplr
  % ------------------------------------------------
    % get  some values in hashtable
    % -----------------------------
    %qcState = tsg.qc.hash.(key).state;
    qcCode  = tsg.qc.hash.(key).code;
    qcColor = tsg.qc.hash.(key).color;
    % plot tsg salinity sample with right code/color
    % ----------------------------------------------
    ind = find( tsg.SSPS_QC == qcCode & isnan(tsg.SSPS) == 0);
    if ~isempty( ind )
      
      % Create line on the map
      % ----------------------
      m_line( mod(lonx(ind) + tsg.lonplus, tsg.lonmod) - tsg.lonplus,...
        latx(ind), 'LineStyle', 'none', 'marker','*',...
        'markersize', 2, 'color', qcColor);
  title( ['Cruise: ' tsg.file.name], 'fontsize',tsg.fontSize +2, ...
    'fontweight', 'bold','interpreter','none');
  % Set tag for each line
  % ---------------------
  hLines = get(hPlotAxes(4), 'Children');
  for i=1:length(hLines)
    set(hLines(i), 'Tag', ['TAG_PLOT4_LINE_MAP' int2str(i)]);
  end
  % Save tsg structure
  % ------------------
  setappdata( hTsgGUI, 'tsg_data', tsg);
  % restore pointer
  % ---------------
  set(hTsgGUI, 'pointer', pointer);
  set(get(hPlotAxes(4), 'parent'), 'pointer', 'arrow');