Example #1
0
def topographic_index(flow_accumulation,
                      slope,
                      px,
                      n_top,
                      div_col=0,
                      div_row=0):
    '''
    Method responsible for the partioning of the matrix

    Parameters
    ----------
    flow_accumulation : int
        Flow accumulation. Servers as the...
    slope : float
        Highest slope to a neighbouring cell. Surrogate to...
    px : int or float
        Raster dimension size.
    n_top : float
        Expoent (<1) calibrated for the area
    div_col : int, optional
        Number of vertical divisions. The default is 0.
    div_row : int, optional
        Number of horizontal divisions. The default is 0.

    Returns
    -------
    topographic_index : float
        Topographic index..
    modified_topographic_index : float
        Modified Topographic index.

    '''
    row_size = len(flow_accumulation)
    col_size = len(flow_accumulation[0])

    bRow, bCol = divisor(row_size, col_size, div_row, div_col)

    topographic_index = np.zeros((row_size, col_size))
    modified_topographic_index = np.zeros((row_size, col_size))

    bRow = np.insert(bRow, div_row, row_size)
    bRow = np.insert(bRow, 0, 0)
    bCol = np.insert(bCol, div_col, col_size)
    bCol = np.insert(bCol, 0, 0)

    for m in range(0, div_row + 1, 1):
        for n in range(0, div_col + 1, 1):

            mS = bRow[m]
            mE = bRow[m + 1]
            nS = bCol[n]
            nE = bCol[n + 1]

            topographic_index[mS:mE, nS:nE], modified_topographic_index[
                mS:mE,
                nS:nE] = topographic_index_cpu(flow_accumulation[mS:mE, nS:nE],
                                               slope[mS:mE, nS:nE], px, n_top)

    return topographic_index, modified_topographic_index
Example #2
0
def downsloper(dem,
               flow_direction,
               px,
               elevation_difference,
               column_division=0,
               row_division=0):
    '''
    Method responsible for the partioning of the matrix for the downslope.

    Parameters
    ----------
    dem : int or float
        Digital elevation model.
    flow_direction : int
        Flow direction.
    px : int or float
        Raster pixel dimension.
    elevation_difference : int
        Elevation difference.
    column_division : int, optional
        Number of vertical divisions. The default is 0.
    row_division : int, optional
        Number of horizontal divisions. The default is 0.

    Returns
    -------
    downslope : float array
        Downslope index array.

    '''
    row_size = len(dem)
    col_size = len(dem[0])

    bRow, bCol = divisor(row_size, col_size, row_division, column_division)

    downslope = np.zeros((row_size, col_size), dtype='float32')

    bRow = np.insert(bRow, row_division, row_size)
    bRow = np.insert(bRow, 0, 0)
    bCol = np.insert(bCol, column_division, col_size)
    bCol = np.insert(bCol, 0, 0)

    for m in range(0, row_division + 1, 1):
        for n in range(0, column_division + 1, 1):
            mS = bRow[m]
            mE = bRow[m + 1]
            nS = bCol[n]
            nE = bCol[n + 1]

            downslope[mS:mE,
                      nS:nE] = downslope_cpu(dem[mS:mE, nS:nE],
                                             flow_direction[mS:mE, nS:nE], px,
                                             elevation_difference)

    downslope = downslope_sequential_jit(dem, flow_direction, px,
                                         elevation_difference, downslope)

    return downslope
Example #3
0
def gfi_calculator(hand,
                   flow_accumulation,
                   indices,
                   n_gfi,
                   scale_factor,
                   size,
                   division_column=0,
                   division_row=0):
    '''
    Method responsible for the partioning of the matrix

    Parameters
    ----------
    hand : int or flat array
        Height above the nearest drainage.
    flow_accumulation : int
        Flow accumulation. Represent the river as source of hazard.
    indices : indices : int array
        River cell index.
    n_gfi : float
        Expoent (<1) Calibrated for the region.
    scale_factor : float
        Scale factor.

    Returns
    -------
    gfi : float array
        geomorphic flood index array.

    '''
    row_size = len(hand)
    col_size = len(hand[0])

    boundary_row, boundary_column = divisor(row_size, col_size, division_row,
                                            division_column)

    flow_accumulation = river_accumulation(flow_accumulation, indices)

    gfi = np.zeros((row_size, col_size))

    boundary_row = np.insert(boundary_row, division_row, row_size)
    boundary_row = np.insert(boundary_row, 0, 0)
    boundary_column = np.insert(boundary_column, division_column, col_size)
    boundary_column = np.insert(boundary_column, 0, 0)

    for m in range(0, division_row + 1, 1):
        for n in range(0, division_column + 1, 1):

            mS = boundary_row[m]
            mE = boundary_row[m + 1]
            nS = boundary_column[n]
            nE = boundary_column[n + 1]

            gfi[mS:mE, nS:nE] = geomorphic_flood_index_cpu(
                hand[mS:mE, nS:nE], flow_accumulation[mS:mE, nS:nE], n_gfi,
                scale_factor, size)

    return gfi
