<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[AgroGEE | Sergio Jiménez]]></title><description><![CDATA[AgroGEE | Sergio Jiménez]]></description><link>https://www.gee.hidraulicafacil.com.mx</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1747806151687/5d11a75c-f853-43c1-9a87-4405d664a041.png</url><title>AgroGEE | Sergio Jiménez</title><link>https://www.gee.hidraulicafacil.com.mx</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 19:55:01 GMT</lastBuildDate><atom:link href="https://www.gee.hidraulicafacil.com.mx/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[ET promedio historico en Google Earth Engine]]></title><description><![CDATA[En una entrada anterior vimos cómo obtener la evapotranspiración (ET) acumulada en un año agrícola utilizando el conjunto de datos de evapotranspiración/flujo de calor latente MOD16A2 versión 6 (ver entrada anterior).
En esta nueva publicación vamos ...]]></description><link>https://www.gee.hidraulicafacil.com.mx/et-promedio-historico-en-google-earth-engine</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/et-promedio-historico-en-google-earth-engine</guid><category><![CDATA[agroGEE]]></category><category><![CDATA[hidraulicaFacil]]></category><category><![CDATA[evapotranspiration]]></category><category><![CDATA[mexico]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Tue, 20 May 2025 05:03:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747717115749/7db7d31b-a037-4a3f-8d1e-aa52f4a349ba.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En una entrada anterior vimos cómo obtener la <strong>evapotranspiración (ET) acumulada en un año agrícola</strong> utilizando el conjunto de datos de <strong>evapotranspiración/flujo de calor latente MOD16A2 versión 6</strong> (<a target="_blank" href="https://www.gee.hidraulicafacil.com.mx/evapotranspiracion-con-datos-modis-desde-google-earth-engine">ver entrada anterior</a>).</p>
<p>En esta nueva publicación vamos a ir un paso más allá: aprenderemos a calcular la <strong>ET promedio anual histórica</strong>, es decir, el valor promedio de evapotranspiración en un lugar determinado <strong>a lo largo de varios años</strong>.</p>
<p>Este análisis es útil para:</p>
<ul>
<li><p>Estimar el consumo promedio de agua en diferentes regiones o cultivos.</p>
</li>
<li><p>Evaluar la disponibilidad hídrica en el largo plazo.</p>
</li>
<li><p>Comparar condiciones normales con años específicos (por ejemplo, para detectar sequías o excesos de lluvia).</p>
</li>
</ul>
<p>Podemos definir el período histórico según nuestras necesidades: <strong>5, 10, 15 años</strong>, o incluso usar <strong>todos los años disponibles</strong> del conjunto MOD16A2 (que comienza en el año 2000).</p>
<p>En esta entrada exploraremos cómo hacerlo paso a paso en <strong>Google Earth Engine (GEE)</strong>, filtrando los datos, calculando promedios y visualizándolos en el mapa o exportándolos para su análisis.</p>
<p>1. <strong>Definir capas de referencia, país y años de analisis</strong></p>
<p>Usamos una capa de límites nacionales de México y dos módulos personalizados (de VICAL) para agregar estilos y leyendas. Ademas, ingresamos una lista con los años que queremos analizar.</p>
<pre><code><span class="hljs-keyword">var</span> NA = ee.FeatureCollection(<span class="hljs-string">"USDOS/LSIB\_SIMPLE/2017"</span>) .filter(ee.Filter.eq(<span class="hljs-string">'country\_co'</span>, <span class="hljs-string">'MX'</span>)); <span class="hljs-comment">// México</span>
<span class="hljs-keyword">var</span> imp = <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Exportaciones'</span>); 
<span class="hljs-keyword">var</span> St = <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Style'</span>);
<span class="hljs-keyword">var</span> anuario = ee.List(\[<span class="hljs-number">2010</span>, <span class="hljs-number">2011</span>, <span class="hljs-number">2012</span>, <span class="hljs-number">2013</span>,<span class="hljs-number">2014</span>,<span class="hljs-number">2015</span>,<span class="hljs-number">2016</span>,<span class="hljs-number">2017</span>,<span class="hljs-number">2018</span>,<span class="hljs-number">2019</span>,<span class="hljs-number">2020</span>,<span class="hljs-number">2021</span>,<span class="hljs-number">2022</span>,<span class="hljs-number">2023</span>\]);
<span class="hljs-keyword">var</span> fechas = anuario.map(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">y</span>) </span>{
  <span class="hljs-keyword">return</span> ee.Date.fromYMD({
    <span class="hljs-attr">year</span>: y, 
    <span class="hljs-attr">month</span>: <span class="hljs-number">1</span>, 
    <span class="hljs-attr">day</span>: <span class="hljs-number">1</span>
  });
});
</code></pre><p>2. <strong>Importar las colecciones MODIS, y seleccionar la banda ET y unir</strong> Agregamos las dos colleciones de imagenes y lo unimos en uno solo para poder generar la serie de tiempo de cualquier punto que desemos</p>
<pre><code><span class="hljs-keyword">var</span> collection_i = ee.ImageCollection(<span class="hljs-string">"MODIS/061/MOD16A2"</span>)
  .filterDate(<span class="hljs-string">'2022-01-01'</span>, <span class="hljs-string">'2025-12-31'</span>)
  .select(<span class="hljs-string">'ET'</span>);
<span class="hljs-keyword">var</span> collection_f = ee.ImageCollection(<span class="hljs-string">'MODIS/006/MOD16A2'</span>)
 .filterDate(<span class="hljs-string">'2010-01-01'</span>, <span class="hljs-string">'2021-12-31'</span>)
  .select(<span class="hljs-string">'ET'</span>);
<span class="hljs-keyword">var</span> collection2=collection_i.merge(collection_f).sort(<span class="hljs-string">'system:time_start'</span>)
</code></pre><p>3. <strong>Suma anual de ET por cada año</strong> Aquí filtramos los datos de cada año, sumamos los valores de ET para obtener la ET anual acumulada por píxel y guardamos la propiedad year para poder filtrar después.</p>
<pre><code><span class="hljs-keyword">var</span> compuestos = ee.ImageCollection.fromImages(anuario.map(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">y</span>) </span>{
  <span class="hljs-keyword">var</span> anual = collection2.filter(ee.Filter.calendarRange(y, y, <span class="hljs-string">'year'</span>));
  <span class="hljs-keyword">return</span> anual.sum()
              .set(<span class="hljs-string">'year'</span>, y)
              .set(<span class="hljs-string">'system:time_start'</span>, ee.Date.fromYMD(y, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>).millis());
}));
</code></pre><p>4. <strong>Calcular la media histórica y convertir unidades</strong></p>
<pre><code><span class="hljs-keyword">var</span> etPromedioHistorico = compuestos.mean().multiply(<span class="hljs-number">0.1</span>).clip(NA).float();
</code></pre><p>5. <strong>Filtrar años individuales para visualización</strong> Puedes visualizar años individuales seleccionando con el filtro por propiedad year.</p>
<pre><code><span class="hljs-keyword">var</span> media2020 = ee.Image(compuestos.filter(ee.Filter.eq(<span class="hljs-string">'year'</span>, <span class="hljs-number">2020</span>)).first());
</code></pre><p>6. <strong>Crear gráfico de serie de tiempo de ET</strong> Esto genera una gráfica para una región de interés (geometry) mostrando la ET anual a lo largo de los años. cabe recordar que los valores en la gráfica los debe afectar por 0.1 que es la escala a lo que esta la colección imagenes</p>
<pre><code><span class="hljs-keyword">var</span> chart = ui.Chart.image.series({
  <span class="hljs-attr">imageCollection</span>: compuestos.select(<span class="hljs-string">'ET'</span>), 
  <span class="hljs-attr">region</span>: geometry, 
  <span class="hljs-attr">reducer</span>: ee.Reducer.first(), 
  <span class="hljs-attr">scale</span>: <span class="hljs-number">30</span>
});

<span class="hljs-keyword">var</span> options = { 
  <span class="hljs-attr">title</span>: <span class="hljs-string">'Serie de tiempo de Evapotranspiración x 10'</span>, 
  <span class="hljs-attr">hAxis</span>: { <span class="hljs-attr">title</span>: <span class="hljs-string">'fecha'</span> },
  <span class="hljs-attr">vAxis</span>: { <span class="hljs-attr">title</span>: <span class="hljs-string">'ET (mm/año'</span> },
  <span class="hljs-attr">series</span>: {
    <span class="hljs-number">0</span>: { <span class="hljs-attr">color</span>: <span class="hljs-string">'green'</span> }
  }
};

