def main(args): # Load the stack stack = ice.Stack(args.stackfile) # Convert fps to interval (ms) interval = 1000 / args.fps cmap = ice.get_cmap(args.cmap) fig, ax = plt.subplots(figsize=(7, 11)) ax.set_xlabel('X (m)') ax.set_ylabel('Y (m)') fig.set_tight_layout(True) # Calculate frames print('Creating frames for animation:') ims = [] for i in tqdm(range(len(stack._datasets['data']))): ims.append(frame(i, stack, ax, cmap, args.clim)) # Add colorbar ''' cbar = plt.colorbar(ims[0][0], ax=ax) cbar.set_label('Velocity (m/day') ''' # Create animation print('Saving animation to', args.save) anim = animation.ArtistAnimation(fig, ims, interval=interval, repeat=True) anim.save(args.save, dpi=args.dpi)
def main(args): # Load the raster r = ice.Raster(args.rasterfile, band=args.band) fig, ax = plt.subplots() vmin, vmax = args.clim cmap = ice.get_cmap(args.cmap) im = ax.imshow(r.data, aspect='auto', vmin=vmin, vmax=vmax, cmap=cmap, extent=args.xscale*r.hdr.extent) cbar = plt.colorbar(im, ax=ax, pad=0.02) plt.tight_layout() plt.show()
def main(args): # Load the stack stack = ice.Stack(args.stackfile) # Check if requested dataset is 2D. If so, view it directly if stack[args.key].ndim == 2: mean = stack[args.key][()] # Otherwise, compute mean else: mean = stack.mean(key=args.key) # Load reference SAR image if args.ref is not None: sar = ice.Raster(rasterfile=args.ref) if sar.hdr != stack.hdr: sar.resample(stack.hdr) db = 10.0 * np.log10(sar.data) low = np.percentile(db.ravel(), 5) high = np.percentile(db.ravel(), 99.9) else: db = None fig, ax = plt.subplots() vmin, vmax = args.clim cmap = ice.get_cmap(args.cmap) if db is not None: ref = ax.imshow(db, aspect='auto', cmap='gray', vmin=low, vmax=high, extent=stack.hdr.extent) im = ax.imshow(mean, aspect='auto', vmin=vmin, vmax=vmax, cmap=cmap, extent=stack.hdr.extent, alpha=args.alpha) cbar = plt.colorbar(im, ax=ax, pad=0.02) cbar.set_label(args.key) plt.show() if args.save is not None: out = ice.Raster(data=mean, hdr=stack.hdr) out.write_gdal(args.save, epsg=args.save_epsg)
def main(args): # Load the stack stack = ice.Stack(args.stackfile) # Get frame if args.frame == 'initial': mean = stack.slice(0, key=args.key) elif args.frame == 'final': mean = stack.slice(stack.Nt - 1, key=args.key) elif args.frame == 'mean': mean = stack.mean(key=args.key) elif args.frame == 'std': mean = stack.std(key=args.key) else: raise ValueError('Unsupported frame type.') # If model directory is given, load model stack (full fit) mstack = None if args.mfile is not None: mstack = ice.Stack(args.mfile) # Load reference SAR image if args.ref is not None: sar = ice.Raster(rasterfile=args.ref) if sar.hdr != stack.hdr: sar.resample(stack.hdr) db = 10.0 * np.log10(sar.data.astype(np.float32)) low = np.percentile(db.ravel(), 5) high = np.percentile(db.ravel(), 99.9) else: db = None # Initialize image plot fig, ax = plt.subplots() vmin, vmax = args.clim cmap = ice.get_cmap(args.cmap) if db is not None: ref = ax.imshow(db, aspect='auto', cmap='gray', vmin=low, vmax=high, extent=stack.hdr.extent) im = ax.imshow(mean, aspect='auto', vmin=vmin, vmax=vmax, cmap=cmap, extent=stack.hdr.extent, alpha=args.alpha) cbar = plt.colorbar(im, ax=ax, pad=0.02) cbar.set_label(args.key) # Initialize plot for time series for a given pixel pts, axts = plt.subplots(figsize=(10, 6)) # Define action for clicking on deformation map def printcoords(event): if event.inaxes != ax: return # Get cursor coordinates y, x = event.ydata, event.xdata # Print out pixel locaton i, j = stack.hdr.xy_to_imagecoord(x, y) print('Row: %d Col: %d' % (i, j)) # Get time series for cursor location d = stack.timeseries(xy=(x, y), key=args.key) # Plot data and fit axts.clear() if args.sigma: w = stack.timeseries(xy=(x, y), key='weights') sigma = 1.0 / w axts.errorbar(stack.tdec, d, yerr=sigma, fmt='o') else: axts.plot(stack.tdec, d, 'o') if mstack is not None: fit = mstack.timeseries(xy=(x, y), key=args.mkey) axts.plot(mstack.tdec, fit, 'o') axts.set_xlabel('Year') axts.set_ylabel('Velocity') pts.canvas.draw() cid = fig.canvas.mpl_connect('button_press_event', printcoords) plt.show() fig.canvas.mpl_disconnect(cid)
def main(args): # Load Stack stack = ice.Stack(args.stackfile) # Load reference SAR image if args.ref is not None: sar = ice.Raster(rasterfile=args.ref) if sar.hdr != stack.hdr: sar.resample(stack.hdr) db = 10.0 * np.log10(sar.data) low = np.percentile(db.ravel(), 5) high = np.percentile(db.ravel(), 99.9) else: db = None # Set up animation fig, ax = plt.subplots(figsize=args.figsize) data = stack._datasets[args.key] cmap = ice.get_cmap(args.cmap) # Add ref image if using if db is not None: ax.imshow(db, aspect='auto', cmap='gray', vmin=low, vmax=high, extent=stack.hdr.extent) # Extract reference frame if index provided if args.rel_index is not None: data_ref = data[args.rel_index] else: data_ref = 0.0 im = ax.imshow(data[0] - data_ref, extent=stack.hdr.extent, cmap=cmap, clim=args.clim, alpha=args.alpha) # Create title datestr = ice.tdec2datestr(stack.tdec[0]) tx = ax.set_title(args.title + ' ' + datestr, fontweight='bold') ax.set_xlabel(args.xlabel) ax.set_ylabel(args.ylabel) # Add colorbar div = make_axes_locatable(ax) cax = div.append_axes('right', '5%', '5%') cb = fig.colorbar(im, cax=cax) cb.set_label(args.clabel) # Update the frame def animate(i): im.set_data(data[i] - data_ref) datestr = ice.tdec2datestr(stack.tdec[i]) tx.set_text(args.title + ' ' + datestr) fig.set_tight_layout(True) print('Generating animation and saving to', args.save) interval = 1000 / args.fps # Convert fps to interval in milliseconds anim = animation.FuncAnimation(fig, animate, interval=interval, frames=len(data), repeat=True) anim.save(args.save, dpi=args.dpi) if args.show: plt.show()
def main(args): # Load the raster raster = ice.Raster(rasterfile=args.rasterfile) # Load reference SAR image if args.ref is not None: sar = ice.Raster(rasterfile=args.ref) if sar.hdr != raster.hdr: sar.resample(raster.hdr) db = 10.0 * np.log10(sar.data) low = np.percentile(db.ravel(), 5) high = np.percentile(db.ravel(), 99.9) else: db = None fig, ax = plt.subplots() vmin, vmax = args.clim cmap = ice.get_cmap(args.cmap) if db is not None: ref = ax.imshow(db, aspect='auto', cmap='gray', vmin=low, vmax=high, extent=raster.hdr.extent) im = ax.imshow(raster.data, aspect='auto', vmin=vmin, vmax=vmax, cmap=cmap, extent=raster.hdr.extent, alpha=args.alpha) # Define action for clicking on deformation map xpts = []; ypts = [] def printcoords(event): global line if event.inaxes != ax: return # Get cursor coordinates if left-click if event.button == 1: y, x = event.ydata, event.xdata xpts.append(x) ypts.append(y) if line is None: line, = ax.plot(xpts, ypts, '-o') else: line.set_xdata(xpts) line.set_ydata(ypts) # Right-click clear the points elif event.button == 3: xpts.clear() ypts.clear() line.set_xdata(xpts) line.set_ydata(ypts) fig.canvas.draw() cid = fig.canvas.mpl_connect('button_press_event', printcoords) plt.show() fig.canvas.mpl_disconnect(cid) # Save the points np.savetxt(args.output, np.column_stack((xpts, ypts)))