Example #4
0
def sloper(dem, px, division_column=0, division_row=0):
    '''
    Method responsible for the matrix dimension division

    Parameters
    ----------
    dem : int or float
        Digital elevation model.
    px : int or float
        Raster pixel dimension.

    Returns
    -------
    slope : float
        Highest slope of the neighbouring cells.

    '''

    row_size = len(dem)
    col_size = len(dem[0])

    bRow, bCol = divisor(row_size, col_size, division_column, division_row)

    slope = np.zeros((row_size, col_size))

    bRow = np.insert(bRow, division_row, row_size)
    bRow = np.insert(bRow, 0, 0)
    bCol = np.insert(bCol, division_column, col_size)
    bCol = np.insert(bCol, 0, 0)

    for m in range(0, division_row + 1, 1):
        for n in range(0, division_column + 1, +1):

            mS = bRow[m]
            mE = bRow[m + 1]
            nS = bCol[n]
            nE = bCol[n + 1]

            extra = np.array([0, 0, 0, 0])

            if m == 0:
                extra[0] = 1  #up
            if n == 0:
                extra[1] = 1  #left
            if n == division_column:
                extra[2] = 1  #right
            if m == division_row:
                extra[3] = 1  #down

            slope[mS:mE, nS:nE] = slope_cpu(
                dem[mS - 1 + extra[0]:mE + 1 - extra[3],
                    nS - 1 + extra[1]:nE + 1 - extra[2]], px, extra)

    return slope
Example #5
0
def ln_hl_H_calculator(hand,
                       flow_accumulation,
                       n_gfi,
                       scale_factor,
                       size,
                       division_column=0,
                       division_row=0):
    '''
    Method responsible for the partioning of the matrix

    Parameters
    ----------
    hand : int or flat array
        Height above the nearest drainage.
    fac : int
        Flow accumulation. 
    n_gfi : float
        Expoent (<1) Calibrated for the region.
    scale_factor : float
        Scale factor.

    Returns
    -------
    ln_hl_H : float array
        ln(hl/H) index array.

    '''
    row_size = len(hand)
    col_size = len(hand[0])

    bRow, bCol = divisor(row_size, col_size, division_row, division_column)

    lnhlh = np.zeros((row_size, col_size))
    bRow = np.insert(bRow, division_row, row_size)
    bRow = np.insert(bRow, 0, 0)
    bCol = np.insert(bCol, division_column, col_size)
    bCol = np.insert(bCol, 0, 0)

    for m in range(0, division_row + 1, 1):
        for n in range(0, division_column + 1, 1):
            mS = bRow[m]
            mE = bRow[m + 1]
            nS = bCol[n]
            nE = bCol[n + 1]

            lnhlh[mS:mE, nS:nE] = ln_hl_H_cpu(hand[mS:mE, nS:nE],
                                              flow_accumulation[mS:mE, nS:nE],
                                              n_gfi, scale_factor, size)

    return lnhlh
