File size: 5,532 Bytes
0af1504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
""" Add Sentinel-1 and Sentinel-2 indices to a DataFrame. """
import numpy as np
from variables import s2_indices

def add_s2_indices(df, L=0.5, y=0.126, a=0.3, b=0.5):                        # pylint: disable=invalid-name
    """ Add Sentinel-2 indices to a DataFrame.

    Args:
        df (pandas.DataFrame): DataFrame to add indices to.
        L (float): Soil adjustment factor for SAVI. Default is 0.5.
        y (float): Atmosphere resistance factor for ARVI. Default is 0.126.
        a (float): Slope parameter for PVI. Default is 0.3.
        b (float): Intercept parameter for PVI. Default is 0.5.

    Returns:
        pandas.DataFrame: DataFrame with added indices.
    """

    X = df.copy()

    if X.B4.values[0] is not None:

        # Vegetation Indices
        X["ARI"] = (1 / X.B3) - (1 / X.B5)
        X["ARVI"] = (X.B8 - X.B4 - y * (X.B4 - X.B2)) / (X.B8 + X.B4 - y * (X.B4 - X.B2))
        X["AVI"] = np.sign((X.B8 * (1 - X.B4) * (X.B8 - X.B4))) * np.abs((X.B8 * (1 - X.B4) * (X.B8 - X.B4))) ** (1/3)
        X["BCC"] = X.B2 / (X.B4 + X.B3 + X.B2)
        X["CCCI"] = ((X.B8 - X.B5) / (X.B8 + X.B5)) / ((X.B8 - X.B4) / (X.B8 + X.B4))
        X["CVI"] = (X.B8 * X.B4) * (X.B3 ** 2)
        X["EVI"] = 2.5 * (X.B8 - X.B4) / (X.B8 + 6 * X.B4 - 7.5 * X.B2 + 1)
        X["ExG"] = 2 * X.B3 - X.B4 - X.B2
        X["GNDVI"] = (X.B8 - X.B3) / (X.B8 + X.B3)
        X["IKAW"] = (X.B8 - X.B2) / (X.B8 + X.B2)
        X["MCARI"] = ((X.B5 - X.B4) - 0.2 * (X.B5 - X.B3)) * (X.B5 / X.B4)
        X["MSAVI"] = 0.5 * (2 * X.B8 + 1 - (((2 * X.B8 + 1) ** 2) - 8 * (X.B8 - X.B4)) ** 0.5)
        X["MTVI2"] = (1.5 * (1.2 * (X.B8 - X.B3) - 2.5 * (X.B4 - X.B3))) / ((((2 * X.B8 + 1)**2) - (6 * X.B8 - 5 * (X.B4**0.5))-0.5) ** 0.5)
        X["NDDI"] = (((X.B8 - X.B4) / (X.B8+X.B4)) - ((X.B3 - X.B8) / (X.B3 + X.B8))) / (((X.B8 - X.B4) / (X.B8 + X.B4)) + ((X.B3 - X.B8) / (X.B3 + X.B8)))
        X["NDMI"] = (X.B8 - X.B11) / (X.B8 + X.B11)
        X["NDVI"] = (X.B8 - X.B4) / (X.B8 + X.B4) if X.B8 is not None else 0
        X["NDYI"] = (X.B3 - X.B2) / (X.B3 + X.B2)
        X["PSRI"] = (X.B4 - X.B2) / X.B6
        X["PVI"] = (X.B8 - a * X.B4 - b) / ((1 + a * 2) ** (1/2))
        X["RCC"] = X.B4 / (X.B4 + X.B3 + X.B2)
        X["RENDVI"] = (X.B6 - X.B5) / (X.B6 + X.B5)
        X["S2REP"] = 705 + 35 * ((((X.B7 + X.B4) / 2) - X.B5) / (X.B6 - X.B5))
        X["SAVI"] = (1 + L) * (X.B8 - X.B4) / (X.B8 + X.B4 + L)
        X["SI"] = ((1 - X.B2) * (1 - X.B3) * (1 - X.B4)) ** (1/3)
        X["SIPI"] = (X.B8 - X.B1) / (X.B8 - X.B4)
        X["TCARI"] = 3 * ((X.B5 - X.B4) - 0.2 * (X.B5 - X.B3) * (X.B5 / X.B4))
        X["TNDVI"] = ((X.B8 - X.B4) / (X.B8 + X.B4) + 0.5) ** (1/2)
        X["TTVI"] = 0.5 * ((865 - 740) * (X.B7 - X.B6) - (X.B8A - X.B6) * (783-740))
        X["TVI"] = (((X.B8 - X.B4) / (X.B8 + X.B4)) + 0.5) ** (1/2)
        X["VARI"] = (X.B3 - X.B4) / (X.B3 + X.B4 - X.B2)
        X["VARI700"] = (X.B5 - 1.7 * X.B4 + 0.7 * X.B2) / (X.B5 + 1.3 * X.B4 - 1.3*X.B2)

        # Water Indices
        X["AWEInsh"] = 4 * (X.B3 - X.B11) - 0.25 * X.B8 + 2.75 * X.B12
        X["AWEIsh"] = X.B2 + 2.5 * X.B3 - 1.5 * (X.B8 + X.B11) - 0.25 * X.B12
        X["MNDWI"] = (X.B3 - X.B11) / (X.B3 + X.B11)
        X["MuWIR"] = -4 * ((X.B2 - X.B3) / (X.B2 + X.B3)) + 2 * ((X.B3 - X.B8) / (X.B3 + X.B8)) + 2 * ((X.B3 - X.B12) / (X.B3 + X.B12)) - ((X.B3 - X.B11) / (X.B3 + X.B11))
        X["NDWI"] = (X.B3 - X.B8) / (X.B3 + X.B8)
        X["S2WI"] = (X.B5 - X.B12) / (X.B5 + X.B12)
        X["WI2015"] = 1.7204 + 171 * X.B3 + 3 * X.B4 - 70*X.B8 - 45*X.B11 - 71*X.B12

        # Burn / Fire Indices
        X["BAI"] = 1 / ((0.1 - X.B4) ** 2 + (0.06 - X.B8) ** 2)
        X["BAIM"] = 1 / ((0.05 - X.B8) ** 2) + ((0.2 - X.B12) ** 2) # adapted to MODIS
        X["MIRBI"] = 10 * X.B12 -9.8 * X.B11 + 2
        X["NBR"] = (X.B8 - X.B12) / (X.B8 + X.B12)
        X["NBRI"] = (X.B8 - X.B12) / (X.B8 + X.B12) # Not found
        X["NBRplus"] = (X.B12 - X.B8A - X.B3 - X.B2) / (X.B12 + X.B8A + X.B3 + X.B2)
        X["NBRSWIR"] = (X.B12 - X.B11 - 0.02) / (X.B12 + X.B11 + 0.1)
        X["NDSWIR"] = (X.B8 - X.B11)/(X.B8 + X.B11)

        # Snow Indices
        X["NBSIMS"] = 0.36 * (X.B3 + X.B4 + X.B8) - (((X.B2 + X.B12) / X.B3) + X.B11)
        X["NDSI"] = (X.B3 - X.B11) / (X.B3 + X.B11)

        # Urban Indices
        X["NBAI"] = (X.B12 - X.B11 / X.B3) / (X.B12 + X.B11 / X.B3)
        X["NDBI"] = (X.B11 - X.B8) / (X.B11 + X.B8)
        X["UI"] = (X.B12 - X.B8) / (X.B12 + X.B8)

        # Soil Indices
        X["BI"] = ((X.B11 + X.B4) - (X.B8 + X.B2)) / ((X.B11 + X.B4) + (X.B8 + X.B2))
        X["BI2"] = np.sqrt((X.B4 ** 2 + X.B3 ** 2 + X.B8 ** 2) / 3)
        X["BSI"] = ((X.B12 + X.B4) - (X.B8 + X.B2)) / ((X.B12 + X.B4) + (X.B8 + X.B2))
        X["SATVI"] = ((X.B11 - X.B4) / (X.B11 + X.B4 + L)) * (1 + L) - (X.B12 / 2)
    else:
        for index in s2_indices:
            X[index] = 0.0

    return X

def add_s1_indices(df):
    """ Add Sentinel-1 indices to a DataFrame.

    Args:
        df (pandas.DataFrame): DataFrame to add indices to.

    Returns:
        pandas.DataFrame: DataFrame with added indices.
    """

    X = df.copy()

    # Radar Indices
    X["DPDD"] = (X.VV + X.VH) / 2 ** (1/2)
    X["DpRVIVV"] = (4 * X.VH) / (X.VV + X.VH)
    X["NDPolI"] = (X.VV - X.VH) / (X.VV + X.VH)
    X["VDDPI"] = (X.VV + X.VH) / X.VV
    X["VHVVD"] = X.VH - X.VV
    X["VHVVP"] = X.VH * X.VV
    X["VHVVR"] = X.VH / X.VV
    X["VVVHD"] = X.VV - X.VH
    X["VVVHR"] = X.VV / X.VH
    X["VVVHS"] = X.VV + X.VH

    return X