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
|