<span class="hljs-comment">// Configure las opciones del gráfico e imprímalo.</span>
chart = chart.setOptions(options);
print(chart);
</code></pre><p>7. <strong>Visualizar y exportar resultados</strong></p>
<pre><code><span class="hljs-keyword">var</span> paletaCl = {<span class="hljs-attr">min</span>: <span class="hljs-number">100</span>, <span class="hljs-attr">max</span>: <span class="hljs-number">600</span>, <span class="hljs-attr">palette</span>:St.ETO};
<span class="hljs-keyword">var</span> panL = imp.Leyenda(<span class="hljs-string">'ET (mm)'</span>, paletaCl);
<span class="hljs-comment">//Mostrar en el mapa</span>
<span class="hljs-built_in">Map</span>.centerObject(NA)<span class="hljs-comment">//centrar a la region</span>
<span class="hljs-built_in">Map</span>.addLayer(etPromedioHistorico, paletaCl, <span class="hljs-string">'ET promedio 2010–2022'</span>);
<span class="hljs-built_in">Map</span>.addLayer((media2020.multiply(<span class="hljs-number">0.1</span>)).clip(NA), paletaCl, <span class="hljs-string">' Suma_ET2020'</span>);
<span class="hljs-built_in">Map</span>.add(panL);<span class="hljs-comment">// leyenda</span>
<span class="hljs-comment">//Exportar Img</span>
Export.image.toDrive({
  <span class="hljs-attr">image</span>: etPromedioHistorico.select(<span class="hljs-string">'ET'</span>),
  <span class="hljs-attr">description</span>: <span class="hljs-string">'ET_promedio_historico_2010_2025'</span>,
  <span class="hljs-attr">folder</span>: <span class="hljs-string">'earthengine'</span>,
  <span class="hljs-attr">fileNamePrefix</span>: <span class="hljs-string">'ET'</span>,
  <span class="hljs-attr">scale</span>: <span class="hljs-number">500</span>,
  <span class="hljs-attr">maxPixels</span>: <span class="hljs-number">1e10</span>,
  <span class="hljs-attr">crs</span>: <span class="hljs-string">'EPSG:4326'</span>,
  <span class="hljs-attr">formatOptions</span>: {
    <span class="hljs-attr">cloudOptimized</span>: <span class="hljs-literal">true</span>
  }
})
</code></pre><p>El codigo completo lo puedes encontrar <a target="_blank" href="https://code.earthengine.google.com/4d4311419d3189b139c38bf7a29a8441">aqui</a>:</p>
<p>Puedes modificar el codigo o compartirlo, dejanos tus comentarios de que variable quiere y cual es el objetivo.</p>
]]></content:encoded></item><item><title><![CDATA[Descargar ortomosaicos Sentinel-2 de zonas especificas desde Google Earth Engine]]></title><description><![CDATA[En esta entrada vamos a ver paso a paso como descargar ortomosaicos Sentinel-2 de sitios y fechas específicas.

Lo primero que tenemos que hacer es seleccionar la colección de imágenes, en este caso vamos a ocupar: *'_*Harmonized Sentinel-2 MSI: Mult...]]></description><link>https://www.gee.hidraulicafacil.com.mx/descargar-ortomosaicos-sentinel-2-de-zonas-especificas-desde-google-earth-engine</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/descargar-ortomosaicos-sentinel-2-de-zonas-especificas-desde-google-earth-engine</guid><category><![CDATA[GEE]]></category><category><![CDATA[vical]]></category><category><![CDATA[sentinel-2]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Tue, 26 Sep 2023 06:40:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/opZ--yE1-hg/upload/7a1d2e47f81347edc4ac49d82bc4f6d3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta entrada vamos a ver paso a paso como descargar ortomosaicos Sentinel-2 de sitios y fechas específicas.</p>
<ol>
<li>Lo primero que tenemos que hacer es seleccionar la colección de imágenes, en este caso vamos a ocupar: *'_*Harmonized Sentinel-2 MSI: MultiSpectral Instrument, Level-2A_, sus características pueden verse en este <a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED">sitio web</a></li>
</ol>
<pre><code><span class="hljs-keyword">var</span> l8sr = ee.ImageCollection(<span class="hljs-string">"COPERNICUS/S2_SR_HARMONIZED"</span>);
</code></pre><ol>
<li>Ahora usando la herramienta <strong><mark>Drawing tools</mark></strong> vamos a crear un polígono del área donde necesitamos la imagen. Nótese que al crear un polígono este se guarda en la parte superior de nuestro script</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695709075229/fcd5168e-c1a1-419e-9611-ebad6123eaf7.png" alt="Creando un poligono" class="image--center mx-auto" /></p>
<ol>
<li><p>Vamos filtrar las imágenes de la colección usando tres características: <em>La geometría, intervalo de fechas específicas y el porcentaje de nubosidad máximo que deben tener las imágenes</em>.</p>
<p> <em>-La primer características es con respecto al polígono que creamos al inicio</em></p>
<p> <em>-La segunda característica ustedes los pueden definir, en este caso vamos seleccionar fechas del 2023.</em></p>
<p> <em>-En la tercera característica vamos filtrar imágenes que además cumplan con el criterio de una nubosidad menos a 20 %</em></p>
</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> filtradaPorFechaYNubes = l8sr
    .filterBounds(geometry) <span class="hljs-comment">//filtro de la colección de imagenes por geometria</span>
    .filterDate(<span class="hljs-string">'2023-01-01'</span>, <span class="hljs-string">'2023-08-31'</span>) <span class="hljs-comment">//filtro por fechas</span>
    .filterMetadata(<span class="hljs-string">'CLOUDY_PIXEL_PERCENTAGE'</span>, <span class="hljs-string">'less_than'</span>, <span class="hljs-number">20</span>); <span class="hljs-comment">//filtro por nubosidad</span>
</code></pre><ol>
<li>Hasta este punto ya tenemos la colección de imágenes según nuestros requisitos, ahora lo que falta es generar un ortomosaicos, es decir, pasar de una colección de imágenes a una sola imagen. Por tanto, podemos usar la propiedad media (<em>ImageCollection.mean()</em>) o mediana (<em>ImageCollection.median()</em>). En el caso de la media: se Reduce una colección de imágenes calculando la media de todos los valores en cada píxel en la pila de todas las bandas coincidentes. Las bandas se emparejan por nombre.</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> composite = filtradaPorFechaYNubes.mean();
</code></pre><ol>
<li>Ahora podemos crear una visualización indicando las bandas que nos interesa mostrar y los rangos de valores. Posteriormente agregamos la capa <em>composite</em> (que creamos anteriormente) al mapa.</li>
</ol>
<pre><code><span class="hljs-comment">//creamos una variable visualizacion</span>
<span class="hljs-keyword">var</span> visParams1 = {<span class="hljs-attr">bands</span>: [<span class="hljs-string">'B4'</span>, <span class="hljs-string">'B3'</span>, <span class="hljs-string">'B2'</span>], <span class="hljs-attr">min</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">max</span>: <span class="hljs-number">5000</span>};
<span class="hljs-built_in">Map</span>.addLayer(composite, visParams1, <span class="hljs-string">'composite'</span>);
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695710032616/70ce49b9-f2a8-4c86-b6de-636e1cc4211a.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Si deseamos cortar la visualización de acuerdo al borde de nuestro poligono podemos usar la propiedad <em>.clip()</em> directamente cuando agregamos el mapa. Ademas acercamos el mapa a nuestra geometria usando <em>Map.centerObject</em></li>
</ol>
<pre><code><span class="hljs-built_in">Map</span>.addLayer(composite.clip(geometry), visParams1, <span class="hljs-string">'compositeRecortado'</span>);
<span class="hljs-built_in">Map</span>.centerObject(geometry,<span class="hljs-number">10</span>)
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695710012027/0a0232ff-b98e-42c4-b6d9-ac16ac678140.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Una forma para exportar nuestro ortomosaico (composite) fuera de Google Earth Engine es mediante el siguiente código, donde especificamos la colección de imágenes, el folder, la región o borde, escala de salida y el sistema de referencia (si no lo conocen busquen en QGIS).</li>
</ol>
<pre><code>Export.image.toDrive({
  <span class="hljs-attr">image</span>: composite.select(<span class="hljs-string">'B4'</span>, <span class="hljs-string">'B3'</span>, <span class="hljs-string">'B2'</span>),
  <span class="hljs-attr">description</span>: <span class="hljs-string">'img'</span>,
  <span class="hljs-attr">folder</span>: <span class="hljs-string">'CursoGEE'</span>,
  <span class="hljs-attr">region</span>: geometry,
  <span class="hljs-attr">scale</span>: <span class="hljs-number">30</span>,
  <span class="hljs-attr">crs</span>: <span class="hljs-string">'EPSG:4326'</span>,
  <span class="hljs-attr">formatOptions</span>: {
    <span class="hljs-attr">cloudOptimized</span>: <span class="hljs-literal">true</span>
  }
});
</code></pre><p>El codigo completo lo pueden encontrar <a target="_blank" href="https://code.earthengine.google.com/8e2e03a68a291379d10f7def8bb8c6e7"><mark>aquí</mark></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695710325647/6c7ccd89-dd20-48cc-b3a3-693307a2ffa9.png" alt class="image--center mx-auto" /></p>
<p>Dejanos tus comentarios y dudas.</p>
]]></content:encoded></item><item><title><![CDATA[Descargar ortomosaicos landsat de zonas especificas desde Google Earth Engine]]></title><description><![CDATA[En esta entrada vamos a ver paso a paso como descargar ortomosaicos Landsat de sitios y fechas específicas.

Lo primero que tenemos que hacer es seleccionar la colección de imágenes, en este caso vamos a ocupar: 'USGS Landsat 8 Level 2' e importe el ...]]></description><link>https://www.gee.hidraulicafacil.com.mx/descargar-ortomosaicos-landsat-de-zonas-especificas-desde-google-earth-engine</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/descargar-ortomosaicos-landsat-de-zonas-especificas-desde-google-earth-engine</guid><category><![CDATA[GEE]]></category><category><![CDATA[vical]]></category><category><![CDATA[landsat]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Tue, 26 Sep 2023 06:21:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/_SFJhRPzJHs/upload/963d9bebd67e6397022ed6b63cbb6d87.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta entrada vamos a ver paso a paso como descargar ortomosaicos Landsat de sitios y fechas específicas.</p>
<ol>
<li>Lo primero que tenemos que hacer es seleccionar la colección de imágenes, en este caso vamos a ocupar: <em>'USGS Landsat 8 Level 2'</em> e importe el <em>tier 1</em>, sus características pueden verse en este <a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/landsat">sitio web</a></li>
</ol>
<pre><code><span class="hljs-keyword">var</span> l8sr = ee.ImageCollection(<span class="hljs-string">"LANDSAT/LC08/C02/T1_L2"</span>);
</code></pre><ol>
<li>Ahora usando la herramienta <strong><mark>Drawing tools</mark></strong> vamos a crear un polígono del área donde necesitamos la imagen. Nótese que al crear un polígono este se guarda en la parte superior de nuestro script</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695709075229/fcd5168e-c1a1-419e-9611-ebad6123eaf7.png" alt="Creando un poligono" class="image--center mx-auto" /></p>
<ol>
<li>Vamos filtrar las imágenes de la colección usando tres características: <em>La geometría, intervalo de fechas específicas y el porcentaje de nubosidad máximo que deben tener las imágenes</em>. -La primer características es con respecto al polígono que creamos al inicio -La segunda característica ustedes los pueden definir, en este caso vamos seleccionar fechas del 2023. -En la tercera característica vamos filtrar imágenes que además cumplan con el criterio de una nubosidad menos a 10 %</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> filtradaPorFechaYNubes = l8sr
    .filterBounds(geometry) <span class="hljs-comment">//filtro de la colección de imagenes por geometria</span>
    .filterDate(<span class="hljs-string">'2023-01-01'</span>, <span class="hljs-string">'2023-08-31'</span>) <span class="hljs-comment">//filtro por fechas</span>
    .filterMetadata(<span class="hljs-string">'CLOUD_COVER'</span>, <span class="hljs-string">'less_than'</span>, <span class="hljs-number">10</span>); <span class="hljs-comment">//filtro por nubosidad</span>
</code></pre><ol>
<li>Hasta este punto ya tenemos la colección de imágenes según nuestros requisitos, ahora lo que falta es generar un ortomosaicos, es decir, pasar de una colección de imágenes a una sola imagen. Por tanto, podemos usar la propiedad media (<em>ImageCollection.mean()</em>) o mediana (<em>ImageCollection.median()</em>). En el caso de la media: se Reduce una colección de imágenes calculando la media de todos los valores en cada píxel en la pila de todas las bandas coincidentes. Las bandas se emparejan por nombre.</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> composite = filtradaPorFechaYNubes.mean();
</code></pre><ol>
<li>Ahora podemos crear una visualización indicando las bandas que nos interesa mostrar y los rangos de valores. Posteriormente agregamos la capa <em>composite</em> (que creamos anteriormente) al mapa.</li>
</ol>
<pre><code><span class="hljs-comment">//creamos una variable visualizacion</span>
<span class="hljs-keyword">var</span> visParams1 = {<span class="hljs-attr">bands</span>: [<span class="hljs-string">'SR_B4'</span>, <span class="hljs-string">'SR_B3'</span>, <span class="hljs-string">'SR_B2'</span>], <span class="hljs-attr">min</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">max</span>: <span class="hljs-number">30000</span>};
<span class="hljs-built_in">Map</span>.addLayer(composite, visParams1, <span class="hljs-string">'composite'</span>);
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695709119509/844f8ea0-1466-47c1-9d53-aae06c45036b.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Si deseamos cortar la visualización de acuerdo al borde de nuestro poligono podemos usar la propiedad <em>.clip()</em> directamente cuando agregamos el mapa. Ademas acercamos el mapa a nuestra geometria usando <em>Map.centerObject</em></li>
</ol>
<pre><code><span class="hljs-built_in">Map</span>.addLayer(composite.clip(geometry), visParams1, <span class="hljs-string">'compositeRecortado'</span>);
<span class="hljs-built_in">Map</span>.centerObject(geometry,<span class="hljs-number">10</span>)
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695709145301/38c520c4-7cc1-447e-8955-5cda6d03b002.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Una forma para exportar nuestro ortomosaico (composite) fuera de Google Earth Engine es mediante el siguiente código, donde especificamos la colección de imágenes, el folder, la región o borde, escala de salida y el sistema de referencia (si no lo conocen busquen en QGIS).</li>
</ol>
<pre><code>Export.image.toDrive({
  <span class="hljs-attr">image</span>: composite.select(<span class="hljs-string">'SR_B4'</span>, <span class="hljs-string">'SR_B3'</span>, <span class="hljs-string">'SR_B2'</span>),
  <span class="hljs-attr">description</span>: <span class="hljs-string">'img'</span>,
  <span class="hljs-attr">folder</span>: <span class="hljs-string">'CursoGEE'</span>,
  <span class="hljs-attr">region</span>: geometry,
  <span class="hljs-attr">scale</span>: <span class="hljs-number">30</span>,
  <span class="hljs-attr">crs</span>: <span class="hljs-string">'EPSG:4326'</span>,
  <span class="hljs-attr">formatOptions</span>: {
    <span class="hljs-attr">cloudOptimized</span>: <span class="hljs-literal">true</span>
  }
});
</code></pre><p>El codigo completo lo pueden encontrar <a target="_blank" href="https://code.earthengine.google.com/5581bd1c93469907bf0805ace80dc9c5"><mark>aquí</mark></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695709162271/a2269bef-cb32-4974-b21f-63e3ec38355d.png" alt class="image--center mx-auto" /></p>
<p>Dejanos tus comentarios y dudas.</p>
]]></content:encoded></item><item><title><![CDATA[Mapear cuerpos de agua usando 4 índices de vegetación  de imagenes Landsat y Sentinel-2 en GEE]]></title><description><![CDATA[En esta entrada vamos a calcular índices de vegetación que se usan comúnmente para clasificar pixeles de cuerpos de agua y vamos a delimitar estos cuerpos de agua. Para ello vamos a usar la librería de VICAL (Jiménez-Jiménez et al., 2022) en Google E...]]></description><link>https://www.gee.hidraulicafacil.com.mx/mapear-cuerpos-de-agua-usando-4-indices-de-vegetacion-de-imagenes-landsat-y-sentinel-2-en-gee</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/mapear-cuerpos-de-agua-usando-4-indices-de-vegetacion-de-imagenes-landsat-y-sentinel-2-en-gee</guid><category><![CDATA[GEE]]></category><category><![CDATA[water]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Tue, 29 Nov 2022 23:17:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1669762299048/cEBJuAOsi.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta entrada vamos a calcular índices de vegetación que se usan comúnmente para clasificar pixeles de cuerpos de agua y vamos a delimitar estos cuerpos de agua. Para ello vamos a usar la librería de VICAL (Jiménez-Jiménez et al., 2022) en Google Earth Engine.</p>
<p>Son muchos los índices de vegetación que se emplean para el mapeo de cuerpos de agua, algunos de estos se describen con detalle en la entrada <a target="_blank" href="https://www.hidraulicafacil.com.mx/2016/04/IndicesAguaImgSatelitales.html">Índices de vegetación para mapear cuerpos de agua</a>.</p>
<p>Con VICAL se pueden calcular los siguientes en GEE:</p>
<ul>
<li><p>AWEI (Automated Water Extraction Index)</p>
</li>
<li><p>NDWI (Normalized difference water index)</p>
</li>
<li><p>MNDWI (Modified Normalized difference water index)</p>
</li>
<li><p>WI (water index)</p>
</li>
<li><p>ANDWI (Augmented Normalized Difference Water Index)</p>
</li>
</ul>
<p>Para saber como extraer cuerpos de agua con imagenes Sentinel-2 o Landsat vamos a seguir los siguientes pasos:</p>
<ol>
<li>VICAL cuenta con tres archivos que puede importar a su Script, estos son</li>
</ol>
<pre><code><span class="hljs-comment">// archivo para las colecciones de imagenes);</span>
<span class="hljs-keyword">var</span> imp = <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Exportaciones'</span>);
<span class="hljs-comment">// archivo para los indices de vegetacion</span>
<span class="hljs-keyword">var</span> imp2= <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:VegetationIndex'</span>); 
<span class="hljs-comment">// archivo para las visualizaciones</span>
<span class="hljs-keyword">var</span> St= <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Style'</span>);
</code></pre><ol>
<li>Antes de importar el conjunto de colecciones de imágenes (Landsat o sentinel-2 o ambos) se deben definir ciertas variables que son útiles para filtrar esta colección, estos son: i) un polígono; ii) intervalo de fechas y iii) valor umbral de nubes en las imágenes.</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> fecha = [<span class="hljs-string">'2021-03-01'</span>, <span class="hljs-string">'2022-03-18'</span>]; <span class="hljs-comment">//Fecha inicial y final </span>
<span class="hljs-keyword">var</span> table = ee.FeatureCollection( <span class="hljs-comment">//poligono</span>
    ee.Geometry.Polygon(
        [[[<span class="hljs-number">-105.09741449991577</span>, <span class="hljs-number">25.77457195054493</span>],
          [<span class="hljs-number">-105.17500544229858</span>, <span class="hljs-number">25.72262066567659</span>],
          [<span class="hljs-number">-105.05415583292358</span>, <span class="hljs-number">25.49103864339504</span>],
          [<span class="hljs-number">-104.93261957804077</span>, <span class="hljs-number">25.548666430953972</span>]]])); 
