diff --git a/docs/hackathon.ipynb b/docs/hackathon.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a5e39673c777c7e5c06d4dadc7e14b5c6be20073 --- /dev/null +++ b/docs/hackathon.ipynb @@ -0,0 +1,353 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bf1e1f14-3a8f-4346-9268-0638f16257f2", + "metadata": {}, + "source": [ + "# Agricultura Familiar Conectada: Plataforma Web para Optimizar Cultivos con NDVI y NDWI" + ] + }, + { + "cell_type": "markdown", + "id": "d9e05d42-0175-41fd-a589-680e8354f145", + "metadata": {}, + "source": [ + "### Casos de estudio\n", + "\n", + "* Cuenca del rÃo Grande en el área Central de Panamá" + ] + }, + { + "cell_type": "markdown", + "id": "ae13de6f-8a8f-4bbe-995e-b1e1750b9999", + "metadata": {}, + "source": [ + "### Objetivo General\n", + "\n", + "\"Desarrollar una plataforma web innovadora y accesible para agricultores familiares, basada en cálculos de los Ãndices NDVI y NDWI, que les permita mejorar la toma de decisiones y optimizar el manejo de cultivos mediante el monitoreo de la salud de las plantas y la disponibilidad de agua en sus terrenos agrÃcolas ee identificar posibles zonas inundables en el area.\"" + ] + }, + { + "cell_type": "markdown", + "id": "622f4ddd-b1ce-447d-83c4-b0f5c8538271", + "metadata": {}, + "source": [ + "### Objetivos EspecÃficos\n", + "\n", + "* Desarrollar la plataforma web: Crear una plataforma en lÃnea que sea intuitiva, fácil de usar y accesible desde diversos dispositivos (como computadoras, tabletas y teléfonos móviles) para garantizar que los agricultores familiares puedan acceder a ella y utilizarla de manera efectiva.\n", + "* Integrar datos de teledetección: Automatizar la descarga de datos de los satilites y delimitados por las parcelas que el usuario seleccione.\n", + "* Identificar la calidad de la cobertura vegetal\n", + "* Identificar las potencialidades de concentración de agua superficial\n", + "* Definir los principales usos de suelo\n", + "* Delimitación de áreas de inundación por influencia topográfica\n", + "* Establecer bases de datos de parcelas agrÃcolas\n", + "* Implementar alertas y notificaciones cuando se detecten cambios significativos en los Ãndices NDVI y NDWI, señalando posibles situaciones de estrés hÃdrico o problemas en el crecimiento de los cultivos.\n", + "* Facilitar la interacción y colaboración al implementar funciones de interacción social en la plataforma para que los agricultores familiares puedan compartir experiencias, hacer preguntas y recibir asesoramiento de otros agricultores y expertos agrÃcolas." + ] + }, + { + "cell_type": "markdown", + "id": "5c773f94-cbd3-4bc4-9a9c-73f23173ca1d", + "metadata": {}, + "source": [ + "## MetodologÃa\n", + "\n", + "### Planteamiento del problema\n", + "\n", + "Las áreas geográficas de provincias centrales en Panamá presentan caracterÃsticas naturales morfológicas favorables para los procesos de inundaciones. Estas áreas geográficas presentan importantes actividades económicas de explotación del sector primario y sobresalientes ecosistemas.\n", + "De igual manera nuestros agricultores se enfrentan a retos nunca antes vistos, fenómenos climáticos extremos como sequias, inundaciones, Ciclones tropicales, degradación de la tierra, entre otros. Estos fenómenos naturales alteran en gran medida los valores nutricionales y quÃmicos de los suelos en que los cultivos regularmente se desarrollan. \n", + "\n", + "Mediante el presente análisis, se proyecta identificar las áreas potenciales de concentración de agua superficial como datos relevantes para delimitar áreas de inundación por la naturaleza del territorio y como potencialidad para el aprovechamiento del recursos hÃdricos para actividades económicas importantes como la agricultura." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "4d5b2e96-7255-487f-81f9-ab9ecc136d17", + "metadata": {}, + "source": [ + "## Procedimiento\n", + "\n", + "1. Delimitacion de Zonas agricolas mediante el uso de mapa de cobertura boscosa y uso de suelo gestionando de información de carácter satelital del sitio de Copernicus y procesadas en QGIS 3.22" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "595feab2-b299-4eed-89d6-629021683bdc", + "metadata": {}, + "source": [ + "<img src=\"./img/landcover.png\" />" + ] + }, + { + "cell_type": "markdown", + "id": "9c2060e1-9132-425d-be8f-a43790e150b3", + "metadata": {}, + "source": [ + "# for Raster files 'tiff' manipulation\n", + "import rasterio\n", + "# libraries for array manipulation\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "c177b48b", + "metadata": {}, + "outputs": [], + "source": [ + "def readTiffBand(tiff_file, band_number):\n", + " \"\"\"\n", + " Reading the specific band from the 'tiff' file.\n", + " \"\"\"\n", + " with rasterio.open(tiff_file) as dataset:\n", + " band = dataset.read(band_number)\n", + " return band" + ] + }, + { + "cell_type": "markdown", + "id": "a18e63b6-1b41-4f15-aeca-676956e3d3cb", + "metadata": {}, + "source": [ + "2. Calculamos el Ãndice Normalizado de Diferencia de Vegetación, utilizando codigos en Python\n", + "\n", + "NDVI = (NIR-Red) / (NIR+Red)\n", + "\n", + "NIR= luz del infrarrojo cercano y \n", + "Rojo= luz roja visible\n", + "\n", + "Entre los valores de referencia de Ãndice que se interpretarán calculando el NDVI, se encuentran los siguientes:\n", + "\n", + " | Min | Max | State |\n", + "|------|------|-----------------------------|\n", + "| 0.1 | 0.2 | Suelo desnudo |\n", + "| 0.2 | 1 | Plantas |\n", + "| 0.5 | 0.5 | Vegetación densa y saludable|\n", + "| 0.2 | 0.5 | Vegetación dispersa |\n", + "\n", + "Valores negativos = Concentración de agua, estructuras artificiales y rocas entre otros.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "5868bef0", + "metadata": {}, + "outputs": [], + "source": [ + "def calculateNDVI(band_red, band_nir):\n", + " \"\"\"\n", + " Calculating NDVI index given the red and near infrared band.\n", + " \"\"\"\n", + " \n", + " # In case you don't have cero values over the bands\n", + " #ndvi = (band_nir - band_red) / (band_nir + band_red)\n", + " \n", + " # Cero values won't be valid\n", + " element1 = (band_nir - band_red)\n", + " element2 = (band_nir + band_red)\n", + " \n", + " ndvi = np.divide(element1, element2, out=np.zeros_like(element1), where=element2!=0)\n", + " \n", + " return ndvi" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "64302660-61a1-445b-a35c-3ebfafb71c8a", + "metadata": {}, + "source": [ + "<img src=\"./img/NDVI.png\" />" + ] + }, + { + "cell_type": "markdown", + "id": "c87217b4-0fcd-46c5-a492-4d99c8be0be6", + "metadata": {}, + "source": [ + "4. Cálculo de Ãndice de Agua de Diferencia Normalizada (NDWI), con la finalidad de identificar concentraciones de agua sobre la superficie de la tierra. Se aplicará la siguiente fórmula\n", + "\n", + "NDWI = (Green – NIR)/(Green + NIR)\n", + "\n", + "Green = luz de banda verde\n", + "NIR = luz del infrarrojo cercano\n", + "| Min | Max | State |\n", + "|------|-----|--------------------------------------|\n", + "| 0.2 | 1 | Superficie del agua |\n", + "| 0,0 | 0,2 | Inundación, humedad |\n", + "|- 0,3 | 0,0 | SequÃa moderada, superficies sin agua| \n", + "| -1 | -0,3| SequÃa, superficies sin agua |\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "6a97d07d", + "metadata": {}, + "outputs": [], + "source": [ + "def calculateNDWI(band_green, band_nir):\n", + " \"\"\"\n", + " Calculating NDWI index given the green and near infrared band.\n", + " \"\"\"\n", + " \n", + " # In case you don't have cero values over the bands\n", + " #ndwi = (band_green - band_nir) / (band_green + band_nir)\n", + " \n", + " \n", + " # Cero values won't be valid\n", + " element1 = (band_green - band_nir)\n", + " element2 = (band_green + band_nir)\n", + " \n", + " ndwi = np.divide(element1, element2, out=np.zeros_like(element1), where=element2!=0)\n", + " \n", + " return ndwi" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "71134f4a-04fe-4976-9f16-4b2bea08db92", + "metadata": {}, + "source": [ + "<img src=\"./img/NDWI.png\" />" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "3ba41e31", + "metadata": {}, + "outputs": [], + "source": [ + "def write_index_to_tiff(index_array, output_tiff_file, tiff_metadata):\n", + " \"\"\"\n", + " Write the computed index array to the new 'tiff' file with the same metadata as the input 'tiff' file.\n", + " \"\"\"\n", + " \n", + " with rasterio.open(output_tiff_file, 'w', **tiff_metadata) as dst:\n", + " dst.write(index_array, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d8bdbf9f", + "metadata": {}, + "outputs": [], + "source": [ + "def update_index_metadata(band_file, name_index, index_array):\n", + " \"\"\"\n", + " Update metada from the computed index array\n", + " \"\"\"\n", + " \n", + " # Reading metadata from 'tiff' file\n", + " with rasterio.open(band_file) as dataset:\n", + " tiff_metadata = dataset.profile\n", + "\n", + " # Updating metadata from computed index array\n", + " tiff_metadata.update(count=1, dtype=str(index_array.dtype))\n", + "\n", + " # Saving computed index array to a 'tiff' file\n", + " output_index_tiff = f'./outputs/output_{name_index}.tif'\n", + " write_index_to_tiff(index_array, output_index_tiff, tiff_metadata)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "6a1e0f4f", + "metadata": {}, + "outputs": [], + "source": [ + "# Reading green band (band 3), red band (band 4) and near infrared band (band 8) from 'tiff' files\n", + "band3_file = './Files/sentinel_2/banda_3/T17PNK20230427T155529B03_10m.tif'\n", + "band4_file = './Files/sentinel_2/banda_4/T17PNK20230427T155529B04_10m.tif'\n", + "band8_file = './Files/sentinel_2/banda_8/T17PNK20230427T155529B08_10m.tif'\n", + "\n", + "band_green = readTiffBand(band3_file, 1).astype('float64')\n", + "band_red = readTiffBand(band4_file, 1).astype('float64')\n", + "band_nir = readTiffBand(band8_file, 1).astype('float64')\n", + "\n", + "\n", + "# Calculating NDVI\n", + "ndvi = calculateNDVI(band_red, band_nir)\n", + "update_index_metadata(band8_file, \"ndvi\", ndvi)\n", + "\n", + "\n", + "# Calculating NDWI\n", + "ndwi = calculateNDWI(band_green, band_nir)\n", + "update_index_metadata(band8_file, \"ndwi\", ndwi)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "75bcf2dd", + "metadata": {}, + "outputs": [], + "source": [ + "#Dataset for the calculated ndvi index\n", + "df_ndvi = pd.DataFrame(ndvi)\n", + "df_ndvi.to_csv(\"ndvi_index.csv\", index=False)\n", + "#df_ndvi" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "3d50f7f7", + "metadata": {}, + "outputs": [], + "source": [ + "#Dataset for the calculated ndwi index\n", + "df_ndwi = pd.DataFrame(ndwi)\n", + "df_ndwi.to_csv(\"ndwi_index.csv\", index=False)\n", + "#df_ndwi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "889a6819", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "836a614b-9dcb-44c6-8114-dd96b52fd513", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}