{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "cceYxzyPHzW4" }, "source": [ "**CURSO**: Sensores Remotos, Departamento de Geociencias y Medio Ambiente, Universidad Nacional de Colombia - sede Medellín
\n", "**Profesor**: Edier Aristizábal (evaristizabalg@unal.edu.co)
\n", "**Credits**: The content of this notebook is taken from several sources such as: [DM Heli](https://medium.com/@shiela.mms/visualising-remotely-sensed-data-from-google-earth-engine-in-python-c12fced85b72). Every effort has been made to trace copyright holders of the materials used in this book. The author apologies for any unintentional omissions and would be pleased to add an acknowledgment in future editions." ] }, { "cell_type": "markdown", "metadata": { "id": "VqHkND01HzW9" }, "source": [ "# Introducción Earth Engine Python API\n", "Para utilizar el Earth Engine Python API se recomienda instalarlo a travez de Anaconda. Para este ejemplo vamos a crear un ambiente, en el cual instalaremos el API de GEE.\n", "\n", "Lo primero es dirigirse a la linea de comandos con la tecla Windows + R, o en start buscar por cmd. De click y se abrirá el command prompt. Si ya tiene instalado Anaconda, utilice el siguiente comando para activar el ambiente\n", "\n", ">> Conda activate\n", "\n", "Este comando lo dirige al ambiente base. Para crear un ambiente llamado \"ee\" donde instalará GEE utilice el siguiente comando:\n", "\n", ">> conda create --name ee\n", "\n", "En realidad puede darle el nombre al ambiente que prefiera. Para activar el ambiente creado utilice:\n", "\n", ">> conda activate ee\n", "\n", "Ya le debe aparecer el command prompt pero en el ambiente ee. Para instalar el API de GEE en este ambiente utilice el comando:\n", "\n", ">> conda install -c conda-forge earthengine-api\n", "\n", "Tambíen puede ser instalado *pip*\n", "\n", ">>!pip install earthengine-api\n", "\n", "Este comando evalua los paquetes que requiere, a lo cual debe decirle que si para terminar con la instalación. Pero antes de estar listo para utlizar el API se deben obtener las credenciales de GEE. Para eso utilice el siguiente comando:\n", "\n", ">>earthengine authenticate\n", "\n", "Esto lo lleva a una página donde debe seleccionar la cuenta de GEE y autorizar el uso, y obtendrá un código que debe copiar e introducir en el command prompt.\n", "\n", "LISTO, ya puede utilizar el API de GEE." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Gqms62JOHzW_" }, "outputs": [], "source": [ "# Ya estamos listos para importar la libreria ee de GEE\n", "import ee\n", "import ee.mapclient" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "89IHeCsurmvS" }, "outputs": [ { "data": { "text/html": [ "

To authorize access needed by Earth Engine, open the following\n", " URL in a web browser and follow the instructions:

\n", "

https://code.earthengine.google.com/client-auth?scopes=https%3A//www.googleapis.com/auth/earthengine%20https%3A//www.googleapis.com/auth/cloud-platform%20https%3A//www.googleapis.com/auth/drive%20https%3A//www.googleapis.com/auth/devstorage.full_control&request_id=ubvdgR_uE934WGe4BpFM6tx8aTI9tLo1BCB-E-KWIZ0&tc=-lIfXw3swWXFs0Vj6cWPt9enkytozkzDEaektP7cXIQ&cc=6bY_y6J1y_FTNpPKn5yzFRyjDWoK7fiQZIwHfDky9Ok

\n", "

The authorization workflow will generate a code, which you should paste in the box below.

\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Gtk-Message: 17:19:05.718: Not loading module \"atk-bridge\": The functionality is provided by GTK natively. Please try to not load it.\n", "[614470, Main Thread] WARNING: GTK+ module /snap/firefox/7355/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so cannot be loaded.\n", "GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported.: 'glib warning', file /build/firefox/parts/firefox/build/toolkit/xre/nsSigHandlers.cpp:201\n", "\n", "(firefox_firefox:614470): Gtk-WARNING **: 17:19:05.780: GTK+ module /snap/firefox/7355/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so cannot be loaded.\n", "GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported.\n", "Gtk-Message: 17:19:05.780: Failed to load module \"canberra-gtk-module\"\n", "[614470, Main Thread] WARNING: GTK+ module /snap/firefox/7355/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so cannot be loaded.\n", "GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported.: 'glib warning', file /build/firefox/parts/firefox/build/toolkit/xre/nsSigHandlers.cpp:201\n", "\n", "(firefox_firefox:614470): Gtk-WARNING **: 17:19:05.781: GTK+ module /snap/firefox/7355/gnome-platform/usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so cannot be loaded.\n", "GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported.\n", "Gtk-Message: 17:19:05.781: Failed to load module \"canberra-gtk-module\"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Enter verification code: 4/1Ab32j91VhwXG_140W7HX1lW_Y18RSTokUhezJnuSxxAbcAluYJst01DJRYM\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Successfully saved authorization token.\n" ] } ], "source": [ "try:\n", " ee.Initialize()\n", "except Exception as e:\n", " ee.Authenticate()\n", " ee.Initialize()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "iOD6QXHUHzXE" }, "outputs": [], "source": [ "#If you recieve an error like \"AttributeError: module 'collections' has no attribute 'Callable'\", please use the following code\n", "import collections\n", "collections.Callable = collections.abc.Callable" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "dbHyEk9jHzXF", "outputId": "03457df7-e897-4235-863a-50e9d2f6a0e7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mount Everest elevation (m): 8729\n" ] } ], "source": [ "# Print the elevation of Mount Everest.\n", "dem = ee.Image('USGS/SRTMGL1_003')\n", "xy = ee.Geometry.Point([86.9250, 27.9881])\n", "elev = dem.sample(xy, 30).first().get('elevation').getInfo()\n", "print('Mount Everest elevation (m):', elev)" ] }, { "cell_type": "markdown", "metadata": { "id": "xudYKb2ZHzXI" }, "source": [ "## Map visualization\n", "\n", "`ee.Image` objects can be displayed to notebook output cells. The following two\n", "examples demonstrate displaying a static image and an interactive map.\n", "\n", "### Static image\n", "\n", "The `IPython.display` module contains the `Image` function, which can display\n", "the results of a URL representing an image generated from a call to the Earth\n", "Engine `getThumbUrl` function. The following cell will display a thumbnail\n", "of the SRTM global elevation model." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "k8rGvRlCHzXJ", "outputId": "331039b8-3995-4ea1-dda7-2e9307a4c183" }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Import the Image function from the IPython.display module.\n", "from IPython.display import Image\n", "\n", "# Display a thumbnail of global elevation.\n", "Image(url=dem.getThumbUrl({'min': 0, 'max': 3000, 'region':[[[-75.67086291359112,6.072916792136425],\n", " [-75.25475573585675,6.072916792136425],\n", " [-75.25475573585675,6.380084130088567],\n", " [-75.67086291359112,6.380084130088567]]]}))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "yFbwh2-mHzXK" }, "source": [ "In this exercise, we’ll render a static map of the land surface temperature of the Philippines in 2021 using the MODIS Terra Land Surface Temperature dataset in Google Earth Engine." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "4bt2L5eyHzXL", "outputId": "45d4fb0b-d870-4dc7-a924-36612d438a11" }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poi = ee.Geometry.Point([122.1247, 13.2735]) # [long, lat]\n", "roi = poi.buffer(distance=9.2e5)\n", "\n", "dataset = ee.ImageCollection(\"MODIS/061/MOD11A1\")\n", "dataset = dataset.select('LST_Day_1km')\n", "\n", "date_filter = ee.Filter.date('2021-01-01', '2022-01-01')\n", "dataset = dataset.filter(date_filter)\n", "\n", "image = dataset.mean()\n", "image = image.multiply(0.02).add(-273.15)\n", "visualisation_params = {\n", " 'min': 8,\n", " 'max': 40,\n", " 'dimensions': 620,\n", " 'region': roi,\n", " 'palette': ['blue', 'yellow', 'red']\n", "}\n", "url = image.getThumbUrl(visualisation_params)\n", "\n", "Image(url=url)" ] }, { "cell_type": "markdown", "metadata": { "id": "FgjoGEAnHzXM" }, "source": [ "Mean land surface temperature of the Philippines in 2021 showing temperature ranges from 8 degrees to 40 degrees Celsius. The bluish spots indicate the cooler temperatures in the mountainous regions; Yellow areas correspond to relatively mild temperate regions; Meanwhile, orange to red areas indicate the hottest regions throughout the year. The reddest area is, as expected, the densest city in the country — Metro Manila." ] }, { "cell_type": "markdown", "metadata": { "id": "kdNeJrFSHzXN" }, "source": [ "### Interactive map\n", "\n", "The [`folium`](https://python-visualization.github.io/folium/)\n", "library can be used to display `ee.Image` objects on an interactive\n", "[Leaflet](https://leafletjs.com/) map. Folium has no default\n", "method for handling tiles from Earth Engine, so one must be defined\n", "and added to the `folium.Map` module before use.\n", "\n", "The following cell provides an example of adding a method for handing Earth Engine\n", "tiles and using it to display an elevation model to a Leaflet map." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "R7Z44Z6VHzXN", "outputId": "b916ed92-c536-4a79-9d96-927245a03283" }, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Import the Folium library.\n", "import folium\n", "\n", "# Define a method for displaying Earth Engine image tiles to folium map.\n", "def add_ee_layer(self, eeImageObject, visParams, name):\n", " mapID = ee.Image(eeImageObject).getMapId(visParams)\n", " folium.raster_layers.TileLayer(\n", " tiles = \"https://earthengine.googleapis.com/map/\"+mapID['mapid']+\n", " \"/{z}/{x}/{y}?token=\"+mapID['token'],\n", " attr = \"Map Data © Google Earth Engine\",\n", " name = name,\n", " overlay = True,\n", " control = True\n", " ).add_to(self)\n", "\n", "# Add EE drawing method to folium.\n", "folium.Map.add_ee_layer = add_ee_layer\n", "\n", "# Set visualization parameters.\n", "visParams = {'min':0, 'max':3000, 'palette':['225ea8','41b6c4','a1dab4','ffffcc']}\n", "\n", "# Create a folium map object.\n", "myMap = folium.Map(location=[20, 0], zoom_start=3, height=500)\n", "\n", "# Add the elevation model to the map object.\n", "myMap.add_ee_layer(dem, visParams, 'DEM')\n", "\n", "# Add a layer control panel to the map.\n", "myMap.add_child(folium.LayerControl())\n", "\n", "# Display the map.\n", "display(myMap)" ] }, { "cell_type": "markdown", "metadata": { "id": "XNkzu0F3HzXO" }, "source": [ "## Chart visualization\n", "\n", "Some Earth Engine functions produce tabular data that can be plotted by\n", "data visualization packages such as `matplotlib`. The following example\n", "demonstrates the display of tabular data from Earth Engine as a scatter\n", "plot. See [Charting in Colaboratory](https://colab.sandbox.google.com/notebooks/charts.ipynb)\n", "for more information." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "id": "-cqDDr3UHzXO", "outputId": "12ce3d21-4148-48fc-88c7-4890e030777c" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Import the matplotlib.pyplot module.\n", "import matplotlib.pyplot as plt\n", "\n", "# Fetch a Landsat image.\n", "img = ee.Image('LANDSAT/LC08/C02/T1_RT_TOA/LC08_001001_20251013')\n", "\n", "# Select Red and NIR bands, scale them, and sample 500 points.\n", "sampFC = img.select(['B3','B4']).divide(10000).sample(scale=30, numPixels=500)\n", "\n", "# Arrange the sample as a list of lists.\n", "sampDict = sampFC.reduceColumns(ee.Reducer.toList().repeat(2), ['B3', 'B4'])\n", "sampList = ee.List(sampDict.get('list'))\n", "\n", "# Save server-side ee.List as a client-side Python list.\n", "sampData = sampList.getInfo()\n", "\n", "# Display a scatter plot of Red-NIR sample pairs using matplotlib.\n", "plt.scatter(sampData[0], sampData[1], alpha=0.2)\n", "plt.xlabel('Red', fontsize=12)\n", "plt.ylabel('NIR', fontsize=12)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "BQPPhgmbHzXP", "outputId": "98f57ac0-57cb-4df8-bb37-857caeafd926" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'type': 'Image', 'bands': [{'id': 'elevation', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': -32768, 'max': 32767}, 'dimensions': [1296001, 417601], 'crs': 'EPSG:4326', 'crs_transform': [0.0002777777777777778, 0, -180.0001388888889, 0, -0.0002777777777777778, 60.00013888888889]}], 'version': 1641990767055141, 'id': 'USGS/SRTMGL1_003', 'properties': {'system:visualization_0_min': '0.0', 'type_name': 'Image', 'keywords': ['dem', 'elevation', 'geophysical', 'nasa', 'srtm', 'topography', 'usgs'], 'thumb': 'https://mw1.google.com/ges/dd/images/SRTM90_V4_thumb.png', 'description': '

The Shuttle Radar Topography Mission (SRTM, see Farr\\net al. 2007)\\ndigital elevation data is an international research effort that\\nobtained digital elevation models on a near-global scale. This\\nSRTM V3 product (SRTM Plus) is provided by NASA JPL\\nat a resolution of 1 arc-second (approximately 30m).

This dataset has undergone a void-filling process using open-source data\\n(ASTER GDEM2, GMTED2010, and NED), as opposed to other versions that\\ncontain voids or have been void-filled with commercial sources.\\nFor more information on the different versions see the\\nSRTM Quick Guide.

Documentation:

Provider: NASA / USGS / JPL-Caltech

Bands
NameDescription
elevation

Elevation

Terms of Use

Unless otherwise noted, images and video on JPL public\\nweb sites (public sites ending with a jpl.nasa.gov address) may\\nbe used for any purpose without prior permission. For more information\\nand exceptions visit the JPL Image Use Policy site.

Suggested citation(s)

  • Farr, T.G., Rosen, P.A., Caro, E., Crippen, R., Duren, R., Hensley,\\nS., Kobrick, M., Paller, M., Rodriguez, E., Roth, L., Seal, D.,\\nShaffer, S., Shimada, J., Umland, J., Werner, M., Oskin, M., Burbank,\\nD., and Alsdorf, D.E., 2007, The shuttle radar topography mission:\\nReviews of Geophysics, v. 45, no. 2, RG2004, at\\nhttps://doi.org/10.1029/2005RG000183.

', 'source_tags': ['nasa', 'usgs'], 'visualization_0_max': '6000.0', 'title': 'NASA SRTM Digital Elevation 30m', 'product_tags': ['srtm', 'elevation', 'topography', 'dem', 'geophysical'], 'provider': 'NASA / USGS / JPL-Caltech', 'visualization_0_min': '0.0', 'visualization_0_name': 'Elevation', 'date_range': [950227200000, 951177600000], 'system:visualization_0_gamma': '1.6', 'period': 0, 'system:visualization_0_bands': 'elevation', 'provider_url': 'https://cmr.earthdata.nasa.gov/search/concepts/C1000000240-LPDAAC_ECS.html', 'visualization_0_gamma': '1.6', 'sample': 'https://mw1.google.com/ges/dd/images/SRTM90_V4_sample.png', 'tags': ['dem', 'elevation', 'geophysical', 'nasa', 'srtm', 'topography', 'usgs'], 'system:visualization_0_max': '6000.0', 'system:visualization_0_name': 'Elevation', 'system:asset_size': 132792638252, 'visualization_0_bands': 'elevation'}}\n" ] } ], "source": [ "# Como ejemplo imprimamos los metadatos del SRTM\n", "print(ee.Image('USGS/SRTMGL1_003').getInfo())" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "id": "oj4oMab2rw9M", "outputId": "2c9e1782-b4d2-4bdd-867a-ac3731b63327" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n", "Hello World from Earth Engine!\n", "{'type': 'Image', 'bands': [{'id': 'B1', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B2', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B3', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B4', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B5', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B6', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B7', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B8', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [17521, 17461], 'crs': 'EPSG:32631', 'crs_transform': [15, 0, 373192.5, 0, -15, 9097207.5]}, {'id': 'B9', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B10', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'B11', 'data_type': {'type': 'PixelType', 'precision': 'float'}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'QA_PIXEL', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': 0, 'max': 65535}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'QA_RADSAT', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': 0, 'max': 65535}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'SAA', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': -32768, 'max': 32767}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'SZA', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': -32768, 'max': 32767}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'VAA', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': -32768, 'max': 32767}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}, {'id': 'VZA', 'data_type': {'type': 'PixelType', 'precision': 'int', 'min': -32768, 'max': 32767}, 'dimensions': [8761, 8731], 'crs': 'EPSG:32631', 'crs_transform': [30, 0, 373185, 0, -30, 9097215]}], 'version': 1763508826194937, 'id': 'LANDSAT/LC08/C02/T1_RT_TOA/LC08_001001_20251013', 'properties': {'RADIANCE_MULT_BAND_5': 0.0061425, 'RADIANCE_MULT_BAND_6': 0.0015276, 'RADIANCE_MULT_BAND_3': 0.011903, 'RADIANCE_MULT_BAND_4': 0.010038, 'RADIANCE_MULT_BAND_1': 0.012615, 'RADIANCE_MULT_BAND_2': 0.012917, 'WRS_TYPE': 2, 'K2_CONSTANT_BAND_11': 1201.1442, 'K2_CONSTANT_BAND_10': 1321.0789, 'system:footprint': {'type': 'LinearRing', 'coordinates': [[10.254228738626002, 80.32663277875331], [10.243462278122689, 80.33176442438194], [9.608259081769814, 80.60581079482871], [8.119623971080916, 81.18765579219037], [6.634279626192989, 81.69601449169693], [5.915484578907398, 81.91985008051978], [-4.304657666055043, 81.04963714637766], [-4.3113256923453775, 81.04829848186458], [-3.556046674822533, 80.8743972335119], [-1.1989681104585332, 80.2745195451298], [1.1298538479816744, 79.58152748037682], [1.673270332023691, 79.63615022433329], [2.708850017442172, 79.7363071540606], [3.2813098879174207, 79.7894998588954], [3.582773307522232, 79.81691123425485], [8.445165295566449, 80.20513512973281], [8.829867023737147, 80.23177539212249], [9.530921446773386, 80.27889176854613], [10.253406124047508, 80.3255310079475], [10.254228738626002, 80.32663277875331]]}, 'REFLECTIVE_SAMPLES': 8761, 'SUN_AZIMUTH': -141.85354887, 'DATA_SOURCE_TIRS_STRAY_LIGHT_CORRECTION': 'TIRS', 'DATE_ACQUIRED': '2025-10-13', 'ELLIPSOID': 'WGS84', 'STATION_ID': 'LGN', 'RESAMPLING_OPTION': 'CUBIC_CONVOLUTION', 'ORIENTATION': 'NORTH_UP', 'WRS_ROW': 1, 'RADIANCE_MULT_BAND_9': 0.0024006, 'TARGET_WRS_ROW': 1, 'RADIANCE_MULT_BAND_7': 0.00051488, 'RADIANCE_MULT_BAND_8': 0.01136, 'IMAGE_QUALITY_TIRS': 7, 'TRUNCATION_OLI': 'UPPER', 'CLOUD_COVER': -1, 'COLLECTION_CATEGORY': 'RT', 'GRID_CELL_SIZE_REFLECTIVE': 30, 'CLOUD_COVER_LAND': -1, 'COLLECTION_NUMBER': 2, 'IMAGE_QUALITY_OLI': 9, 'LANDSAT_SCENE_ID': 'LC80010012025286LGN00', 'WRS_PATH': 1, 'PANCHROMATIC_SAMPLES': 17521, 'PANCHROMATIC_LINES': 17461, 'REFLECTIVE_LINES': 8731, 'system:asset_size': 768371689, 'system:index': 'LC08_001001_20251013', 'DATA_SOURCE_ELEVATION': 'GLS2000', 'REFLECTANCE_ADD_BAND_1': -0.1, 'REFLECTANCE_ADD_BAND_2': -0.1, 'DATUM': 'WGS84', 'REFLECTANCE_ADD_BAND_3': -0.1, 'REFLECTANCE_ADD_BAND_4': -0.1, 'REFLECTANCE_ADD_BAND_5': -0.1, 'REFLECTANCE_ADD_BAND_6': -0.1, 'REFLECTANCE_ADD_BAND_7': -0.1, 'REFLECTANCE_ADD_BAND_8': -0.1, 'UTM_ZONE': 31, 'system:time_end': 1760364447989, 'LANDSAT_PRODUCT_ID': 'LC08_L1GT_001001_20251013_20251013_02_RT', 'REFLECTANCE_ADD_BAND_9': -0.1, 'GRID_CELL_SIZE_PANCHROMATIC': 15, 'RADIANCE_ADD_BAND_4': -50.18782, 'REFLECTANCE_MULT_BAND_7': 2e-05, 'system:time_start': 1760364447989, 'RADIANCE_ADD_BAND_5': -30.71244, 'REFLECTANCE_MULT_BAND_6': 2e-05, 'RADIANCE_ADD_BAND_6': -7.63791, 'REFLECTANCE_MULT_BAND_9': 2e-05, 'PROCESSING_SOFTWARE_VERSION': 'LPGS_16.5.0', 'RADIANCE_ADD_BAND_7': -2.57438, 'REFLECTANCE_MULT_BAND_8': 2e-05, 'RADIANCE_ADD_BAND_1': -63.07283, 'EPHEMERIS_TYPE': 'SPACECRAFT', 'RADIANCE_ADD_BAND_2': -64.58735, 'RADIANCE_ADD_BAND_3': -59.51669, 'REFLECTANCE_MULT_BAND_1': 2e-05, 'RADIANCE_ADD_BAND_8': -56.7988, 'REFLECTANCE_MULT_BAND_3': 2e-05, 'RADIANCE_ADD_BAND_9': -12.00312, 'REFLECTANCE_MULT_BAND_2': 2e-05, 'REFLECTANCE_MULT_BAND_5': 2e-05, 'REFLECTANCE_MULT_BAND_4': 2e-05, 'THERMAL_LINES': 8731, 'TIRS_SSM_POSITION_STATUS': 'ESTIMATED', 'GRID_CELL_SIZE_THERMAL': 30, 'NADIR_OFFNADIR': 'NADIR', 'RADIANCE_ADD_BAND_11': 0.1, 'REQUEST_ID': '2157534_00001', 'EARTH_SUN_DISTANCE': 0.9976662, 'TIRS_SSM_MODEL': 'PRELIMINARY', 'SCENE_CENTER_TIME': '14:07:27.9895869Z', 'SUN_ELEVATION': -0.75681311, 'RADIANCE_ADD_BAND_10': 0.1, 'ROLL_ANGLE': 0, 'DATE_PRODUCT_GENERATED': 1760373545000, 'K1_CONSTANT_BAND_10': 774.8853, 'SATURATION_BAND_1': 'N', 'SATURATION_BAND_2': 'N', 'SATURATION_BAND_3': 'N', 'SATURATION_BAND_4': 'N', 'SATURATION_BAND_5': 'N', 'MAP_PROJECTION': 'UTM', 'SATURATION_BAND_6': 'N', 'SENSOR_ID': 'OLI_TIRS', 'SATURATION_BAND_7': 'N', 'K1_CONSTANT_BAND_11': 480.8883, 'SATURATION_BAND_8': 'N', 'SATURATION_BAND_9': 'N', 'TARGET_WRS_PATH': 1, 'PROCESSING_LEVEL': 'L1GT', 'RADIANCE_MULT_BAND_11': 0.0003342, 'RADIANCE_MULT_BAND_10': 0.0003342, 'SPACECRAFT_ID': 'LANDSAT_8', 'THERMAL_SAMPLES': 8761}}\n" ] } ], "source": [ "# Add Earth Engine dataset\n", "# traditional python string\n", "print('Hello world!')\n", "\n", "# Earth Eninge object\n", "print(ee.String('Hello World from Earth Engine!').getInfo())\n", "print(ee.Image('LANDSAT/LC08/C02/T1_RT_TOA/LC08_001001_20251013').getInfo())" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "id": "WMtb7kZxHzXR", "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0d0563ca5dfd4752aab3d7259e6f88af", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map(center=[21.79, 70.87], controls=(WidgetControl(options=['position', 'transparent_bg'], position='topright'…" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import geemap\n", "geemap.ee_initialize()\n", "\n", "Map = geemap.Map(center=[21.79, 70.87], zoom=3)\n", "image = ee.Image('USGS/SRTMGL1_003')\n", "vis_params = {\n", " 'min': 0,\n", " 'max': 6000,\n", " 'palette': ['006633', 'E5FFCC', '662A00', 'D8D8D8', 'F5F5F5'],\n", "}\n", "Map.addLayer(image, vis_params, 'SRTM')\n", "Map" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "id": "hDlULpFDHzXR" }, "outputs": [], "source": [ "img=ee.Image('LANDSAT/LC08/C02/T1_RT_TOA/LC08_001001_20251013')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "id": "uN0uzde3HzXR", "outputId": "20c263e6-96fa-4926-82dc-143fcd3532d6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ee.Image({\n", " \"functionInvocationValue\": {\n", " \"functionName\": \"Image.load\",\n", " \"arguments\": {\n", " \"id\": {\n", " \"constantValue\": \"LANDSAT/LC08/C02/T1_RT_TOA/LC08_001001_20251013\"\n", " }\n", " }\n", " }\n", "})\n" ] } ], "source": [ "print(img)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "g7dL59E1HzXS", "outputId": "a6801d7f-b1ab-4dca-fbab-cd71376c539e" }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(url=img.getThumbURL({'bands':['B4','B3','B2'], 'min':100,'max':3500,\n", " 'region':[[[-75.67086291359112,6.072916792136425],\n", " [-75.25475573585675,6.072916792136425],\n", " [-75.25475573585675,6.380084130088567],\n", " [-75.67086291359112,6.380084130088567]]]}))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "wOzKUk6UHzXS" }, "outputs": [], "source": [ "# Select Red and NIR bands, scale them, and sample 500 points.\n", "samp_fc = img.select(['B3','B4']).divide(10000).sample(scale=30, numPixels=500)\n", "\n", "# Arrange the sample as a list of lists.\n", "samp_dict = samp_fc.reduceColumns(ee.Reducer.toList().repeat(2), ['B3', 'B4'])\n", "samp_list = ee.List(samp_dict.get('list'))\n", "\n", "# Save server-side ee.List as a client-side Python list.\n", "samp_data = samp_list.getInfo()\n", "\n", "# Display a scatter plot of Red-NIR sample pairs using matplotlib.\n", "plt.scatter(samp_data[0], samp_data[1], alpha=0.8)\n", "plt.xlabel('Red', fontsize=12)\n", "plt.ylabel('NIR', fontsize=12)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5GKSKixzHzXT", "outputId": "af50c1be-7651-4f1f-df33-7e4531abbadb" }, "outputs": [ { "ename": "NameError", "evalue": "name 'emap' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "Input \u001b[1;32mIn [34]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m Map \u001b[38;5;241m=\u001b[39m \u001b[43memap\u001b[49m\u001b[38;5;241m.\u001b[39mMap(center\u001b[38;5;241m=\u001b[39m[\u001b[38;5;241m40\u001b[39m,\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m100\u001b[39m], zoom\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m)\n\u001b[0;32m 2\u001b[0m Map\u001b[38;5;241m.\u001b[39madd_basemap(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mROADMAP\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;66;03m# Add Google Map\u001b[39;00m\n\u001b[0;32m 3\u001b[0m Map\n", "\u001b[1;31mNameError\u001b[0m: name 'emap' is not defined" ] } ], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP') # Add Google Map\n", "Map\n", "\n", "\n", "# Add Earth Engine dataset\n", "# Get a download URL for an image.\n", "image1 = ee.Image('srtm90_v4')\n", "path = image1.getDownloadUrl({\n", " 'scale': 30,\n", " 'crs': 'EPSG:4326',\n", " 'region': '[[-75.81280448742132,5.696650254732558], [-74.86248710460882,5.696650254732558], [-74.86248710460882,6.605986306802248], [-75.81280448742132,6.605986306802248]]'\n", "})\n", "\n", "print(path)\n", "vis_params = {'min': 0, 'max': 3000}\n", "Map.addLayer(image1, vis_params)\n", "\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "DBn1ouM-HzXT" }, "outputs": [], "source": [ "#el mapa base...\n", "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('RELIEF')\n", "Map" ] }, { "cell_type": "markdown", "metadata": { "id": "bHWT_VQgHzXU" }, "source": [ "Para importar y filtrar una imagen" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hCRcwhePHzXU", "outputId": "dca55b08-1ef2-4ca8-dc1b-0fcaf8932cf1" }, "outputs": [ { "ename": "AttributeError", "evalue": "'Map' object has no attribute 'setCenter'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "Input \u001b[1;32mIn [35]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;66;03m# Define visualization parameters in an object literal.\u001b[39;00m\n\u001b[0;32m 11\u001b[0m vizParams \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbands\u001b[39m\u001b[38;5;124m'\u001b[39m: [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB4_median\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB3_median\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB2_median\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[0;32m 12\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmin\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m5000\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmax\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m15000\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgamma\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m1.3\u001b[39m}\n\u001b[1;32m---> 14\u001b[0m \u001b[43mMap\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msetCenter\u001b[49m(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m75.4\u001b[39m, \u001b[38;5;241m6.4\u001b[39m, \u001b[38;5;241m9\u001b[39m)\n\u001b[0;32m 15\u001b[0m Map\u001b[38;5;241m.\u001b[39maddLayer(median, vizParams, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMedian image\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 17\u001b[0m \u001b[38;5;66;03m#Para que aparezca el mapa\u001b[39;00m\n", "\u001b[1;31mAttributeError\u001b[0m: 'Map' object has no attribute 'setCenter'" ] } ], "source": [ "\n", "\n", "# Load a Landsat 8 collection.\n", "collection = ee.ImageCollection('LANDSAT/LC08/C01/T1') \\\n", " .filterBounds(ee.Geometry.Point(-75.4, 6.4)) \\\n", " .filterDate('2019-01-01', '2019-12-31') \\\n", " .sort('CLOUD_COVER')\n", "\n", "# Compute the median of each pixel for each band of the 5 least cloudy scenes.\n", "median = collection.limit(5).reduce(ee.Reducer.median())\n", "\n", "# Define visualization parameters in an object literal.\n", "vizParams = {'bands': ['B4_median', 'B3_median', 'B2_median'],\n", " 'min': 5000, 'max': 15000, 'gamma': 1.3}\n", "\n", "Map.setCenter(-75.4, 6.4, 9)\n", "Map.addLayer(median, vizParams, 'Median image')\n", "\n", "#Para que aparezca el mapa\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "markdown", "metadata": { "id": "1-XU9YDIHzXU" }, "source": [ "Para importar features desde las bases de datos" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "TRibWk_qHzXV" }, "outputs": [], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP')\n", "Map\n", "\n", "# Load a feature collection.\n", "featureCollection = ee.FeatureCollection('TIGER/2016/States')\n", "\n", "# Filter\n", "filteredFC = featureCollection.filter(ee.Filter.eq('NAME', 'California'))\n", "\n", "Map.addLayer(ee.Image().paint(filteredFC, 0, 2),\n", " {'palette': 'red'}, 'California')\n", "\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "markdown", "metadata": { "id": "wLVgaqr9HzXV" }, "source": [ "Para cargar un feature desde el Assets de GEE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "txl4ICwGHzXV" }, "outputs": [], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP')\n", "Map\n", "\n", "antioquia = ee.FeatureCollection('users/evaristizabalg/Antioquia')\n", "\n", "Map.center_object(antioquia,7)\n", "Map.addLayer(antioquia, {}, 'Antioquia')\n", "\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4PmdPKE_HzXb" }, "outputs": [], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP')\n", "Map\n", "\n", "AMVA = ee.FeatureCollection(\"G:\\My Drive\\INVESTIGACION\\Cartografia/AMVA\");\n", "\n", "Map.center_object(AMVA,7)\n", "Map.addLayer(AMVA, {}, 'AMVA')\n", "\n", "Map.addLayerControl()\n", "Map\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "g2FI3WW_HzXc", "outputId": "af5aa270-21ce-460b-fc49-fb2aea21fb4d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "geemap package not installed. Installing ...\n" ] } ], "source": [ "# Installs geemap package\n", "import subprocess\n", "\n", "try:\n", " import geemap\n", "except ImportError:\n", " print('geemap package not installed. Installing ...')\n", " subprocess.check_call([\"python\", '-m', 'pip', 'install', 'geemap'])\n", "\n", "# Checks whether this notebook is running on Google Colab\n", "try:\n", " import google.colab\n", " import geemap.eefolium as emap\n", "except:\n", " import geemap as emap" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xuBOSubKHzXc", "outputId": "5a3f10e6-f341-4960-8274-723f72d24141" }, "outputs": [], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP')\n", "Map\n", "\n", "Tiempo1 = ee.ImageCollection ('COPERNICUS/S2') \\\n", " .filterDate ('2017-01-01' ,'2018-01-01') \\\n", " .sort('CLOUD_COVER')\n", "Tiempo1b = Tiempo1.reduce(ee.Reducer.min())\n", "\n", "Tiempo2 = ee.ImageCollection ('COPERNICUS/S2') \\\n", " .filterDate ('2018-01-01' ,'2019-01-01') \\\n", " .sort('CLOUD_COVER');\n", "Tiempo2b = Tiempo2.reduce(ee.Reducer.min())\n", "\n", "NDVI1 = Tiempo1b.normalizedDifference (['B8_min', 'B4_min'])\n", "NDVI2 = Tiempo2b.normalizedDifference (['B8_min', 'B4_min'])\n", "\n", "# Compute the difference in NDVI.\n", "ndviDifference = NDVI2.subtract(NDVI1)\n", "\n", "antioquia = ee.FeatureCollection('users/evaristizabalg/Antioquia')\n", "\n", "# Update the NDVI difference mask with the land mask.\n", "maskedDifference = ndviDifference.clip(antioquia)\n", "\n", "# Display the masked result.\n", "vizParams = {'min': -0.5, 'max': 0.5,\n", " 'palette': ['FF0000', 'FFFFFF', '0000FF']}\n", "Map.center_object(antioquia,7)\n", "Map.addLayer(maskedDifference, vizParams, 'NDVI difference')\n", "\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Gv0kbfe4HzXd", "outputId": "7268201f-5b52-4f57-fa34-aecc8dad0b0b" }, "outputs": [ { "data": { "text/html": [ "

To authorize access needed by Earth Engine, open the following\n", " URL in a web browser and follow the instructions:

\n", "

https://accounts.google.com/o/oauth2/auth?client_id=517222506229-vsmmajv00ul0bs7p89v5m89qs8eb9359.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fearthengine+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.full_control&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&code_challenge=jJE_n_fyEUD68rEQiYi_8ziTv15Aq1CaWTv_5KO2kgs&code_challenge_method=S256

\n", "

The authorization workflow will generate a code, which you\n", " should paste in the box below

\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Map = emap.Map(center=[40,-100], zoom=4)\n", "Map.add_basemap('ROADMAP') # Add Google Map\n", "Map\n", "\n", "# This function gets NDVI from Landsat<8 imagery.\n", "def getNDVI(image):\n", " return image.normalizedDifference(['B4', 'B3'])\n", "\n", "image = ee.Image('LANDSAT/LC08/C01/T1_RT/LC08_009056_20190903')\n", "\n", "# Compute NDVI from the scenes.\n", "ndvi = getNDVI(image)\n", "\n", "ndviParams = {'min':-0.2, 'max':0.2,'palette': ['#d73027', '#f46d43', '#fdae61',\n", " '#fee08b', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850']}\n", "Map.addLayer(ndvi, ndviParams, 'NDVI')\n", "Map.centerObject(image, 10)\n", "\n", "# This function gets NDVI from Landsat 8 imagery.\n", "def addNDVI(image):\n", " return image.addBands(image.normalizedDifference(['B5', 'B4']))\n", "\n", "# filtrar\n", "collection = ee.ImageCollection('LANDSAT/LC08/C01/T1') \\\n", " .filterBounds(ee.Geometry.Point(-75.4, 6.4)) \\\n", " .filterDate('2014-01-01', '2014-12-31')\n", "\n", "# aplicar a toda la colecction (Map)\n", "ndviCollection = collection.map(addNDVI)\n", "\n", "first = ndviCollection.first()\n", "print(first.getInfo())\n", "\n", "bandNames = first.bandNames()\n", "print(bandNames.getInfo())\n", "\n", "Map.addLayerControl()\n", "Map" ] }, { "cell_type": "markdown", "metadata": { "id": "75GH4I68HzXe" }, "source": [ "## Sentinel 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LvRhv7wIHzXe", "outputId": "c1a116a1-01f7-49be-d80d-f72eb818add5" }, "outputs": [ { "ename": "EEException", "evalue": "Earth Engine client library not initialized. Run `ee.Initialize()`", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Input \u001b[1;32mIn [9]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m image \u001b[38;5;241m=\u001b[39m \u001b[43mee\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mImageCollection\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mCOPERNICUS/S2\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \\\n\u001b[0;32m 2\u001b[0m \u001b[38;5;241m.\u001b[39mfilterDate(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2017-01-01\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2017-01-02\u001b[39m\u001b[38;5;124m'\u001b[39m)\u001b[38;5;241m.\u001b[39mmedian() \\\n\u001b[0;32m 3\u001b[0m \u001b[38;5;241m.\u001b[39mdivide(\u001b[38;5;241m10000\u001b[39m) \\\n\u001b[0;32m 4\u001b[0m \u001b[38;5;241m.\u001b[39mselect([\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB1\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB2\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB3\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB4\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB5\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB6\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB7\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB8\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB8A\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB12\u001b[39m\u001b[38;5;124m'\u001b[39m])\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\computedobject.py:32\u001b[0m, in \u001b[0;36mComputedObjectMetaclass.__call__\u001b[1;34m(cls, *args, **kwargs)\u001b[0m\n\u001b[0;32m 30\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m args[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m 31\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m---> 32\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mtype\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mcls\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\imagecollection.py:38\u001b[0m, in \u001b[0;36mImageCollection.__init__\u001b[1;34m(self, args)\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, args):\n\u001b[0;32m 25\u001b[0m \u001b[38;5;124;03m\"\"\"ImageCollection constructor.\u001b[39;00m\n\u001b[0;32m 26\u001b[0m \n\u001b[0;32m 27\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 36\u001b[0m \u001b[38;5;124;03m EEException: if passed something other than the above.\u001b[39;00m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 38\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 40\u001b[0m \u001b[38;5;66;03m# Wrap single images in an array.\u001b[39;00m\n\u001b[0;32m 41\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(args, image\u001b[38;5;241m.\u001b[39mImage):\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\imagecollection.py:72\u001b[0m, in \u001b[0;36mImageCollection.initialize\u001b[1;34m(cls)\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[38;5;124;03m\"\"\"Imports API functions to this class.\"\"\"\u001b[39;00m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_initialized:\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mImageCollection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 73\u001b[0m apifunction\u001b[38;5;241m.\u001b[39mApiFunction\u001b[38;5;241m.\u001b[39mimportApi(\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28mcls\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mImageCollection\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mImageCollection\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 75\u001b[0m apifunction\u001b[38;5;241m.\u001b[39mApiFunction\u001b[38;5;241m.\u001b[39mimportApi(\n\u001b[0;32m 76\u001b[0m \u001b[38;5;28mcls\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mreduce\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mImageCollection\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\collection.py:32\u001b[0m, in \u001b[0;36mCollection.initialize\u001b[1;34m(cls)\u001b[0m\n\u001b[0;32m 30\u001b[0m \u001b[38;5;124;03m\"\"\"Imports API functions to this class.\"\"\"\u001b[39;00m\n\u001b[0;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_initialized:\n\u001b[1;32m---> 32\u001b[0m \u001b[43mapifunction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mApiFunction\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mimportApi\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mCollection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mCollection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 33\u001b[0m apifunction\u001b[38;5;241m.\u001b[39mApiFunction\u001b[38;5;241m.\u001b[39mimportApi(\n\u001b[0;32m 34\u001b[0m \u001b[38;5;28mcls\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAggregateFeatureCollection\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCollection\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124maggregate_\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_initialized \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\apifunction.py:183\u001b[0m, in \u001b[0;36mApiFunction.importApi\u001b[1;34m(cls, target, prefix, type_name, opt_prepend)\u001b[0m\n\u001b[0;32m 170\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[0;32m 171\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mimportApi\u001b[39m(\u001b[38;5;28mcls\u001b[39m, target, prefix, type_name, opt_prepend\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 172\u001b[0m \u001b[38;5;124;03m\"\"\"Adds all API functions that begin with a given prefix to a target class.\u001b[39;00m\n\u001b[0;32m 173\u001b[0m \n\u001b[0;32m 174\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 181\u001b[0m \u001b[38;5;124;03m added functions.\u001b[39;00m\n\u001b[0;32m 182\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 183\u001b[0m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minitialize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 184\u001b[0m prepend \u001b[38;5;241m=\u001b[39m opt_prepend \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, api_func \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_api\u001b[38;5;241m.\u001b[39mitems():\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\apifunction.py:154\u001b[0m, in \u001b[0;36mApiFunction.initialize\u001b[1;34m(cls)\u001b[0m\n\u001b[0;32m 152\u001b[0m \u001b[38;5;124;03m\"\"\"Initializes the list of signatures from the Earth Engine front-end.\"\"\"\u001b[39;00m\n\u001b[0;32m 153\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_api:\n\u001b[1;32m--> 154\u001b[0m signatures \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetAlgorithms\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 155\u001b[0m api \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 156\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, sig \u001b[38;5;129;01min\u001b[39;00m signatures\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m 157\u001b[0m \u001b[38;5;66;03m# Strip type parameters.\u001b[39;00m\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\data.py:1050\u001b[0m, in \u001b[0;36mgetAlgorithms\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1034\u001b[0m \u001b[38;5;124;03m\"\"\"Get the list of algorithms.\u001b[39;00m\n\u001b[0;32m 1035\u001b[0m \n\u001b[0;32m 1036\u001b[0m \u001b[38;5;124;03mReturns:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1047\u001b[0m \u001b[38;5;124;03m is not specified.\u001b[39;00m\n\u001b[0;32m 1048\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 1049\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1050\u001b[0m call \u001b[38;5;241m=\u001b[39m \u001b[43m_get_cloud_api_resource\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mprojects()\u001b[38;5;241m.\u001b[39malgorithms()\u001b[38;5;241m.\u001b[39mlist(\n\u001b[0;32m 1051\u001b[0m parent\u001b[38;5;241m=\u001b[39m_get_projects_path(), prettyPrint\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m 1052\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[0;32m 1053\u001b[0m call \u001b[38;5;241m=\u001b[39m _get_cloud_api_resource()\u001b[38;5;241m.\u001b[39mprojects()\u001b[38;5;241m.\u001b[39malgorithms()\u001b[38;5;241m.\u001b[39mlist(\n\u001b[0;32m 1054\u001b[0m project\u001b[38;5;241m=\u001b[39m_get_projects_path(), prettyPrint\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", "File \u001b[1;32m~\\miniconda3\\envs\\gee\\lib\\site-packages\\ee\\data.py:284\u001b[0m, in \u001b[0;36m_get_cloud_api_resource\u001b[1;34m()\u001b[0m\n\u001b[0;32m 282\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_cloud_api_resource\u001b[39m():\n\u001b[0;32m 283\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _cloud_api_resource \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 284\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ee_exception\u001b[38;5;241m.\u001b[39mEEException(\n\u001b[0;32m 285\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEarth Engine client library not initialized. Run `ee.Initialize()`\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 286\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cloud_api_resource\n", "\u001b[1;31mEEException\u001b[0m: Earth Engine client library not initialized. Run `ee.Initialize()`" ] } ], "source": [ "image = ee.ImageCollection('COPERNICUS/S2') \\\n", " .filterDate('2017-01-01', '2017-01-02').median() \\\n", " .divide(10000) \\\n", " .select(['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B12'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Z8Hm_lLIHzXe" }, "outputs": [], "source": [ "vis = {'bands': ['B4', 'B3', 'B2'], 'min': 0.05, 'max': 0.5}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "bOCnsKG3HzXf" }, "outputs": [], "source": [ "# TEST: add feature to the Map\n", "ee.mapclient.addToMap(image, vis,'S2')" ] }, { "cell_type": "markdown", "metadata": { "id": "-87kgiS7HzXf" }, "source": [ "otros" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ipiRxsXqHzXr" }, "outputs": [], "source": [ "area = ee.Geometry.Polygon([[[-75.69327597674794,6.097637610738173],[-75.41861777362294,6.097637610738173],[-75.41861777362294,6.318123436693424],[-75.69327597674794,6.318123436693424],[-75.69327597674794,6.097637610738173]]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "IUEoC6xcHzXs" }, "outputs": [], "source": [ "# define the image\n", "img = ee.Image(\"COPERNICUS/S2/20190827T152649_20190827T152643_T18NVM\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xpQY0irCHzXs" }, "outputs": [], "source": [ "# do any ee operation here\n", "ndvi = ee.Image(img.normalizedDifference(['B8', 'B4']))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "BHoXXtWuHzXt" }, "outputs": [], "source": [ "timedate = img.get('GENERATION_TIME').getInfo()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "k0dwJlMqHzXt" }, "outputs": [], "source": [ "# get the lat lon and add the ndvi\n", "latlon = ee.Image.pixelLonLat().addBands(ndvi)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5kkNcH6pHzXt" }, "outputs": [], "source": [ "# apply reducer to list\n", "latlon = latlon.reduceRegion(\n", " reducer=ee.Reducer.toList(),\n", " geometry=area,\n", " maxPixels=1e8,\n", " scale=20);" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LbMwap7WHzXu" }, "outputs": [], "source": [ "# get data into three different arrays\n", "data = np.array((ee.Array(latlon.get(\"nd\")).getInfo()))\n", "lats = np.array((ee.Array(latlon.get(\"latitude\")).getInfo()))\n", "lons = np.array((ee.Array(latlon.get(\"longitude\")).getInfo()))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "WT2je5KtHzXu" }, "outputs": [], "source": [ "# get the unique coordinates\n", "uniqueLats = np.unique(lats)\n", "uniqueLons = np.unique(lons)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Bn9o9TTQHzXv" }, "outputs": [], "source": [ "# get number of columns and rows from coordinates\n", "ncols = len(uniqueLons)\n", "nrows = len(uniqueLats)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "fXEqgEvwHzXv" }, "outputs": [], "source": [ "# determine pixelsizes\n", "ys = uniqueLats[1] - uniqueLats[0]\n", "xs = uniqueLons[1] - uniqueLons[0]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "lU7Be9M9HzXv" }, "outputs": [], "source": [ "# create an array with dimensions of image\n", "arr = np.zeros([nrows, ncols], np.float32) #-9999" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "CofvL32kHzXw" }, "outputs": [], "source": [ "# fill the array with values\n", "counter =0\n", "for y in range(0,len(arr),1):\n", " for x in range(0,len(arr[0]),1):\n", " if lats[counter] == uniqueLats[y] and lons[counter] == uniqueLons[x] and counter < len(lats)-1:\n", " counter+=1\n", " arr[len(uniqueLats)-1-y,x] = data[counter] # we start from lower left corner" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "aH8CDnTQHzXw" }, "outputs": [], "source": [ "# in case you want to plot the image\n", "import matplotlib.pyplot as plt\n", "plt.imshow(arr)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8O4VrZnhHzXw" }, "outputs": [], "source": [ "# set the\n", "#SetGeoTransform((originX, pixelWidth, 0, originY, 0, pixelHeight))\n", "transform = (np.min(uniqueLons),xs,0,np.max(uniqueLats),0,-ys)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5x_RQmX5HzXx" }, "outputs": [], "source": [ "# set the coordinate system\n", "target = osr.SpatialReference()\n", "target.ImportFromEPSG(4326)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Qw5I7BtiHzXx" }, "outputs": [], "source": [ "# set driver\n", "driver = gdal.GetDriverByName('GTiff')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "uv80tbaRHzXy" }, "outputs": [], "source": [ "timestring = time.strftime(\"%Y%m%d_%H%M%S\")\n", "outputDataset = driver.Create(\"G:\\My Drive\\ANALISIS GEOESPACIAL\\Talleres en Python/output.tif\", ncols,nrows, 1,gdal.GDT_Float32)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8zdjfx2BHzXy" }, "outputs": [], "source": [ "# add some metadata\n", "outputDataset.SetMetadata( {'time': str(timedate), 'someotherInfo': 'lala'} )" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hXnf2T3gHzXz" }, "outputs": [], "source": [ "outputDataset.SetGeoTransform(transform)\n", "outputDataset.SetProjection(target.ExportToWkt())\n", "outputDataset.GetRasterBand(1).WriteArray(arr)\n", "outputDataset.GetRasterBand(1).SetNoDataValue(-9999)\n", "outputDataset = None" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ihxJ_tPUHzXz" }, "outputs": [], "source": [ "# Define the roi\n", "area = ee.Geometry.Polygon([[-75.69327597674794,6.197637610738173],\\\n", " [-75.51861777362294,6.197637610738173],\\\n", " [-75.51861777362294,6.318123436693424],\\\n", " [-75.69327597674794,6.318123436693424],\\\n", " [-75.69327597674794,6.197637610738173]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "69WzlxciHzX0" }, "outputs": [], "source": [ "# define the image\n", "collection = ee.ImageCollection(\"COPERNICUS/S2\").filterBounds(area)\\\n", " .filterDate(\"2018-01-01\",\"2019-01-10\")\\\n", " .filterMetadata(\"CLOUDY_PIXEL_PERCENTAGE\",\"less_than\",10)\\\n", " .select(['B8', 'B4'])\n", "\n", "print(\" number of images: \",collection.size().getInfo())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "3xvjODIMHzX0" }, "outputs": [], "source": [ "# perform any calculation on the image collection here\n", "def anyFunction(img):\n", " ndvi = ee.Image(img.normalizedDifference(['B8', 'B4'])).rename([\"ndvi\"])\n", " return ndvi" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "GVgXczT4HzX1" }, "outputs": [], "source": [ "# export the latitude, longitude and array\n", "def LatLonImg(img):\n", " img = img.addBands(ee.Image.pixelLonLat())\n", "\n", " img = img.reduceRegion(reducer=ee.Reducer.toList(),\\\n", " geometry=area,\\\n", " maxPixels=1e13,\\\n", " scale=10);\n", "\n", " data = np.array((ee.Array(img.get(\"result\")).getInfo()))\n", " lats = np.array((ee.Array(img.get(\"latitude\")).getInfo()))\n", " lons = np.array((ee.Array(img.get(\"longitude\")).getInfo()))\n", " return lats, lons, data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "NhHPpz-uHzX1" }, "outputs": [], "source": [ "# covert the lat, lon and array into an image\n", "def toImage(lats,lons,data):\n", "\n", " # get the unique coordinates\n", " uniqueLats = np.unique(lats)\n", " uniqueLons = np.unique(lons)\n", "\n", " # get number of columns and rows from coordinates\n", " ncols = len(uniqueLons)\n", " nrows = len(uniqueLats)\n", "\n", " # determine pixelsizes\n", " ys = uniqueLats[1] - uniqueLats[0]\n", " xs = uniqueLons[1] - uniqueLons[0]\n", "\n", " # create an array with dimensions of image\n", " arr = np.zeros([nrows, ncols], np.float32) #-9999\n", "\n", " # fill the array with values\n", " counter =0\n", " for y in range(0,len(arr),1):\n", " for x in range(0,len(arr[0]),1):\n", " if lats[counter] == uniqueLats[y] and lons[counter] == uniqueLons[x] and counter < len(lats)-1:\n", " counter+=1\n", " arr[len(uniqueLats)-1-y,x] = data[counter] # we start from lower left corner\n", " return arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Fi9g8S5LHzX1" }, "outputs": [], "source": [ "\n", "# map over the image collection\n", "myCollection = collection.map(anyFunction)\n", "\n", "# get the median\n", "result = ee.Image(myCollection.median()).rename(['result'])\n", "\n", "# get the lon, lat and result as 1d array\n", "lat, lon, data = LatLonImg(result)\n", "\n", "# 1d to 2d array\n", "image = toImage(lat,lon,data)\n", "\n", "# in case you want to plot the image\n", "import matplotlib.pyplot as plt\n", "plt.imshow(image)\n", "plt.show()" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "ml", "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.13.5" } }, "nbformat": 4, "nbformat_minor": 4 }