<span class="hljs-keyword">var</span> p_nubes= <span class="hljs-number">10</span>;<span class="hljs-comment">//Porcentaje de nubes</span>
</code></pre><ol>
<li>Importamos la colección de imagenes, en este caso es Sentinel-2, usamos para ello el archivo <strong>imp</strong> de VICAL</li>
</ol>
<pre><code><span class="hljs-comment">//Se emplea la imagen Sentinel</span>
<span class="hljs-keyword">var</span> S2B = imp.ColeccionImagenSentinelSR(fecha, table, p_nubes);
</code></pre><ol>
<li>Calculamos cualquiera de los índices de vegetación que se mostraron arriba, en este caso vamos a usar el <strong>AWEI</strong>.</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> ivs = ee.ImageCollection(S2B.map(imp2.AWEI));
</code></pre><ol>
<li>Seleccionamos una imagen de la colección (en este caso la primera imagen) y definimos un valor umbral que en este caso es 0</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> iv = ivs.first(); <span class="hljs-comment">//indice de vegetación</span>
<span class="hljs-keyword">var</span> th=<span class="hljs-number">0</span>; <span class="hljs-comment">//valor umbral</span>
</code></pre><ol>
<li>Se crea el archivo vector con los pixeles de agua, para usar la funcion del archivo imp. indicamos los valores de estas variables: Índice de vegetación, valor umbral, polígono que delimitada, escala pixel.</li>
</ol>
<pre><code><span class="hljs-keyword">var</span> vectors=imp.VectorF(iv,th,table,<span class="hljs-number">10</span>)
</code></pre><ol>
<li>Se agrega el índice de vegetación y el archivo vector al mapa</li>
</ol>
<pre><code><span class="hljs-comment">//Paleta de colores donde se usa el archivo st</span>
<span class="hljs-keyword">var</span> ivVis = {<span class="hljs-attr">min</span> :<span class="hljs-number">0</span>, <span class="hljs-attr">max</span> : <span class="hljs-number">1</span>, <span class="hljs-attr">palette</span> : St.paletaIV};
<span class="hljs-comment">//se agrega al mapa y centra el mapa a la zona</span>
<span class="hljs-built_in">Map</span>.addLayer(iv.clip(table), ivVis,<span class="hljs-string">'NDVI'</span>); <span class="hljs-comment">//Indice</span>
<span class="hljs-built_in">Map</span>.addLayer (vectors, {<span class="hljs-attr">palette</span>: [<span class="hljs-string">'blue'</span>, <span class="hljs-string">'red'</span>]}, <span class="hljs-string">'Water Body'</span>)
<span class="hljs-built_in">Map</span>.centerObject(table, <span class="hljs-number">13</span>);
</code></pre><p>El resultado final es:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669763672846/KN0yDL9s2.png" alt="image.png" /></p>
<p>Para revisar el script a detalle clic <a target="_blank" href="https://code.earthengine.google.com/f73f4dfe69c0cc68cb0e6a46479376be">aquí</a></p>
]]></content:encoded></item><item><title><![CDATA[Obtener la ubicación del usuario en GEE / Automatically Taking User Location in GEE UIs]]></title><description><![CDATA[Obtener la ubicación actual del usuario es sencillo en Google Maps pero en Google Earth Engine es ¿posible?. La respuesta es SÍ, GEE tiene una funcion llamada ui.util.getCurrentPosition que permite obtener la posición geográfica actual del usuario de...]]></description><link>https://www.gee.hidraulicafacil.com.mx/obtener-la-ubicacion-del-usuario-en-gee-automatically-taking-user-location-in-gee-uis</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/obtener-la-ubicacion-del-usuario-en-gee-automatically-taking-user-location-in-gee-uis</guid><category><![CDATA[location GEE]]></category><category><![CDATA[CurrentPosition]]></category><category><![CDATA[GEE]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Sat, 01 Oct 2022 04:48:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664600003571/qdUE73Kuz.PNG" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Obtener la ubicación actual del usuario es sencillo en Google Maps pero en Google Earth Engine es <em>¿posible?</em>. La respuesta es <strong><em>SÍ</em></strong>, GEE tiene una funcion llamada <a target="_blank" href="https://developers.google.com/earth-engine/apidocs/ui-util-getcurrentposition"><strong>ui.util.getCurrentPosition</strong></a> que permite obtener la posición geográfica actual del usuario del servicio de geolocalización del navegador. 
En este sentido, en esta entrada vamos a aprender a:</p>
<ul>
<li>Implementar la funcion <strong><em>ui.util.getCurrentPosition</em></strong> en nuestro Script </li>
<li>Mandar a llamar la ubicación actual con botones y, </li>
<li>Poner imagen al botón</li>
</ul>
<p>Estos tres puntos se pueden lograr de dos maneras, escribiendo todo el código o bien usando las funciones  internas de VICAL. </p>
<p><strong><em>i) Escribiendo todo el código en nuestro Script </em></strong></p>
<p>1) Lo primero que tenemos que hacer es crear dos funciones, el primero para identificar la ubicación del usuario  (current_position) y el segundo de Error</p>
<pre><code><span class="hljs-comment">// función de Ubicación actual</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">current_position</span>(<span class="hljs-params">point</span>) </span>{
  <span class="hljs-built_in">Map</span>.addLayer(point);
  <span class="hljs-built_in">Map</span>.centerObject(point, <span class="hljs-number">12</span>);
  print(point);
}
<span class="hljs-comment">//Función de Error</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Error</span>(<span class="hljs-params">error</span>) </span>{
  print(error);
}
</code></pre><p>2) Ahora creamos un <strong>Button</strong> donde le agregamos la función en la propiedad <strong><em>onClick</em></strong></p>
<pre><code><span class="hljs-keyword">var</span> ImgButton = ui.Button({ <span class="hljs-comment">//boton para ubicación del usuario</span>
  <span class="hljs-attr">label</span>: <span class="hljs-string">'Get Current Position'</span>,
  <span class="hljs-attr">onClick</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ui.util.getCurrentPosition(current_position,<span class="hljs-built_in">Error</span>)}
});
</code></pre><p>3) Agregamos el Button al Map</p>
<pre><code><span class="hljs-built_in">Map</span>.add(ImgButton)
</code></pre><p>Y el resultado es: </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664598951050/j3AQhqBX6.PNG" alt="Captura.PNG" /></p>
<p><strong><em>ii) Usando VICAL</em></strong></p>
<p>1) Para usar VICAL primero tenemos que importar dos archivos a nuestro script:</p>
<pre><code><span class="hljs-comment">// archivo para las funciones generales de VICAL</span>
<span class="hljs-keyword">var</span> imp = <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Exportaciones'</span>);
<span class="hljs-keyword">var</span> St= <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Style'</span>);
</code></pre><p>2) Usamos <strong>ui.util.getCurrentPosition</strong> para obtener la ubicación de usuario y le asignamos las funciones <strong>current_position </strong>y <em>Error</em> que están en el archivo <strong><em>imp</em></strong> de VICAL. </p>
<p>Además, como queremos que al dar clic a un botón nos centre en la ubicación actual del usuario, le asignamos la función <strong>ui.util.getCurrentPosition</strong> a la propiedad onClick del <strong><em>Button</em></strong>. </p>
<p>Se vera mejor si le ponemos un icono al <strong>Button</strong> ¿no?, para ello usamos la funcion <strong><em>IconName</em></strong> que esta en el archivo <strong><em>St</em></strong> de VICAL, para indicar cual icono queremos usar solo basta con ingresar el nombre, si desea mas información, puede consultar <a target="_blank" href="https://www.gee.hidraulicafacil.com/poner-iconosimagenes-en-button-y-label-de-google-earth-engine">esta entrada</a>. </p>
<pre><code><span class="hljs-keyword">var</span> ImgButton = ui.Button({ <span class="hljs-comment">//boton para ubicación del usuario</span>
  <span class="hljs-attr">label</span>: <span class="hljs-string">'Get Current Position'</span>,
  <span class="hljs-attr">imageUrl</span>: St.IconName(<span class="hljs-string">'my_location'</span>),
  <span class="hljs-attr">onClick</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ui.util.getCurrentPosition(imp.current_position,imp.Error)}
});
</code></pre><p>3) Ahora, solo basta con agregar el <strong>Button</strong> al Map, y cada ves que demos clic al Button se acercara a nuestra ubicación actual. </p>
<pre><code><span class="hljs-built_in">Map</span>.add(ImgButton)
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664597948277/HoO-S_KrI.PNG" alt="IconName.PNG" /></p>
<p><em>Déjanos tus comentarios. </em></p>
]]></content:encoded></item><item><title><![CDATA[Calcular 23 índices de vegetación usados en agricultura con imagenes Landsat y Sentinel]]></title><description><![CDATA[En esta entrada se va explicar como calcular rápidamente cerca de 23 índices de vegetación (IV) usados comúnmente en aplicaciones agrícolas ya sea para estimar variables como cobertura, índice de área foliar, biomasa, entre otros.  Para ello vamos a ...]]></description><link>https://www.gee.hidraulicafacil.com.mx/calcular-23-indices-de-vegetacion-usados-en-agricultura-con-imagenes-landsat-y-sentinel</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/calcular-23-indices-de-vegetacion-usados-en-agricultura-con-imagenes-landsat-y-sentinel</guid><category><![CDATA[GEE]]></category><category><![CDATA[vical]]></category><category><![CDATA[NDVI ]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Mon, 12 Sep 2022 04:45:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662955516104/17Wdt8gNw.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta entrada se va explicar como calcular rápidamente cerca de 23 índices de vegetación (IV) usados comúnmente en aplicaciones agrícolas ya sea para estimar variables como cobertura, índice de área foliar, biomasa, entre otros.  Para ello vamos a usar la herramienta <a target="_blank" href="https://inifapcenidraspa.users.earthengine.app/view/vical"><strong>VICAL</strong></a> (<a target="_blank" href="https://www.mdpi.com/2073-4395/12/7/1518">Jiménez-Jiménez et al, 2022</a>) y Google Earth Engine (GEE). La sección de ayuda de VICAL se encuentra <a target="_blank" href="https://cenidraspariego.github.io/vical_en/">aquí</a>.</p>
<p>VICAL cuenta con tres archivos que puede importar a su Script, estos son: </p>
<pre><code><span class="hljs-comment">// archivo para las colecciones de imagenes);</span>
<span class="hljs-keyword">var</span> imp <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Exportaciones'</span>);
<span class="hljs-comment">// archivo para los indices de vegetacion</span>
<span class="hljs-keyword">var</span> imp2<span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:VegetationIndex'</span>); 
<span class="hljs-comment">// archivo para las visualizaciones</span>
<span class="hljs-keyword">var</span> St<span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Style'</span>);
</code></pre><h2 id="heading-variables-generales">Variables generales</h2>
<p>Antes de importar el conjunto de colecciones de imágenes (<em>Landsat o sentinel-2 o ambos</em>) se deben definir ciertas variables que son útiles para filtrar esta colección, estos son: <strong>i)</strong> <em>un punto o polígono</em>; <strong>ii) *</strong>intervalo de fechas<em> y <strong>iii)</strong> </em>valor umbral de nubes en las imágenes*. Para este ejemplo usamos polígonos  de  unas parcelas agrícolas de un Distrito de Riego en México.
co</p>
<pre><code><span class="hljs-keyword">var</span> fecha <span class="hljs-operator">=</span> [<span class="hljs-string">'2021-01-01'</span>, <span class="hljs-string">'2022-03-18'</span>]; <span class="hljs-comment">//Fecha inicial y final </span>
<span class="hljs-comment">//polígono o punto</span>
<span class="hljs-keyword">var</span> table <span class="hljs-operator">=</span> ee.FeatureCollection(<span class="hljs-string">"projects/calcium-verbena-328905/assets/Bate"</span>); 
<span class="hljs-keyword">var</span> p_nubes<span class="hljs-operator">=</span> <span class="hljs-number">30</span>;<span class="hljs-comment">//Porcentaje de nubes</span>
</code></pre><h2 id="heading-seleccion-de-coleccion-de-imagenes">Selección de Colección de imagenes</h2>
<p>Con estas colecciones de imágenes se pueden calcular series de tiempo de diferentes índices de vegetación.</p>
<h3 id="heading-landsat">Landsat</h3>
<p>Si desea usar imágenes LandSat (4, 5, 7, 8 y 9) corregidas atmosféricamente libre de nubes se puede usar el siguiente código, donde se crea una <em>función</em> para unir las colecciones de imágenes y ordenarlos por fecha. Para ello se usa el archivo <strong><em>imp</em></strong> descrito al inicio de la entrada.  Se realiza el ajuste espectral de los sensores del Landsat, 4, 5 y 7.  </p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ColeccionImagenSR</span>(<span class="hljs-params">fecha, recorte, umbral</span>)
</span>{
  <span class="hljs-comment">// se importan las colecciones de imagenes usando el archivo "imp"</span>
  <span class="hljs-keyword">var</span> L9sr <span class="hljs-operator">=</span> imp.ColeccionLandsatSR(fecha, <span class="hljs-string">'LC09'</span>, recorte, umbral);
  <span class="hljs-keyword">var</span> L8sr <span class="hljs-operator">=</span> imp.ColeccionLandsatSR(fecha, <span class="hljs-string">'LC08'</span>, recorte, umbral);
  <span class="hljs-keyword">var</span> L7sr <span class="hljs-operator">=</span> imp.ColeccionLandsatSR(fecha, <span class="hljs-string">'LE07'</span>, recorte, umbral);
  <span class="hljs-keyword">var</span> L5sr <span class="hljs-operator">=</span> imp.ColeccionLandsatSR(fecha, <span class="hljs-string">'LT05'</span>, recorte, umbral);
  <span class="hljs-keyword">var</span> L4sr <span class="hljs-operator">=</span> imp.ColeccionLandsatSR(fecha, <span class="hljs-string">'LT04'</span>, recorte, umbral);
  <span class="hljs-comment">//Los datos de ETM y ETM+ se ajustan espectrales a OLI y OLI-2 </span>
  <span class="hljs-keyword">var</span> L7a <span class="hljs-operator">=</span> L7sr.map(imp.TMaOLI);
  <span class="hljs-keyword">var</span> L5a <span class="hljs-operator">=</span> L5sr.map(imp.TMaOLI);
  <span class="hljs-keyword">var</span> L4a <span class="hljs-operator">=</span> L4sr.map(imp.TMaOLI);
  <span class="hljs-comment">// Une las tres series de imágenes</span>
  <span class="hljs-keyword">var</span> serieT <span class="hljs-operator">=</span>L9sr.merge(L8sr).merge(L7a).merge(L5a).merge(L4a).sort(<span class="hljs-string">'system:time_start'</span>);
    <span class="hljs-keyword">return</span> serieT;
}
<span class="hljs-comment">//Se importa la colección usando la función anterior </span>
<span class="hljs-keyword">var</span> l8Sergio<span class="hljs-operator">=</span>ColeccionImagenSR(fecha, table, p_nubes);
<span class="hljs-comment">//podemos imprimir las imagenes usando la funcion print() para ver </span>
<span class="hljs-comment">//si se llevo a cabo el filtrado de la colección de imagenes (Figura 6.1) </span>
print (l8Sergio);
</code></pre><h3 id="heading-sentinel-2">Sentinel-2</h3>
<p>Si se desea usar imágenes Sentinel-2 corregidas atmosféricamente libre de nubes se puede usar el siguiente código.</p>
<pre><code><span class="hljs-comment">//Se importa la colección usando el siguiente código</span>
<span class="hljs-keyword">var</span> S2sr <span class="hljs-operator">=</span> imp.ColeccionImagenSentinelSR(fecha, table, p_nubes);
<span class="hljs-comment">//podemos imprimir las imagenes usando la funcion print() para ver </span>
<span class="hljs-comment">//si se llevo a cabo el filtrado de la colección de imagenes (Figura 6.2)</span>
print (S2sr);
</code></pre><h3 id="heading-landsat-y-sentinel-2">Landsat y Sentinel-2</h3>
<p>Si se desea usar imágenes LandSat y Sentinel-2 corregidas atmosféricamente libre de nubes se puede usar el siguiente código, los datos se ajustaron espectralmente a las bandas espectrales de Landsat 8. Se emplean las funciones descritas en la Sección anterior:</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ColeccionImagenAMBOS</span>(<span class="hljs-params">fecha, recorte, umbral</span>)
</span>{
  <span class="hljs-comment">//Se lee la función para imagenes Landsat con ajuste espectral</span>
  <span class="hljs-keyword">var</span> L8Conjunto<span class="hljs-operator">=</span>ColeccionImagenSR(fecha, recorte, umbral)
  <span class="hljs-comment">//colección entinel</span>
  <span class="hljs-keyword">var</span> S2sr <span class="hljs-operator">=</span> imp.ColeccionImagenSentinelSR(fecha, recorte, umbral);
  <span class="hljs-keyword">var</span> S2a <span class="hljs-operator">=</span> S2sr.map(imp.MSIaOLI); <span class="hljs-comment">//Se hace el ajuste espectral de sentinel-2 a Landsat</span>
  <span class="hljs-keyword">var</span> serieT <span class="hljs-operator">=</span> S2a.merge(L8Conjunto).sort(<span class="hljs-string">'system:time_start'</span>);
    <span class="hljs-keyword">return</span> serieT;
}

