def reproject(layer: ogr.Layer, srs: osr.SpatialReference): '''Reprojects an existing layer given a spatial reference''' layer_name = layer.GetName() logging.info(f'reprojecting {layer_name}') projection = layer.GetSpatialRef() if projection is None: raise baseException( f'layer: {layer_name} does not have a spatial reference.', baseException.ERR_INPUT_LEVEL) # no action needed if projection.IsSame(srs): logging.info('no reprojection required') return try: # transform coordTrans = osr.CoordinateTransformation(projection, srs) # copy features layer.ResetReading() for ft in layer: geom = ft.GetGeometryRef() geom.Transform(coordTrans) ft.SetGeometry(geom) except Exception as e: raise baseException(f'layer: {layer_name} could not be reprojected.', baseException.ERR_CODE_LEVEL, e)
def set_median_predom(const: dict, layer: ogr.Layer, region: str, *unused): '''Set the Median Predominance burn-in value''' try: burn_field = const['burn_field'] burn = ogr.FieldDefn(burn_field, ogr.OFTInteger) layer.CreateField(burn) # set burn-in values for each feature logging.info('setting median predominance') layer.ResetReading() for ft in layer: predominant = get_predom(const, ft) ft.SetField(burn_field, predominant) layer.SetFeature(ft) except Exception as e: raise baseException( f'could not set values in {layer.GetName()} for median predominance', baseException.ERR_CODE_LEVEL, e)
def set_median_ct(const: dict, layer: ogr.Layer, region: str, ice_type: str, *unused): '''Set the Median Concentration burn-in value''' try: water, land, nodata = const['water'], const['land'], const['nodata'] burn_field = const['burn_field'] burn = ogr.FieldDefn(burn_field, ogr.OFTInteger) layer.CreateField(burn) # set burn-in values for each feature logging.info('setting median ct') layer.ResetReading() for ft in layer: fa = ft.GetField('FA') fb = ft.GetField('FB') fc = ft.GetField('FC') concn = ft.GetField(ice_type) if concn is None or concn == '': concn = water elif '08' in [fa, fb, fc] and concn in ['9.7', '10.0']: concn = '11.0' elif '07' in [fa, fb, fc] and concn == '10.0': concn = '10.0' ft.SetField(burn_field, int(float(concn))) pnt_type = ft.GetField('PNT_TYPE') if pnt_type in ['101', '115', '107']: ft.SetField(burn_field, water) elif pnt_type in ['400', '900']: ft.SetField(burn_field, land) elif pnt_type in ['123', '128', '133', '143']: ft.SetField(burn_field, nodata) layer.SetFeature(ft) except Exception as e: raise baseException( f'could not set values in {layer.GetName()} for median concentration', baseException.ERR_CODE_LEVEL, e)
def set_frequency(const: dict, layer: ogr.Layer, region: str, ice_type: str, threshold: int = 1): '''Set the Frequency burn-in value''' try: water, nodata = const['water'], const['nodata'] burn_field = const['burn_field'] burn = ogr.FieldDefn(burn_field, ogr.OFTInteger) layer.CreateField(burn) # set burn-in values for each feature logging.info(f'setting frequency using threshold: {threshold}') layer.ResetReading() for ft in layer: pnt_type = ft.GetField('PNT_TYPE') concn = ft.GetField(ice_type) concn = 0.0 if not concn else float(concn) if pnt_type in ['101', '107', '115', '400', '900']: ft.SetField(burn_field, water) elif pnt_type in ['123', '128', '133', '143']: ft.SetField(burn_field, nodata) elif pnt_type in ['106', '117', '118', '120', '122', '144' ] and concn >= float(threshold): ft.SetField(burn_field, 1) elif pnt_type in ['106', '117', '118', '120', '122', '144' ] and concn < float(threshold): ft.SetField(burn_field, water) else: ft.SetField(burn_field, nodata) layer.SetFeature(ft) except Exception as e: raise baseException( f'could not set values in {layer.GetName()} for frequency', baseException.ERR_CODE_LEVEL, e)