Example #6
0
def flow_hand_index(dem_raster,
                    flow_direction_matrix,
                    river_matrix,
                    px,
                    division_column=0,
                    division_row=0):
    '''
    Overall method responsible for the matrix partitioning and
    defining dimensions.

    Parameters
    ----------
    dem_raster : int or float array
        Digital elevation model raster.
    flow_direction_matrix : int8 array
        Flow direction.
    river_matrix : int8 array
        Binary matrix that 1- river cell 0-not river cell.
    px : int or float
        Raster pixel dimension.

    Returns
    -------
    fdist : float array
        Flow distance.
    indices : int array
        River cell index.
    hand : int or flat array
        Height above the nearest drainage.

    '''
    row = len(dem_raster)
    col = len(dem_raster[0])

    boundary_row, boundary_column = divisor(row, col, division_row,
                                            division_column)

    flow_distance = np.zeros((row, col),dtype='float32')
    indices = np.zeros((row, col), dtype='int')

    if division_row > 0 or division_column > 0:
        flow_distance[:, boundary_column] = -50
        flow_distance[boundary_row, :] = -50
        flow_distance, indices = fdist_indexes_sequential_jit(
            flow_direction_matrix, river_matrix, px, flow_distance)

    boundary_row = np.insert(boundary_row, division_row, row)
    boundary_row = np.insert(boundary_row, 0, -1)
    boundary_column = np.insert(boundary_column, division_column, col)
    boundary_column = np.insert(boundary_column, 0, -1)

    part = 0

    for m in range(0, division_row + 1, 1):
        for n in range(0, division_column + 1, 1):
            out = np.zeros((4))
            distance_up = np.zeros([1])
            distance_left = np.zeros([1])
            distance_right = np.zeros([1])
            distance_down = np.zeros([1])
            
            index_up    = np.zeros([1])
            index_left  = np.zeros([1])
            index_right = np.zeros([1])
            index_down  = np.zeros([1])

            mS = boundary_row[m]
            mE = boundary_row[m + 1]
            nS = boundary_column[n]
            nE = boundary_column[n + 1]

            if division_row > 0:
                if part < (division_column + 1) * division_row:
                    out[3] = 1
                    distance_down = flow_distance[mE, nS + 1:nE]
                    index_down = indices[mE, nS + 1:nE]
                    if n != division_column:
                        distance_down = np.insert(distance_down, nE - (nS + 1),
                                            flow_distance[mE, nE])
                        index_down = np.insert(index_down, nE - (nS + 1),
                                            indices[mE, nE])
                        
                    if n != 0:
                        distance_down = np.insert(distance_down, 0, flow_distance[mE, nS])
                        index_down = np.insert(index_down, 0, indices[mE, nS])

                if part > division_column:
                    out[0] = 1
                        
                    distance_up = flow_distance[mS, nS + 1:nE]
                    index_up = indices[mS, nS + 1:nE]
                    
                    if n != division_column:
                        distance_up = np.insert(distance_up, nE - (nS + 1),
                                            flow_distance[mS, nE])
                        index_up = np.insert(index_up, nE - (nS + 1),
                                            indices[mS, nE])
                    if n != 0:
                        distance_up = np.insert(distance_up, 0, flow_distance[mS, nS])
                        index_up = np.insert(index_up, 0, indices[mS, nS])

            if division_column > 0:
                if part % (division_column + 1) != 0:
                    out[1] = 1
                    distance_left = flow_distance[mS + 1:mE, nS]
                    index_left = indices[mS + 1:mE, nS]
                    
                    if m != division_row:
                        distance_left = np.insert(distance_left, mE - (mS + 1),
                                            flow_distance[mE, nS])
                        index_left = np.insert(index_left, mE - (mS + 1),
                                            indices[mE, nS])
                        
                    if m != 0:
                        distance_left = np.insert(distance_left, 0, flow_distance[mS, nS])
                        index_left = np.insert(index_left, 0, indices[mS, nS])

                if part % (division_column + 1) != division_column:
                    out[2] = 1
                    distance_right = flow_distance[mS + 1:mE, nE]
                    index_right = indices[mS + 1:mE, nE]
                    
                    if m != division_row:
                        distance_right = np.insert(distance_right, mE - (mS + 1),
                                            flow_distance[mE, nE])
                        index_right = np.insert(index_right, mE - (mS + 1),
                                            indices[mE, nE])
                        
                    if m != 0:
                        distance_right = np.insert(distance_right, 0, flow_distance[mS, nE])
                        index_right = np.insert(index_right, 0, indices[mS, nE])
                        

            size = max(len(distance_up), len(distance_left), len(distance_right), len(distance_down))

            bound = np.zeros((4, size))
            bound_index = np.zeros((4, size))
            
            bound[0, 0:len(distance_up)] = distance_up
            bound_index[0, 0:len(index_up)] = index_up
            
            bound[1, 0:len(distance_left)] = distance_left
            bound_index[1, 0:len(index_left)] = index_left
            
            bound[2, 0:len(distance_right)] = distance_right
            bound_index[2, 0:len(index_right)] = index_right
            
            bound[3, 0:len(distance_down)] = distance_down
            bound_index[3, 0:len(index_down)] = index_down       

            mS += 1
            nS += 1
            part += 1
            
            flow_distance[mS:mE,
                          nS:nE], indices[mS:mE,
                                          nS:nE] = flow_distance_index_cpu(
                                              dem_raster[mS:mE, nS:nE],
                                              flow_direction_matrix[mS:mE,
                                                                    nS:nE],
                                              river_matrix[mS:mE, nS:nE], px,
                                              bound, bound_index, out, 
                                              mS, nS, col)

            # indices[mS:mE, nS:nE] = index_calculator(indices[mS:mE, nS:nE], mS,
            #                                           nS, col)

    hand = hand_calculator(dem_raster, indices)

    return flow_distance, indices, hand