<span class="hljs-comment">//Se importa la colección usando el siguiente código</span>
<span class="hljs-keyword">var</span> S2B <span class="hljs-operator">=</span> ColeccionImagenAMBOS(fecha, table, p_nubes);
<span class="hljs-comment">//podemos imprimir las imagenes usando la funcion print() para ver </span>
<span class="hljs-comment">//si se llevo a cabo el filtrado de la coleccion de imagenes (Figura 6.3)</span>
print (S2sr);
</code></pre><h2 id="heading-indices-de-vegetacion">Índices de vegetación</h2>
<p>Para usar el código de índices de vegetación de <strong>VICAL</strong> se tienen que usar el archivo <strong>imp2</strong>; y se mandan a llamar estos IV usando los nombres de la columna <strong>ExpresionGEE</strong> que se muestran en la Tabla 1.</p>
<p>Por ejemplo, para calcular el NDVI (<strong>Fila 12 de Tabla 1</strong>)con la colección de imágenes LandSat y Sentinel-2 de la sección anterior se usaría el siguiente código:</p>
<pre><code><span class="hljs-comment">//Normalized Difference Vegetation Index- NDVI</span>
<span class="hljs-keyword">var</span> ivs <span class="hljs-operator">=</span> ee.ImageCollection(S2B.map(imp2.NDVI));
<span class="hljs-comment">//para imprimir y ver la banda de NDVI</span>
print (ivs);
</code></pre><p>Ahora, para visualizar en el mapa el <strong>NDVI</strong> de la primera imagen de la colección y recortado para la zona quedaría como se muestra a continuación; donde para ver la paleta de colores se utilizaría el archivo <strong>st </strong> de <strong>VICAL</strong>.  </p>
<pre><code><span class="hljs-comment">//Se obtiene el NDVI de la primera imagen en la colección </span>
<span class="hljs-keyword">var</span> iv <span class="hljs-operator">=</span> ivs.first();
<span class="hljs-comment">//Paleta de colores donde se usa el archivo st</span>
<span class="hljs-keyword">var</span> ivVis <span class="hljs-operator">=</span> {min :<span class="hljs-number">0</span>, max : <span class="hljs-number">1</span>, palette : St.paletaIV};
Map.addLayer(iv.clip(table), ivVis,<span class="hljs-string">'NDVI'</span>); <span class="hljs-comment">//Indice</span>
<span class="hljs-comment">//se centra el mapa a la zona</span>
 Map.centerObject(table, <span class="hljs-number">13</span>);
