def __init__(self, image, bounds, origin='upper', colormap=None, mercator_project=False, pixelated=True, name=None, overlay=True, control=True, show=True, **kwargs): super(ImageOverlay, self).__init__(name=name, overlay=overlay, control=control, show=show) self._name = 'ImageOverlay' self.bounds = bounds self.options = parse_options(**kwargs) self.pixelated = pixelated if mercator_project: image = mercator_transform(image, [bounds[0][0], bounds[1][0]], origin=origin) self.url = image_to_url(image, origin=origin, colormap=colormap)
def __init__(self, image, bounds, origin='upper', colormap=None, mercator_project=False, pixelated=True, name=None, overlay=True, control=True, show=True, **kwargs): super(ImageOverlay, self).__init__(name=name, overlay=overlay, control=control, show=show) options = { 'opacity': kwargs.pop('opacity', 1.), 'alt': kwargs.pop('alt', ''), 'interactive': kwargs.pop('interactive', False), 'crossOrigin': kwargs.pop('cross_origin', False), 'errorOverlayUrl': kwargs.pop('error_overlay_url', ''), 'zIndex': kwargs.pop('zindex', 1), 'className': kwargs.pop('class_name', ''), } self._name = 'ImageOverlay' self.pixelated = pixelated if mercator_project: image = mercator_transform( image, [bounds[0][0], bounds[1][0]], origin=origin) self.url = image_to_url(image, origin=origin, colormap=colormap) self.bounds = json.loads(json.dumps(bounds)) self.options = json.dumps(options, sort_keys=True, indent=2)
def make_rgba(grid2D, levels, colorlist, mask=None, mercator=False): """ Make an rgba (red, green, blue, alpha) grid out of raw data values and provide extent and limits needed to save as an image file Args: grid2D: Mapio Grid2D object of result to mape levels (array): list of bin edges for each color, must be same length colorlist (array): list of colors for each bin, should be length one less than levels mask (float): mask all values below this value mercator (bool): project to web mercator (needed for leaflet, not for kmz) Returns: tuple: (rgba_img, extent, lmin, lmax, cmap), where: * rgba_img: rgba (red green blue alpha) image * extent: list of outside corners of image, [minlat, maxlat, minlon, maxlon] * lmin: lowest bin edge * lmax: highest bin edge * cmap: colormap corresponding to image """ data1 = grid2D.getData() if mask is not None: data1[data1 < mask] = float('nan') geodict = grid2D.getGeoDict() extent = [ geodict.xmin - 0.5*geodict.dx, geodict.xmax + 0.5*geodict.dx, geodict.ymin - 0.5*geodict.dy, geodict.ymax + 0.5*geodict.dy, ] lmin = levels[0] lmax = levels[-1] data2 = np.clip(data1, lmin, lmax) cmap = mpl.colors.ListedColormap(colorlist) norm = mpl.colors.BoundaryNorm(levels, cmap.N) data2 = np.ma.array(data2, mask=np.isnan(data1)) rgba_img = cmap(norm(data2)) if mercator: rgba_img = mercator_transform( rgba_img, (extent[2], extent[3]), origin='upper') return rgba_img, extent, lmin, lmax, cmap
def __init__(self, image, bounds, origin='upper', colormap=None, mercator_project=False, pixelated=True, name=None, overlay=True, control=True, show=True, **kwargs): super(ImageOverlay, self).__init__(name=name, overlay=overlay, control=control, show=show) options = { 'opacity': kwargs.pop('opacity', 1.), 'alt': kwargs.pop('alt', ''), 'interactive': kwargs.pop('interactive', False), 'crossOrigin': kwargs.pop('cross_origin', False), 'errorOverlayUrl': kwargs.pop('error_overlay_url', ''), 'zIndex': kwargs.pop('zindex', 1), 'className': kwargs.pop('class_name', ''), } self._name = 'ImageOverlay' self.pixelated = pixelated if mercator_project: image = mercator_transform(image, [bounds[0][0], bounds[1][0]], origin=origin) self.url = image_to_url(image, origin=origin, colormap=colormap) self.bounds = json.loads(json.dumps(bounds)) self.options = json.dumps(options, sort_keys=True, indent=2) self._template = Template(u""" {% macro script(this, kwargs) %} var {{this.get_name()}} = L.imageOverlay( '{{ this.url }}', {{ this.bounds }}, {{ this.options }} ).addTo({{this._parent.get_name()}}); {% endmacro %} """)
def __init__(self, image, bounds, origin='upper', colormap=None, mercator_project=False, pixelated=True, name=None, overlay=True, control=True, show=True, **kwargs): super(ImageOverlay, self).__init__(name=name, overlay=overlay, control=control, show=show) self._name = 'ImageOverlay' self.bounds = bounds self.options = parse_options(**kwargs) self.pixelated = pixelated if mercator_project: image = mercator_transform( image, [bounds[0][0], bounds[1][0]], origin=origin ) self.url = image_to_url(image, origin=origin, colormap=colormap)
def __init__(self, image, bounds, origin='upper', colormap=None, mercator_project=False, pixelated=True, name=None, overlay=True, control=True, show=True, **kwargs): super(ImageOverlay, self).__init__(name=name, overlay=overlay, control=control, show=show) options = { 'opacity': kwargs.pop('opacity', 1.), 'alt': kwargs.pop('alt', ''), 'interactive': kwargs.pop('interactive', False), 'crossOrigin': kwargs.pop('cross_origin', False), 'errorOverlayUrl': kwargs.pop('error_overlay_url', ''), 'zIndex': kwargs.pop('zindex', 1), 'className': kwargs.pop('class_name', ''), } self._name = 'ImageOverlay' self.pixelated = pixelated if mercator_project: image = mercator_transform( image, [bounds[0][0], bounds[1][0]], origin=origin) self.url = image_to_url(image, origin=origin, colormap=colormap) self.bounds = json.loads(json.dumps(bounds)) self.options = json.dumps(options, sort_keys=True, indent=2) self._template = Template(u""" {% macro script(this, kwargs) %} var {{this.get_name()}} = L.imageOverlay( '{{ this.url }}', {{ this.bounds }}, {{ this.options }} ).addTo({{this._parent.get_name()}}); {% endmacro %} """)
def create_png(event_dir, lsmodels=None, lqmodels=None, mercator=True, lsmask=0.002, lqmask=0.005, legends=False): """ Creates transparent PNG file for website. Args: event_dir (srt): Directory containing ground failure results. lsmodels (list): List of dictionaries of model summary info compiled by the hazdev function. If not specified, code will search for the hdf5 files for the preferred model and will create this dictionary and will apply default colorbars and bins. lqmodels (list): Same as above for liquefaction. mercator (bool): Project raster to web mercator lsmask (float): Mask all landslide cells with probabilities below this threshold lqmask (float): Mask all liquefaction cells with probabilities below this threshold legends (bool): if True, will produce png files of legends for each preferred model Returns: .png map overlays and .json files specifying their mapped extents """ filenames = [] files = os.listdir(event_dir) if lsmodels is None: # Read in the "preferred" model for landslides ls_mod_file = [f for f in files if 'jessee_2017.hdf5' in f] if len(ls_mod_file) == 1: ls_file = os.path.join(event_dir, ls_mod_file[0]) ls_mod = loadlayers(ls_file) levels = DFBINS colors1 = DFCOLORS filesnippet = 'jessee_2017' ls_grid = ls_mod['model']['grid'] ls_data = ls_grid.getData() if lsmask: ls_data[ls_data < lsmask] = float('nan') ls_geodict = ls_grid.getGeoDict() ls_extent = [ ls_geodict.xmin - 0.5*ls_geodict.dx, ls_geodict.xmax + 0.5*ls_geodict.dx, ls_geodict.ymin - 0.5*ls_geodict.dy, ls_geodict.ymax + 0.5*ls_geodict.dy, ] filen = os.path.join(event_dir, '%s_extent.json' % filesnippet) filenames.append(filen) with open(filen, 'w') as f: json.dump(ls_extent, f) lmin = levels[0] lmax = levels[-1] ls_data2 = np.clip(ls_data, lmin, lmax) cmap = mpl.colors.ListedColormap(colors1) norm = mpl.colors.BoundaryNorm(levels, cmap.N) ls_data2 = np.ma.array(ls_data2, mask=np.isnan(ls_data)) #scalarMap = cm.ScalarMappable(norm=norm, cmap=cmap) #rgba_img = scalarMap.to_rgba_array(ls_data2, alpha=alpha) rgba_img = cmap(norm(ls_data2)) if mercator: rgba_img = mercator_transform( rgba_img, (ls_extent[2], ls_extent[3]), origin='upper') filen = os.path.join(event_dir, '%s.png' % filesnippet) plt.imsave(filen, rgba_img, vmin=lmin, vmax=lmax, cmap=cmap ) else: raise OSError( "Preferred landslide model result (%s) not found." % ls_mod_file) else: for lsm in lsmodels: #if lsm['preferred']: levels = lsm['bin_edges'] colors1 = lsm['bin_colors'] filesnippet = lsm['id'] fsh = '%s.hdf5' % filesnippet ls_mod_file = [f for f in files if fsh in f] if len(ls_mod_file) == 1: ls_file = os.path.join(event_dir, ls_mod_file[0]) ls_mod = loadlayers(ls_file) else: raise OSError( "Specified landslide model result (%s) not found." % fsh) ls_grid = ls_mod['model']['grid'] ls_data = ls_grid.getData() if lsmask: ls_data[ls_data < lsmask] = float('nan') ls_geodict = ls_grid.getGeoDict() ls_extent = [ ls_geodict.xmin - 0.5*ls_geodict.dx, ls_geodict.xmax + 0.5*ls_geodict.dx, ls_geodict.ymin - 0.5*ls_geodict.dy, ls_geodict.ymax + 0.5*ls_geodict.dy, ] filen = os.path.join(event_dir, '%s_extent.json' % filesnippet) filenames.append(filen) with open(filen, 'w') as f: json.dump(ls_extent, f) lmin = levels[0] lmax = levels[-1] ls_data2 = np.clip(ls_data, lmin, lmax) cmap = mpl.colors.ListedColormap(colors1) norm = mpl.colors.BoundaryNorm(levels, cmap.N) ls_data2 = np.ma.array(ls_data2, mask=np.isnan(ls_data)) #scalarMap = cm.ScalarMappable(norm=norm, cmap=cmap) #rgba_img = scalarMap.to_rgba_array(ls_data2, alpha=alpha) rgba_img = cmap(norm(ls_data2)) if mercator: rgba_img = mercator_transform( rgba_img, (ls_extent[2], ls_extent[3]), origin='upper') filen = os.path.join(event_dir, '%s.png' % filesnippet) plt.imsave(filen, rgba_img, vmin=lmin, vmax=lmax, cmap=cmap ) if lqmodels is None: # read in preferred model for liquefaction if none specified lq_mod_file = [f2 for f2 in files if 'zhu_2017_general.hdf5' in f2] if len(lq_mod_file) == 1: lq_file = os.path.join(event_dir, lq_mod_file[0]) lq_mod = loadlayers(lq_file) levels = DFBINS colors1 = DFCOLORS filesnippet = 'zhu_2017_general' lq_grid = lq_mod['model']['grid'] lq_data = lq_grid.getData() if lqmask: lq_data[lq_data < lqmask] = float('nan') lq_geodict = lq_grid.getGeoDict() lq_extent = [ lq_geodict.xmin - 0.5*lq_geodict.dx, lq_geodict.xmax + 0.5*lq_geodict.dx, lq_geodict.ymin - 0.5*lq_geodict.dy, lq_geodict.ymax + 0.5*lq_geodict.dy, ] filen = os.path.join(event_dir, '%s_extent.json' % filesnippet) filenames.append(filen) with open(filen, 'w') as f: json.dump(lq_extent, f) lmin = levels[0] lmax = levels[-1] lq_data2 = np.clip(lq_data, lmin, lmax) cmap = mpl.colors.ListedColormap(colors1) norm = mpl.colors.BoundaryNorm(levels, cmap.N) lq_data2 = np.ma.array(lq_data2, mask=np.isnan(lq_data)) rgba_img = cmap(norm(lq_data2)) if mercator: rgba_img = mercator_transform( rgba_img, (lq_extent[2], lq_extent[3]), origin='upper') filen = os.path.join(event_dir, '%s.png' % filesnippet) plt.imsave(filen, rgba_img, vmin=lmin, vmax=lmax, cmap=cmap ) filenames.append(filen) else: raise OSError( "Preferred liquefaction model result (%s) not found." % lq_mod_file) else: for lqm in lqmodels: if lqm['preferred']: levels = lqm['bin_edges'] colors1 = lqm['bin_colors'] filesnippet = lqm['id'] fsh = '%s.hdf5' % filesnippet lq_mod_file = [f2 for f2 in files if fsh in f2] if len(lq_mod_file) == 1: lq_file = os.path.join(event_dir, lq_mod_file[0]) lq_mod = loadlayers(lq_file) else: raise OSError( "Specified liquefaction model result (%s) not found." % fsh) lq_grid = lq_mod['model']['grid'] lq_data = lq_grid.getData() if lqmask: lq_data[lq_data < lqmask] = float('nan') lq_geodict = lq_grid.getGeoDict() lq_extent = [ lq_geodict.xmin - 0.5*lq_geodict.dx, lq_geodict.xmax + 0.5*lq_geodict.dx, lq_geodict.ymin - 0.5*lq_geodict.dy, lq_geodict.ymax + 0.5*lq_geodict.dy, ] filen = os.path.join(event_dir, '%s_extent.json' % filesnippet) filenames.append(filen) with open(filen, 'w') as f: json.dump(lq_extent, f) lmin = levels[0] lmax = levels[-1] lq_data2 = np.clip(lq_data, lmin, lmax) cmap = mpl.colors.ListedColormap(colors1) norm = mpl.colors.BoundaryNorm(levels, cmap.N) lq_data2 = np.ma.array(lq_data2, mask=np.isnan(lq_data)) rgba_img = cmap(norm(lq_data2)) if mercator: rgba_img = mercator_transform( rgba_img, (lq_extent[2], lq_extent[3]), origin='upper') filen = os.path.join(event_dir, '%s.png' % filesnippet) plt.imsave(filen, rgba_img, vmin=lmin, vmax=lmax, cmap=cmap ) filenames.append(filen) if legends: lsname, lqname = make_legend(lqmin=lqmask, lsmin=lsmask, outfolder=event_dir) filenames.append(lsname) filenames.append(lqname) return filenames