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)
Example #4
0
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)
Example #5
0
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))