</code></pre><p>En la siguiente Figura  se muestra el mapa de NDVI para la zona de interés.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662957041703/ysj_tqJXt.png" alt="Figure74.png" class="image--center mx-auto" /></p>
<p><strong>Para revisar el código del ejemplo clic <a target="_blank" href="https://code.earthengine.google.com/299b022150c4569d006b323931f8d828">aquí</a></strong></p>
<p>Si se desea visualizar el NDVI de una imagen en particular se debe convertir a lista de después mandar a llamarlo. </p>
<p>Table 1. Nombre de los Índices de vegetación en VICAL</p>
<table> <tr><th>Número</th> <th>Indice</th> <th>Abreviatura</th><th>ExpresionGEE</th><th>Coeficientes</th>
</tr><tr> <th>1</th> <th>Atmospherically resistant vegetation index</th> <th>ARVI<em></em></th> <th>ARVI</th> <th>γ=1.0</th> </tr>
<tr> <th>1</th> <th>Atmospherically resistant vegetation index</th> <th>ARVI</th> <th>ARVI</th> <th>γ=1.0</th> </tr>
<tr> <th>2</th> <th>Adjusted transformed soil-adjusted vegetation index</th> <th>ATSAVI<em></em></th> <th>ATSAVI</th> <th></th> 
</tr><tr> <th>3</th> <th>Difference vegetation index</th> <th>DVI</th> <th>DVI</th> <th></th> 
</tr><tr> <th>4</th> <th>Enhanced vegetation index</th> <th>EVI</th> <th>EVI</th> <th>C1=6.0, C2= 7.5; L=1.0</th> 
</tr><tr> <th>5</th> <th>Enhanced vegetation index</th> <th>EVI2</th> <th>EVI2</th> <th>C1=2.4</th> 
</tr><tr> <th>6</th> <th>Green normalized difference vegetation index</th> <th>GNDVI</th> <th>GNDVI</th> <th></th> 
</tr><tr> <th>7</th> <th>Modified soil adjusted vegetation index</th> <th>MSAVI2</th> <th>MSAVI2</th> <th></th> 
</tr><tr> <th>8</th> <th>Moisture stress index</th> <th>MSI</th> <th>MSI</th> <th></th> 
</tr><tr> <th>9</th> <th>Modiﬁed triangular vegetation index</th> <th>MTVI</th> <th>MTVI</th> <th></th> 
</tr><tr> <th>10</th> <th>Modiﬁed triangular vegetation index-2</th> <th>MTVI2</th> <th>MTVI2</th> <th></th> 
</tr><tr> <th></th> <th></th> <th></th> <th></th> <th></th> 
</tr><tr> <th>11</th> <th>Normalized difference tillage index (NDTI)</th> <th>NDTI</th> <th>NDTI</th> <th></th> 
</tr><tr> <th>12</th> <th>Normalized difference vegetation index</th> <th>NDVI</th> <th>NDVI</th> <th></th> 
</tr><tr> <th>13</th> <th>Normalized difference water index</th> <th>NDWI</th> <th>NDWI</th> <th></th> 
</tr><tr> <th>14</th> <th>Optimized soil adjusted vegetation index</th> <th>OSAVI<em></em></th> <th>OSAVI</th> <th>X=0.16</th> 
</tr><tr> <th>15</th> <th>Renormalized difference vegetation index</th> <th>RDVI</th> <th>RDVI</th> <th></th> 
</tr><tr> <th>16</th> <th>Redness index</th> <th>RI</th> <th>RI</th> <th></th> 
</tr><tr> <th>17</th> <th>Ratio vegetation index</th> <th>RVI</th> <th>RVI</th> <th></th> 
</tr><tr> <th>18</th> <th>Soil adjusted vegetation index</th> <th>SAVI</th> <th>SAVI</th> <th>L=0.5</th> 
</tr><tr> <th>19</th> <th>Triangular vegetation index</th> <th>TVI</th> <th>TVI</th> <th></th> 
</tr><tr> <th>20</th> <th>Transformed soil adjusted vegetation index</th> <th>TSAVI<em></em></th> <th>TSAVI</th> <th>a= 1 ; b=0;</th> 
</tr><tr> <th>21</th> <th>Visible atmospherically resistant index</th> <th>VARI</th> <th>VARI</th> <th></th> 
</tr><tr> <th>22</th> <th>Vegetation index number or simple ratio</th> <th>VIN</th> <th>VIN</th> <th></th> 
</tr><tr> <th>23</th> <th>Wide dynamic range vegetation index</th> <th>WDRVI</th> <th>WDRVI</th> <th>α=0.2</th> 
</tr></table>


]]></content:encoded></item><item><title><![CDATA[Poner iconos/imagenes en Button y Label de Google Earth Engine]]></title><description><![CDATA[En esta entrada se muestra como como poner imagenes/iconos a los Button y Label usando el argumento imageUrl. 
Los iconos que vamos a usar se encuentran en esta liga: https://fonts.google.com/icons?icon.platform=web&icon.style=Outlined&icon.set=Mater...]]></description><link>https://www.gee.hidraulicafacil.com.mx/poner-iconosimagenes-en-button-y-label-de-google-earth-engine</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/poner-iconosimagenes-en-button-y-label-de-google-earth-engine</guid><category><![CDATA[GEE]]></category><category><![CDATA[icon]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Mon, 12 Sep 2022 03:49:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662954511329/FlSmoYEcy.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta entrada se muestra como como poner imagenes/iconos a los Button y Label usando el argumento <em>imageUrl</em>. </p>
<p>Los iconos que vamos a usar se encuentran en esta liga: <a target="_blank" href="https://fonts.google.com/icons?icon.platform=web&amp;icon.style=Outlined&amp;icon.set=Material+Icons">https://fonts.google.com/icons?icon.platform=web&amp;icon.style=Outlined&amp;icon.set=Material+Icons</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662929378442/HmEdlxyI5.PNG" alt="Camptura3.PNG" /></p>
<p>Los pasos a seguir son:
<strong>1. </strong> Si vamos a poner imagenes en diferentes partes de nuestra App de GEE, nos conviene crear una función en donde nadadas se pida el nombre del icono. Esto es:</p>
<pre><code><span class="hljs-comment">//Icons</span>
<span class="hljs-keyword">var</span> IconName<span class="hljs-operator">=</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Name</span>)</span>{ 
    <span class="hljs-keyword">return</span> <span class="hljs-string">'https://fonts.gstatic.com/s/i/materialiconsoutlined/'</span><span class="hljs-operator">+</span>Name<span class="hljs-operator">+</span><span class="hljs-string">'/v11/24px.svg'</span>
}
</code></pre><p>El nombre (<strong><em>Name</em></strong>) lo encontramos al dar clic en cualquier icono. Aparece una sección en la parte derecha donde aparece  aparecen cuatro pestañas, seleccionamos la pestaña <strong><em>web</em></strong> y aparece unas líneas de código donde solo debemos tomar, la parte que esta marcado de amarillo en la siguiente imagen.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662954011784/ChJjGdOvG.PNG" alt="Icono.PNG" class="image--center mx-auto" /></p>
<p><strong>2.</strong> Ahora, lo que resta es poner <strong><em>Button</em></strong> o <em>Label</em> en nuestra App y mandar a llamar la funcion indicando el nombre del icono en el argumento <strong><em>imageUrl</em></strong>. </p>
<pre><code><span class="hljs-comment">//Creamos un Label</span>
<span class="hljs-keyword">var</span> ImgLabel <span class="hljs-operator">=</span> ui.Label({
  <span class="hljs-built_in">value</span>: <span class="hljs-string">'Ayuda'</span>,
  imageUrl:  IconName(<span class="hljs-string">'help_outline'</span>),
})

<span class="hljs-comment">//Creamos un botón</span>
<span class="hljs-keyword">var</span> ImgButton <span class="hljs-operator">=</span> ui.Button({
  label: <span class="hljs-string">'Cerrar'</span>,
  imageUrl: IconName(<span class="hljs-string">'close'</span>),
  onClick: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{Map.add(Box.INDICE_PANEL)}
});
<span class="hljs-comment">//Creamos un Label</span>
<span class="hljs-keyword">var</span> ImgMLabel <span class="hljs-operator">=</span> ui.Label({
  <span class="hljs-built_in">value</span>: <span class="hljs-string">'Minimizar'</span>,
  imageUrl:  IconName(<span class="hljs-string">'minimize'</span>),
})
Map.add(ImgLabel)
Map.add(ImgMLabel)
Map.add(ImgButton)
</code></pre><p>El script de ejemplo se puede consultar <a target="_blank" href="https://code.earthengine.google.com/b43dbe6a3ec942f00435c5198ef80991">aquí</a>. </p>
]]></content:encoded></item><item><title><![CDATA[Descargar datos de reanálisis en Excel desde GEE para estimar la Evapotranspiración de referencia.]]></title><description><![CDATA[En GEE se pueden encontrar diferentes conjuntos de datos de reanálisis, solo es cuestión de conocer su ID para iniciar el acceso a dichos datos. Estos datos de reanálisis tienen diferentes resoluciones tanto espacial como temporal, así como diferente...]]></description><link>https://www.gee.hidraulicafacil.com.mx/descargar-datos-de-reanalisis-en-excel-desde-gee-para-estimar-la-evapotranspiracion-de-referencia</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/descargar-datos-de-reanalisis-en-excel-desde-gee-para-estimar-la-evapotranspiracion-de-referencia</guid><category><![CDATA[data analysis]]></category><category><![CDATA[GEE]]></category><category><![CDATA[GLDAS]]></category><category><![CDATA[HF Riego]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Sun, 11 Sep 2022 20:34:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662583155425/lj2wpQIwE.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En GEE se pueden encontrar diferentes conjuntos de datos de reanálisis, solo es cuestión de conocer su ID para iniciar el acceso a dichos datos. Estos datos de reanálisis tienen diferentes resoluciones tanto espacial como temporal, así como diferentes variables que se pueden emplear para diferentes aplicaciones; por ejemplo, para estimar la Evapotranspiración de referencia (ETo) con el método de FAO56-Penmman Monteith.</p>
<p>En este sentido, en esta entrada se muestra como descargar diferentes conjuntos de datos de reanálisis en GEE sobre una coordenada en particular. Vamos a descargar variables como <em>Temperatura, velocidad del viento, radiación solar, humedad especifica</em>, entre otros que se van a guardar en un archivo .CSV. Para ello se van a seguir estos sencillos pasos:</p>
<p>**1. ** Definimos las variables generales, estos son: <strong><em>intervalo de fechas</em></strong>, <strong><em>Coordenadas</em></strong> del punto en que queremos extraer los valores de las variables, y <strong>nombre del archivo</strong> que se va guardar en el Drive.</p>
<pre><code class="lang-plaintext">//---------------Valores a modificar------------------
var ainicial='2022-03-01' //Fecha inicial (respetar el formato)
var afinal='2022-05-31' //Fecha final
var latitud =  24.6375;  //Latitud en grados decimanles
var longitud = -102.7827778; //longitud en grados decimales
var Nombre='29Tepehuanes'; //Nombre
//----------------------------------------------------
</code></pre>
<p><strong>2.</strong> Definimos el conjunto de datos de reanálisis que cual deseamos descargar las variables y filtramos por fecha. En este ejemplo se usa el conjunto de datos de GLDAS-2.1: <a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/NASA_GLDAS_V021_NOAH_G025_T3H">Global Land Data Assimilation System</a></p>
<pre><code class="lang-plaintext">//para usar otro conjunto de datos o Dataset cambiar: 
//'NASA/GLDAS/V021/NOAH/G025/T3H'
var dataset = ee.ImageCollection('NASA/GLDAS/V021/NOAH/G025/T3H')
                  .filter(ee.Filter.date(ainicial, afinal));
