def coords_shade(mask, idens=6, style='u', west=0, east=360, south=-90, north=90): import numpy as np if style not in ['u', 'd', 'h', 'v', 'x', '+']: print('ERROR @ {}'.format(sys._getframe().f_code.co_name)) print('Unexpected value in $style: {}'.format(style)) quit() idens = int(idens) if style in ['x', '+']: if style == 'x': lons1_1, lons2_1, lats1_1, lats2_1 = \ coords_shade(mask, idens=idens, style='u', west=west, east=east, south=south, north=north) lons1_2, lons2_2, lats1_2, lats2_2 = \ coords_shade(mask, idens=idens, style='d', west=west, east=east, south=south, north=north) elif style == '+': lons1_1, lons2_1, lats1_1, lats2_1 = \ coords_shade(mask, idens=idens, style='h', west=west, east=east, south=south, north=north) lons1_2, lons2_2, lats1_2, lats2_2 = \ coords_shade(mask, idens=idens, style='v', west=west, east=east, south=south, north=north) lons1 = np.r_[lons1_1, lons1_2] lons2 = np.r_[lons2_1, lons2_2] lats1 = np.r_[lats1_1, lats1_2] lats2 = np.r_[lats2_1, lats2_2] return lons1, lons2, lats1, lats2 ny, nx = mask.shape wlat = float(north - south) / ny wlon = float(east - west) / nx lons_all = west + wlon*(np.arange(nx)+0.5) lats_all = south + wlat*(np.arange(ny)+0.5) lons_all, lats_all = np.meshgrid(lons_all, lats_all) mask_shade = np.zeros((ny, nx), dtype='int32') if style == 'u': for i in range(idens): mask_shade[i::idens, i::idens] = 1 elif style == 'd': for i in range(idens): mask_shade[-i-1::-idens, i::idens] = 1 elif style == 'h': mask_shade[::idens, :] = 1 elif style == 'v': mask_shade[:, ::idens] = 1 mask_shade[~mask] = 0 if style == 'u': mask_shade_ = np.zeros((ny, nx*2-1)) lons_all_ = np.zeros((ny, nx*2-1)) lats_all_ = lats_all for y in range(1, ny): mask_shade_[y, ny-y:ny-y+nx] = mask_shade[y,:] lons_all_[y, ny-y:ny-y+nx] = lons_all[y,:] elif style == 'd': mask_shade_ = np.zeros((ny, nx*2-1)) lons_all_ = np.zeros((ny, nx*2-1)) lats_all_ = lats_all for y in range(ny): mask_shade_[y, y:y+nx] = mask_shade[y,:] lons_all_[y, y:y+nx] = lons_all[y,:] elif style == 'h': mask_shade_ = np.transpose(mask_shade) lons_all_ = np.transpose(lats_all) lats_all_ = np.transpose(lons_all) elif style == 'v': mask_shade_ = mask_shade lons_all_ = lons_all lats_all_ = lats_all clons1_all, clons2_all, clats1_all, clats2_all = [], [], [], [] for x in range(mask_shade_.shape[1]): yy = np.where(mask_shade_[:,x] == 1)[0] if len(yy) == 0: continue yi, yf = [yy[0]], [] lons1, lons2 = [lons_all_[yy[0],x]], [] lats1, lats2 = [lats_all_[yy[0],0]], [] for y1, y2 in zip(yy[:-1], yy[1:]): if y1 != y2-1: yf.append(y1) yi.append(y2) lats1.append(lats_all_[y2,0]) lats2.append(lats_all_[y1,0]) lons1.append(lons_all_[y2,x]) lons2.append(lons_all_[y1,x]) yf.append(yy[-1]) lats2.append(lats_all_[yy[-1],0]) lons2.append(lons_all_[yy[-1],x]) clats1_all.append(lats1) clats2_all.append(lats2) clons1_all.append(lons1) clons2_all.append(lons2) lons1, lons2, lats1, lats2 = [], [], [], [] if style == 'u': for clons1, clons2, clats1, clats2 in \ zip(clons1_all, clons2_all, clats1_all, clats2_all): for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2): lons1.append(clon1 - wlon*0.5) lons2.append(clon2 + wlon*0.5) lats1.append(clat1 - wlat*0.5) lats2.append(clat2 + wlat*0.5) elif style == 'd': for clons1, clons2, clats1, clats2 in \ zip(clons1_all, clons2_all, clats1_all, clats2_all): for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2): lons1.append(clon1 - wlon*0.5) lons2.append(clon2 + wlon*0.5) lats1.append(clat1 + wlat*0.5) lats2.append(clat2 - wlat*0.5) elif style == 'h': for clons1, clons2, clats1, clats2 in \ zip(clons1_all, clons2_all, clats1_all, clats2_all): for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2): lats1.append(clon1 - wlon*0.5) lats2.append(clon2 + wlon*0.5) lons1.append(clat1) lons2.append(clat2) elif style == 'v': for clons1, clons2, clats1, clats2 in \ zip(clons1_all, clons2_all, clats1_all, clats2_all): for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2): lons1.append(clon1) lons2.append(clon2) lats1.append(clat1 - wlat*0.5) lats2.append(clat2 + wlat*0.5) lons1 = np.array(lons1) lons2 = np.array(lons2) lats1 = np.array(lats1) lats2 = np.array(lats2) return (lons1, lons2, lats1, lats2)