!pip install rasterio numpy matplotlib pillowCollecting rasterio
Downloading rasterio-1.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.1 kB)
Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)
Requirement already satisfied: pillow in /usr/local/lib/python3.12/dist-packages (11.3.0)
Collecting affine (from rasterio)
Downloading affine-2.4.0-py3-none-any.whl.metadata (4.0 kB)
Requirement already satisfied: attrs in /usr/local/lib/python3.12/dist-packages (from rasterio) (25.3.0)
Requirement already satisfied: certifi in /usr/local/lib/python3.12/dist-packages (from rasterio) (2025.8.3)
Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.12/dist-packages (from rasterio) (8.3.0)
Collecting cligj>=0.5 (from rasterio)
Downloading cligj-0.7.2-py3-none-any.whl.metadata (5.0 kB)
Collecting click-plugins (from rasterio)
Downloading click_plugins-1.1.1.2-py2.py3-none-any.whl.metadata (6.5 kB)
Requirement already satisfied: pyparsing in /usr/local/lib/python3.12/dist-packages (from rasterio) (3.2.5)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.60.1)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.4.9)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (25.0)
… (10 baris lagi)
import rasterio
from rasterio.enums import Resampling
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
from IPython.display import Image
import os
data_dir = "/content"
years = [2021, 2022, 2023, 2024, 2025]
def calc_ndwi(year):
b3 = os.path.join(data_dir, f"BENDUNGAN_{year}B3.tif")
b8 = os.path.join(data_dir, f"BENDUNGAN_{year}B8.tif")
with rasterio.open(b3) as src3, rasterio.open(b8) as src8:
green = src3.read(1).astype("float32")
nir = src8.read(
1,
out_shape=(1, src3.height, src3.width),
resampling=Resampling.bilinear
).astype("float32")
ndwi = (green - nir) / (green + nir)
ndwi[np.isinf(ndwi)] = np.nan
return ndwi
ndwi_data = {y: calc_ndwi(y) for y in years}
fig, ax = plt.subplots(figsize=(7, 6))
img = ax.imshow(ndwi_data[years[0]], cmap="RdYlBu", vmin=-1, vmax=1)
title = ax.set_title(f"NDWI Tahun {years[0]}")
plt.colorbar(img, ax=ax, label="NDWI", shrink=0.8)
def update(frame):
year = years[frame]
img.set_data(ndwi_data[year])
title.set_text(f"NDWI Tahun {year}")
return img, title
anim = FuncAnimation(fig, update, frames=len(years), interval=1500, repeat=True)
gif_path = "/content/NDWI_TimeSeries.gif"
anim.save(gif_path, writer=PillowWriter(fps=1))
plt.close()
Image(filename=gif_path)