</code></pre>
<p>Otros conjuntos de datos son:</p>
<p><a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/NOAA_CFSV2_FOR6H"><strong>CFSv2</strong></a> ('NOAA/CFSV2/FOR6H')</p>
<p><a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/NASA_NLDAS_FORA0125_H002"><strong>NLDAS-2</strong></a> ('NASA/NLDAS/FORA0125_H002')</p>
<p><a target="_blank" href="https://developers.google.com/earth-engine/datasets/catalog/NOAA_NWS_RTMA"><strong>RTMA</strong></a> ('NOAA/NWS/RTMA')</p>
<p><strong>3</strong>. Seleccionamos las variables de nuestro interés, indicando los nombre de las bandas:</p>
<pre><code class="lang-plaintext">//Air temperature, Specific humidity, Downward short-wave radiation flux, Wind speed
var VaribleS = dataset.select('Tair_f_inst', 'Qair_f_inst', 'SWdown_f_tavg', 'Wind_f_inst');
</code></pre>
<p><strong>4</strong>. Creamos un <strong><em>Feature Collection</em></strong> de <strong><em>Point</em></strong> usando las coordenadas indicadas en el <strong>Paso 1</strong></p>
<pre><code class="lang-plaintext">var Punto = ee.Feature( ee.Geometry.Point([longitud,  latitud]), {label: 'Punto'});
var westernRegions = new ee.FeatureCollection([Punto]);
</code></pre>
<p><strong>5</strong>. Extraemos los valores de las variables en las coordenadas del <strong><em>Feature Collection</em></strong> y agregamos propiedades al conjunto de datos, estas propiedades nos ayudan para agregar mas información a la tabla .CSV; propiedades como Año, mes, día y día juliano.</p>
<pre><code class="lang-plaintext">//Extraer información de las variables en el punto
var filtCol = VaribleS.filterBounds(westernRegions);
//Agregamos propiedades a los datos. 
var data = ee.FeatureCollection(filtCol.map(function(image){
  return ee.Feature(null, image.reduceRegion(ee.Reducer.mean(), westernRegions, 200))
               .set('DOY', ee.Date(image.get('system:time_start')).format('DDD', 'Etc/GMT+6'))
               .set('year', ee.Date(image.get('system:time_start')).format('yyyy','Etc/GMT+6'))
               .set('mon', ee.Date(image.get('system:time_start')).format('MM','Etc/GMT+6'))
               .set('day', ee.Date(image.get('system:time_start')).format('dd','Etc/GMT+6'));
}));
</code></pre>
<p>Debido a que los datos de reanálisis se general con hora de <em>Etc/GMT+0</em> se debe modificar la zona horaria en el código. Para este ejemplo se usa el horario de la Ciudad de México se pone <strong><em>.format('DDD', 'Etc/GMT+6'))</em></strong>.</p>
<p><strong>6</strong>. Exportamos el conjunto de datos en formato <strong><em>CSV</em></strong>. Configuramos la información que se va agregar en cada columna del documento, que este ejemplo, son: <strong><em>Coordenadas, Año, mes, día, día juliano y las variables</em></strong>.</p>
<pre><code class="lang-plaintext">Export.table.toDrive({collection: data,
                      folder: "GLDAS",
                      description: Nombre+'_GLDAS', 
                      fileFormat: 'CSV', 
                      selectors: [longitud,  latitud,'year','mon','day','DOY','Tair_f_inst', 'Qair_f_inst', 'SWdown_f_tavg', 'Wind_f_inst']})
