3535warnings .filterwarnings ("ignore" )
3636from pyflextrkr .ft_utilities import load_config , subset_files_timerange
3737
38+ #-----------------------------------------------------------------------
39+ def four_floats (value ):
40+ # Split string by ' '
41+ values = value .split (' ' )
42+ if len (values ) != 4 :
43+ raise argparse .ArgumentError
44+ # Convert list to array and type to float
45+ values = np .array (values ).astype (float )
46+ return values
47+
3848#-----------------------------------------------------------------------
3949def parse_cmd_args ():
4050 # Define and retrieve the command-line arguments...
@@ -45,7 +55,8 @@ def parse_cmd_args():
4555 parser .add_argument ("-e" , "--end" , help = "last time in time series to plot, format=YYYY-mm-ddTHH:MM:SS" , required = True )
4656 parser .add_argument ("-c" , "--config" , help = "yaml config file for tracking" , required = True )
4757 parser .add_argument ("-p" , "--parallel" , help = "flag to run in parallel (0:serial, 1:parallel)" , type = int , default = 0 )
48- parser .add_argument ("--extent" , nargs = '+' , help = "map extent (lonmin, lonmax, latmin, latmax)" , type = float , default = None )
58+ # parser.add_argument("--extent", nargs='+', help="map extent (lonmin, lonmax, latmin, latmax)", type=float, default=None)
59+ parser .add_argument ("--extent" , help = "map extent (lonmin lonmax latmin latmax)" , type = four_floats , action = 'store' , default = None )
4960 parser .add_argument ("--subset" , help = "flag to subset data (0:no, 1:yes)" , type = int , default = 0 )
5061 parser .add_argument ("--figsize" , nargs = '+' , help = "figure size (width, height) in inches" , type = float , default = [8 ,7 ])
5162 parser .add_argument ("--output" , help = "ouput directory" , default = None )
@@ -195,9 +206,9 @@ def plot_map(pixel_dict, plot_info, map_info, track_dict):
195206 yy = pixel_dict ['latitude' ]
196207 fvar = pixel_dict ['fvar' ]
197208 tn_perim = pixel_dict ['tn_perim' ]
198- lon_tn = pixel_dict ['lon_tn' ]
199- lat_tn = pixel_dict ['lat_tn' ]
200- tracknumbers = pixel_dict ['tracknumber_unique' ]
209+ # lon_tn = pixel_dict['lon_tn']
210+ # lat_tn = pixel_dict['lat_tn']
211+ # tracknumbers = pixel_dict['tracknumber_unique']
201212 # Get track data from dictionary
202213 ntracks = track_dict ['ntracks' ]
203214 lifetime = track_dict ['lifetime' ]
@@ -219,7 +230,6 @@ def plot_map(pixel_dict, plot_info, map_info, track_dict):
219230 trackpath_color = plot_info ['trackpath_color' ]
220231 map_edgecolor = plot_info ['map_edgecolor' ]
221232 map_resolution = plot_info ['map_resolution' ]
222- # map_central_lon = plot_info['map_central_lon']
223233 timestr = plot_info ['timestr' ]
224234 figname = plot_info ['figname' ]
225235 figsize = plot_info ['figsize' ]
@@ -232,6 +242,9 @@ def plot_map(pixel_dict, plot_info, map_info, track_dict):
232242 draw_border = map_info .get ('draw_border' , False )
233243 draw_state = map_info .get ('draw_state' , False )
234244
245+ # Time difference matching pixel-time and track time
246+ dt_match = 1 # [min]
247+
235248 # Marker style for track center
236249 marker_style = dict (edgecolor = trackpath_color , facecolor = trackpath_color , linestyle = '-' , marker = 'o' )
237250
@@ -297,6 +310,7 @@ def plot_map(pixel_dict, plot_info, map_info, track_dict):
297310 for itrack in range (0 , ntracks ):
298311 # Get duration of the track
299312 ilifetime = lifetime .values [itrack ]
313+ itracknum = lifetime .tracks .data [itrack ]+ 1
300314 idur = (ilifetime / time_res ).astype (int )
301315 # Get basetime of the track and the last time
302316 ibt = base_time .values [itrack ,:idur ]
@@ -322,10 +336,25 @@ def plot_map(pixel_dict, plot_info, map_info, track_dict):
322336 cl1 = ax1 .scatter (meanlon .values [itrack ,0 ], meanlat .values [itrack ,0 ], s = marker_size * 2 ,
323337 transform = data_proj , zorder = 4 , ** marker_style )
324338
325- # Overplot tracknumbers at current frame
326- for ii in range (0 , len (lon_tn )):
327- ax1 .text (lon_tn [ii ]+ 0.02 , lat_tn [ii ]+ 0.02 , f'{ tracknumbers [ii ]:.0f} ' , color = 'k' , size = 10 ,
328- weight = 'bold' , ha = 'left' , va = 'center' , transform = data_proj , zorder = 4 )
339+ # Find the closest time from track times
340+ idt = np .abs ((ibt - pixel_bt ).astype ('timedelta64[m]' ))
341+ idx_match = np .argmin (idt )
342+ idt_match = idt [idx_match ]
343+ # Get center lat/lon from the matched tracks
344+ _ilon = meanlon .data [itrack ,idx_match ]
345+ _ilat = meanlat .data [itrack ,idx_match ]
346+ # Proceed if time difference is < dt_match
347+ if (idt_match < dt_match ):
348+ # Overplot tracknumbers at current frame
349+ if (_ilon > map_extent [0 ]) & (_ilon < map_extent [1 ]) & \
350+ (_ilat > map_extent [2 ]) & (_ilat < map_extent [3 ]):
351+ ax1 .text (_ilon + 0.02 , _ilat + 0.02 , f'{ itracknum :.0f} ' , color = 'k' , size = tracknumber_fontsize ,
352+ ha = 'left' , va = 'center' , weight = 'bold' , transform = data_proj , zorder = 5 )
353+
354+ # # Overplot tracknumbers at current frame
355+ # for ii in range(0, len(lon_tn)):
356+ # ax1.text(lon_tn[ii]+0.02, lat_tn[ii]+0.02, f'{tracknumbers[ii]:.0f}', color='k', size=10,
357+ # weight='bold', ha='left', va='center', transform=data_proj, zorder=4)
329358
330359 # Thread-safe figure output
331360 canvas = FigureCanvas (fig )
@@ -507,7 +536,6 @@ def work_for_time_loop(datafile, track_dict, map_info, plot_info, config):
507536 'trackpath_color' : 'blueviolet' , # track path color
508537 'map_edgecolor' : 'gray' , # background map edge color
509538 'map_resolution' : '50m' , # background map resolution ('110m', '50m', 10m')
510- # 'map_central_lon': 180, # map projection central longitude (for global map)
511539 'figsize' : figsize ,
512540 'figbasename' : figbasename ,
513541 }
0 commit comments