def get_features_from_layer(source_layer: ogr.Layer, destination_layer: ogr.Layer, title_provider: Callable[[ogr.Feature], str], x_min: float, y_min: float, x_max: float, y_max: float) -> None: memory_driver = ogr.GetDriverByName("Memory") clip_datasource = memory_driver.CreateDataSource("") clip_layer = clip_datasource.CreateLayer("clip_layer", geom_type=ogr.wkbPolygon) clip_geom = ogr.CreateGeometryFromWkt( f"POLYGON (({x_min} {y_min}, {x_max} {y_min}, {x_max} {y_max}, {x_min} {y_max}, {x_min} {y_min}))" ) clip_srs = osr.SpatialReference() clip_srs.SetFromUserInput(bbox_crs) clip_geom.AssignSpatialReference(clip_srs) feature_defn = clip_layer.GetLayerDefn() feature = ogr.Feature(feature_defn) feature.SetGeometry(clip_geom) clip_layer.CreateFeature(feature) result_datasource = memory_driver.CreateDataSource("") result_layer = result_datasource.CreateLayer( "result_layer", geom_type=ogr.wkbMultiLineString) ogr.Layer.Clip(source_layer, clip_layer, result_layer) id_field = ogr.FieldDefn(id_field_name, ogr.OFTInteger64) title_field = ogr.FieldDefn(title_field_name, ogr.OFTString) title_field.SetWidth(title_field_width) destination_layer.CreateField(id_field) destination_layer.CreateField(title_field) feature = result_layer.GetNextFeature() while feature is not None: geometry_ref = feature.GetGeometryRef() new_geometry = geometry_ref.Clone() new_feature = ogr.Feature(destination_layer.GetLayerDefn()) new_feature.SetGeometryDirectly(new_geometry) new_feature.SetField(id_field_name, feature.GetFID()) new_feature.SetField(title_field_name, title_provider(feature)[0:title_field_width]) destination_layer.CreateFeature(new_feature) feature = result_layer.GetNextFeature()
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)
def create_fields(out_layer: Layer, in_def: FeatureDefn) -> None: """Generate the output dataset fields, using all the input fields""" for i in range(0, in_def.GetFieldCount()): out_layer.CreateField(in_def.GetFieldDefn(i))