</code></pre>
<p>Si nos interesa mostrar el punto en el mapa de GEE, usamos el siguiente codigo</p>
<pre><code class="lang-plaintext">//agregar al mapa
var COLOR = {
  CITY: 'ff0000',
};
Map.addLayer(Punto, {color: COLOR.CITY}, 'point');
Map.centerObject(Punto, 7);
</code></pre>
<p><strong>7.</strong> Ejecutamos el Script [clic en Run] desde el editor de código de GEE, inmediatamente aparecerá del lado izquierdo marcado en amarillo la pestaña Tasks.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662927726269/I-0KdP-5V.PNG" alt="Captura.PNG" class="image--center mx-auto" /></p>
<p>En la pestaña Tasks aparece el nombre del archivo que indicamos en el código, solo le damos clic en (RUN) y aparecerá una ventana donde nos pregunta de nuevo el nombre y la carpeta donde se va guardar el archivo en nuestro DRIVE. El tiempo que tarda en descargarse nuestro archivo depende de la cantidad de datos que le hemos pedido a GEE, sin embargo, cuando ya hemos dado clic en RUN solo nos queda esperar y sin ningún problema podemos cerrar las ventanas o apagar el equipo, cuando se termine de descargar los datos aparecerá nuestro archivo en Drive.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662927855821/44_d2Eu-c.PNG" alt="Captura2.PNG" class="image--center mx-auto" /></p>
<p>Después de que nuestro archivo este completo lo podemos abrir y descargar de drive. Para calcular la Evapotranspiración de referencia con estos datos podemos usar <a target="_blank" href="https://www.hidraulicafacil.com.mx/p/extension-hf-riego.html">HFRiego- Excel</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662928003746/AO121RH6n.PNG" alt="Captura3.PNG" class="image--center mx-auto" /></p>
<p><strong>8.</strong> Aquí dejamos los script de GEE para los conjuntos RTMA, GLDAS, CFSv2, NLDAS, con estos Script puede descargar datos de variables útiles para calcular la ETo: <a target="_blank" href="https://code.earthengine.google.com/bb3bd9fb817b6b62b40ed594a3e20695">RTMA</a><a target="_blank" href="https://code.earthengine.google.com/5acebeb46cd4010ef23535c458fb0605">GLDAS</a><a target="_blank" href="https://code.earthengine.google.com/07050f70624f75e436465546031bb890">CFSv2</a><a target="_blank" href="https://code.earthengine.google.com/33057c7bf2be90338679c69c49a65144">NLDAS</a></p>
]]></content:encoded></item><item><title><![CDATA[Evapotranspiración con datos MODIS desde Google Earth Engine]]></title><description><![CDATA[Es este ejemplo se muestra un script para obtener datos de Evapotranspiración (ET) donde se usa el conjunto de datos evapotranspiración/flujo de calor latente [MOD16A2 versión 6]
(https://developers.google.com/earth-engine/datasets/catalog/MODIS_006_...]]></description><link>https://www.gee.hidraulicafacil.com.mx/evapotranspiracion-con-datos-modis-desde-google-earth-engine</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/evapotranspiracion-con-datos-modis-desde-google-earth-engine</guid><category><![CDATA[ET]]></category><category><![CDATA[MODIS]]></category><category><![CDATA[GEE]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Fri, 02 Sep 2022 05:24:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662094210848/JbY8lqin4.PNG" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Es este ejemplo se muestra un script para obtener datos de <strong><em>Evapotranspiración (ET)</em></strong> donde se usa el conjunto de datos evapotranspiración/flujo de calor latente [MOD16A2 versión 6]
(https://developers.google.com/earth-engine/datasets/catalog/MODIS_006_MOD16A2) que es un producto compuesto de 8 días con una resolución espacial de 500 metros/pixel y contiene información desde el 2001.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662094460175/xXmdJ29mi.png" alt="image.png" /></p>
<p>El algoritmo utilizado para la recopilación de productos de datos <strong><em>MOD16</em></strong> se basa en la lógica de la ecuación de Penman-Monteith, incluye entradas de datos de reanálisis diarios junto con productos de datos de detección remota MODIS, como la dinámica de las propiedades de la vegetación, el albedo y la cobertura terrestre. </p>
<p>En los siguientes pasos vamos a mostrar como calcular la ET acumulada en 2021 para México.</p>
<ol>
<li><p>Se importan algunos script de la herramientas VICAL, útil  para la visualización. </p>
<pre><code><span class="hljs-keyword">var</span> imp <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Exportaciones'</span>);
<span class="hljs-keyword">var</span> St <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">'users/InifapCenidRaspa/VICAL:Style'</span>);
</code></pre></li>
<li><p>Se importa la colección de imagenes y, se define el intervalo (fecha inicial y final) y la banda a utilizar (<strong>ET</strong>). </p>
<pre><code><span class="hljs-keyword">var</span> collection <span class="hljs-operator">=</span> ee.ImageCollection(<span class="hljs-string">"MODIS/006/MOD16A2"</span>)
.filterDate(<span class="hljs-string">'2021-01-01'</span>, <span class="hljs-string">'2021-12-31'</span>)
.select(<span class="hljs-string">'ET'</span>);
</code></pre><p>Las bandas con las que cuenta este Dataset se muestran en la siguiente imagen, de estas bandas, los valores de píxel para las dos capas de evapotranspiración (ET y PET) son la suma de los ocho días dentro del período compuesto.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662094970990/sgj4gLn-d.png" alt="image.png" /></p>
<ol>
<li>Definimos la región, que este caso seria México, por tanto usamos el archivo disponible en GEE de <em>Polígonos de límite internacional</em>. Para cambiar el país se debe cambiar las dos letras <strong>MX</strong> por el código de país, para conocer el este código puede visitar la dirección <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_FIPS_country_codes">https://en.wikipedia.org/wiki/List_of_FIPS_country_codes</a>. Por ejemplo para Perú seria [<strong>PE</strong>]<pre><code><span class="hljs-keyword">var</span> region <span class="hljs-operator">=</span> ee.FeatureCollection(<span class="hljs-string">"USDOS/LSIB_SIMPLE/2017"</span>)
          .filter(ee.Filter.eq(<span class="hljs-string">'country_co'</span>, <span class="hljs-string">'MX'</span>));<span class="hljs-comment">// 'MX' de México</span>
</code></pre></li>
</ol>
<ol>
<li><p>Calculamos la ET y asignamos el estadísticos, que en este caso seria <strong>SUMA</strong>. Posteriormente recortamos con respecto a nuestra región de interés.<br />Después del paso anterior multiplicamos los valores obtenidos por 0.1 que es la escala con la que nos da GEE la ET de este DataSet.</p>
<pre><code><span class="hljs-keyword">var</span> composite <span class="hljs-operator">=</span>collection.sum().clip(region);
<span class="hljs-keyword">var</span> composite <span class="hljs-operator">=</span>composite.multiply(<span class="hljs-number">0</span><span class="hljs-number">.1</span>);
</code></pre></li>
<li><p>Definimos la paleta de visualización y  la leyenda que se mostrara en el mapa</p>
<pre><code><span class="hljs-keyword">var</span> paletaCl <span class="hljs-operator">=</span> {min: <span class="hljs-number">0</span>, max: <span class="hljs-number">1300</span>, palette:St.ETO};
<span class="hljs-keyword">var</span> panL <span class="hljs-operator">=</span> imp.Leyenda(<span class="hljs-string">'ET (mm)'</span>, paletaCl);
</code></pre></li>
<li>Finalmente, se pida a GEE que muestre el mapa con los valores de ET <pre><code>Map.centerObject(region)<span class="hljs-comment">//centrar a la region</span>
Map.addLayer(composite, paletaCl, <span class="hljs-string">' Suma_ET'</span>);
Map.add(panL);<span class="hljs-comment">// leyenda</span>
</code></pre></li>
<li>Resultado 
En la siguiente Figura se muestra el resultado de la implementación del código. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662096075631/mrKVGbSHa.png" alt="image.png" /></li>
</ol>
<p>Revisa el código: <a target="_blank" href="https://code.earthengine.google.com/2fb626db113b2d2efad82d05060c1bef">https://code.earthengine.google.com/2fb626db113b2d2efad82d05060c1bef</a></p>
<p>si quiere exportar el resultado en formato Raster puede escribir el siguiente codigo</p>
<pre><code><span class="hljs-selector-tag">Export</span><span class="hljs-selector-class">.image</span><span class="hljs-selector-class">.toDrive</span>({
  <span class="hljs-attribute">image</span>: composite,
  <span class="hljs-attribute">description</span>: <span class="hljs-string">'ET_Export'</span>,
  <span class="hljs-attribute">folder</span>: <span class="hljs-string">'earthengine'</span>,
  <span class="hljs-attribute">fileNamePrefix</span>: <span class="hljs-string">'ET'</span>,
  <span class="hljs-attribute">scale</span>: <span class="hljs-number">500</span>,
  <span class="hljs-attribute">maxPixels</span>: <span class="hljs-number">1</span>e10
})
</code></pre>]]></content:encoded></item><item><title><![CDATA[Google Earth Engine en Ingeniería de riego]]></title><description><![CDATA[En esta sección de blog se presentan algunas herramientas, ejemplo y script de uso de imagenes satelitales y datos de reanálisis en Google Earth Engine (GEE), estas herramientas y ejemplos están enfocados únicamente para aplicaciones útiles en ingeni...]]></description><link>https://www.gee.hidraulicafacil.com.mx/google-earth-engine-en-ingenieria-de-riego</link><guid isPermaLink="true">https://www.gee.hidraulicafacil.com.mx/google-earth-engine-en-ingenieria-de-riego</guid><category><![CDATA[Riego]]></category><dc:creator><![CDATA[SERGIO IVÁN JIMÉNEZ JIMÉNEZ]]></dc:creator><pubDate>Tue, 30 Aug 2022 18:39:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1661921584939/V3ShHdW8X.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En esta sección de blog se presentan algunas <em>herramientas, ejemplo y script</em> de uso de imagenes satelitales y datos de reanálisis en Google Earth Engine (GEE), estas herramientas y ejemplos están enfocados únicamente para aplicaciones útiles en <strong><em>ingeniería de riego</em></strong>. </p>
<h1 id="heading-herramientas"><strong>Herramientas </strong></h1>
<p><strong>VICAL:</strong> Es una herramienta (Figura 1) útil para calcular 23 índices de vegetación (empleados comúnmente en aplicaciones agrícolas) de cualquier polígono del mundo con imágenes satelitales Landsat (Resolución espacial  de 30 m) y Sentinel-2 (resolución espacial de 10 m) (Jiménez-Jiménez et al., 2022). Para ver la sección de ayuda de VICAL clic <a target="_blank" href="https://cenidraspariego.github.io/vical_en/">aquí</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662092894408/ELphiRoI1.png" alt="Figure52.png" class="image--center mx-auto" />
Figura 1. Calculo de NDVI en VICAL de una zona de riego en México</p>
<p><strong>geeSEBAL</strong> (Figura 2): Es una implementación de código abierto del Algoritmo de Balance de Energía de Superficie para la Tierra (SEBAL) usando GEE usando imagenes Landsat (Laipelt et al. 2021). Esto quiere decir, que con esta herramienta se puede estimar la Evapotranspiración (ET) de cualquier parte del mundo a partir de la ecuación de balance de energía (Rn – G = LE + H), donde LE, Rn, G y H son flujo de calor latente, radiación neta, flujo de calor del suelo y flujo de calor sensible, respectivamente (Bastiaanssen, 1995; Bastiaanssen et al., 1998a, 1998b). </p>
<p>Figura 2. Calculo de la ET con geeSEBAL</p>
<h1 id="heading-2-script"><strong>2. Script </strong></h1>
<p>Algunos de estos Script son elaborados por Hidráulica Fácil y otros adaptados de otros autores. 
Evapotranspiración con datos Modis: Es una Script donde se usa el conjunto de datos evapotranspiración/flujo de calor latente MOD16A2 versión 6 que es un producto compuesto de 8 días con una resolución espacial de 500 metros/pixel. El algoritmo utilizado para la recopilación de productos de datos MOD16 se basa en la lógica de la ecuación de Penman-Monteith, que incluye entradas de datos de reanálisis meteorológico diario junto con productos de datos de detección remota MODIS, como la dinámica de las propiedades de la vegetación, el albedo y la cobertura terrestre. 
Actualmente está calculado para México pero se puede adaptar a cualquier país modificando la línea 15 del Script. Además, se calcula la ET acumulada en todo 2021, sí por ejemplo se desea calcular la ET media en cualquier año, solo debe indicar la fecha (línea 7 y 8) y reemplazar en la línea 12 del código [.sum() por .mean()]. Para modificar el código clic aquí. </p>
<p>Figura 3. ET acumulado de 2021 para México con datos MODIS</p>
<p>Si desea descargar el archivo Raster con los datos acumulado de ET de México de 2021 clic aqui: https://drive.google.com/file/d/1GSaM53dfem_DyUpM_HypjtlzFaWhRmSH/view?usp=sharing </p>
<p>Datos de reanálisis para estimar la Evapotranspiración de referencia (ET0): Son cuadro Script para descargar datos de reanálisis o cuadriculados para estimar la ET0, en este sentido, se descargan datos de Temperatura, humedad especifica, Radiación solar y velocidad del viento en un rango de fechas. Los datos se descargan a su DRIVE en formato CSV .
Código para descargar datos de RTMA se puede obtener en la siguiente liga (Figura 4): https://code.earthengine.google.com/bb3bd9fb817b6b62b40ed594a3e20695
Código para descargar datos de GLDAS: https://code.earthengine.google.com/5acebeb46cd4010ef23535c458fb0605
Código para descargar datos de CFSv2:
https://code.earthengine.google.com/07050f70624f75e436465546031bb890
Código para descargar datos de NLDAS:
https://code.earthengine.google.com/33057c7bf2be90338679c69c49a65144</p>
<p>Debido a que los datos de reanálisis se general con hora de Etc/GMT+0 se debe modificar la zona horaria en la línea 32 a 35. Por ejemplo para Ciudad de México se pone .format('DDD', 'Etc/GMT+6')). </p>
<p>Para conocer acerca de las bases de datos y su resolución espacial puede consultar la entrada del blog [Descargar datos climáticos de reanálisis para estimar Evapotranspiración de referencia]</p>
<p>Figura 4. Datos descargados de RTMA en formato CSV</p>
<h1 id="heading-literatura-citada">Literatura citada</h1>
<blockquote>
<p>Bastiaanssen, W.G.M., 1995. Regionalization of surface flux densities and moisture indicators in composite terrain: a remote sensing approach under clear skies in Mediterranean climates. Dr. thesis, Wageningen Agric. Univ. Wageningen Netherlands. SC-DLO, Wageningen.</p>
<p>Bastiaanssen, W.G.M., Menenti, M., Feddes, R.A., Holtslag, A.A.M., 1998a. A remote sensing surface energy balance algorithm for land (SEBAL): 1. Formulation. J. Hydrol. 212–213, 198–212.</p>
<p>Bastiaanssen, W.G.M., Pelgrum, H., Wang, J., Ma, Y., Moreno, J.F., Roerink, G.J., van der Wal, T., 1998b. A remote sensing surface energy balance algorithm for land (SEBAL): 2. Validation. J. Hydrol. 212–213, 213–229.</p>
<p>Jiménez-Jiménez, S. I., Marcial-Pablo, M. de J., Ojeda-Bustamante, W., Sifuentes-Ibarra, E., Inzunza-Ibarra, M. A., &amp; Sánchez-Cohen, I. (2022). VICAL: Global Calculator to Estimate Vegetation Indices for Agricultural Areas with Landsat and Sentinel-2 Data. Agronomy 2022, Vol. 12, Page 1518, 12(7), 1518. https://doi.org/10.3390/AGRONOMY12071518</p>
<p>Laipelt, L., Henrique Bloedow Kayser, R., Santos Fleischmann, A., Ruhoff, A., Bastiaanssen, W., Erickson, T.A., Melton, F., 2021. Long-term monitoring of evapotranspiration using the SEBAL algorithm and Google Earth Engine cloud computing. ISPRS Journal of Photogrammetry and Remote Sensing 178, 81–96. https://doi.org/10.1016/J.ISPRSJPRS.2021.05.018</p>
</blockquote>
]]></content:encoded></item></channel></rss>