<jupyter_start><jupyter_text>Mapa de concentraciones de dióxido de nitrógeno de Sentinel 5P - TROPOMIElaborado por: __<NAME>__  1 Instalaciones previas Archivos que ayudan a procesar data espacial.<jupyter_code>! sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
! sudo apt-get update
! sudo apt-get install libudunits2-dev libgdal-dev libgeos-dev libproj-dev
! sudo apt-get install libprotobuf-dev protobuf-compiler libv8-dev libjq-dev<jupyter_output><empty_output><jupyter_text>https://stackoverflow.com/questions/40374441/python-basemap-module-impossible-to-import<jupyter_code># Instalar basemap
! sudo apt-get install geos
! sudo pip3 install https://github.com/matplotlib/basemap/archive/master.zip
# Necesario para trabajar con archivos netCDF
! pip install netCDF4<jupyter_output><empty_output><jupyter_text>2 Descarga de los datos Sitio de datos de la NASA para este ejercicio: [GES DISC](https://disc.gsfc.nasa.gov/)Pasos para poder descargar datos de GES DISC en Google Colab:1. Crear tu cuenta de https://earthdata.nasa.gov/2. Obtener permiso para poder descargar con tu cuenta de GES DISC https://disc.gsfc.nasa.gov/earthdata-login3. Seguir los pasos indicados dependiendo de su entorno de ejecución https://disc.gsfc.nasa.gov/information/howto?title=How%20to%20Download%20Data%20Files%20from%20HTTPS%20Service%20with%20wget. En la sección 2.1 se describirá la forma directa de descargar estos datos en el entorno de Google Colab. Archivos a descargar (encontrados manualmente en [Earth Data](https://search.earthdata.nasa.gov/search)):- https://tropomi.gesdisc.eosdis.nasa.gov/data//S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/2019/334/S5P_OFFL_L2__NO2____20191130T174805_20191130T192935_11043_01_010302_20191206T203339.nc (30-11-2019)- https://tropomi.gesdisc.eosdis.nasa.gov/data//S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/2020/076/S5P_OFFL_L2__NO2____20200316T174758_20200316T192929_12561_01_010302_20200319T151817.nc (16-03-2020) Tutoriales que ayudaron al desarrollo del presente ejercicio:- https://www.youtube.com/watch?v=mqpArrCvw9c (Manejo de archivos netCDF con datos de Sentinel 5P - TROPOMI)  2.1 Archivos necesarios para descargar datos de GES DISC<jupyter_code># En Google Colab se requiere crear los archivos .netrc y .urs_cookies en /root/
! touch /root/.netrc
# donde <uid> es su nombre de usuario y <password> es su contraseña de
# inicio de sesión de Earthdata sin corchetes
! echo "machine urs.earthdata.nasa.gov login <uid> password <password>" >> /root/.netrc
! chmod 0600 /root/.netrc
! touch /root/.urs_cookies<jupyter_output><empty_output><jupyter_text>2.2 Descarga de los archivos a utilizar<jupyter_code># Descargar en el directorio de trabajo actual

# Data de NO2 del 30-11-2019 (aprox. 434 MB)
! wget --load-cookies /root/.urs_cookies --save-cookies /root/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition https://tropomi.gesdisc.eosdis.nasa.gov/data//S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/2019/334/S5P_OFFL_L2__NO2____20191130T174805_20191130T192935_11043_01_010302_20191206T203339.nc

# Data de NO2 del 16-03-2020 (aprox. 433 MB)
! wget --load-cookies /root/.urs_cookies --save-cookies /root/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition https://tropomi.gesdisc.eosdis.nasa.gov/data//S5P_TROPOMI_Level2/S5P_L2__NO2____HiR.1/2020/076/S5P_OFFL_L2__NO2____20200316T174758_20200316T192929_12561_01_010302_20200319T151817.nc<jupyter_output><empty_output><jupyter_text>3 Graficar los valores de los archivos netCDF  3.1 Librerías necesarias<jupyter_code>from netCDF4 import Dataset
import numpy as np
from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>3.2 Elaborar un gráfico de emisiones de $NO_2$ en Estados Unidos durante el 30-11-2019.<jupyter_code># Leer archivo netCDF
ncd_file = Dataset('S5P_OFFL_L2__NO2____20191130T174805_20191130T192935_11043_01_010302_20191206T203339.nc', 'r')
print(ncd_file)
# Ver las variables disponibles
ncd_file.groups['PRODUCT'].variables.keys()
# Conocer los valores de dióxido de nitrogeno
ncd_file.groups['PRODUCT'].variables['nitrogendioxide_tropospheric_column']
# Guardar los datos en variables lat, long y no2_data
lat = ncd_file.groups['PRODUCT'].variables['latitude'][0, :, :]
lon = ncd_file.groups['PRODUCT'].variables['longitude'][0, :, :]
no2_data = ncd_file.groups['PRODUCT'].variables['nitrogendioxide_tropospheric_column'][0, :, :]
# Extrayendo el valor de relleno
fill_value = ncd_file.groups['PRODUCT'].variables['nitrogendioxide_tropospheric_column']._FillValue
fill_val = fill_value*1000000
# Reemplazo de los valores de relleno/valores perdidos por 'nan'
no2_em = np.array(no2_data)*1000000
no2_em[no2_em == fill_val] = np.nan
no2_data = no2_em
# Modificar el tamaño del gráfico
plt.figure(figsize=(10,8))

# Crear un basemap
m = Basemap(projection = 'cyl', resolution = 'i', 
            llcrnrlat = -90, 
            urcrnrlat = 90,
            llcrnrlon = -180,
            urcrnrlon = 180)  

# Añadir bordes las costas
m.drawcoastlines(linewidth = 1)
# Añadir bordes de los países
m.drawcountries(linewidth = 1)

# Elaborar la barra de colores
cmap = plt.cm.get_cmap('jet')
cmap.set_under('w')
m.pcolormesh(lon, lat, no2_data, latlon = True, vmin =0 , vmax = 500, cmap = cmap)
color_bar = m.colorbar()
color_bar.set_label('μ.mol / m$^{2}$')
plt.autoscale()

# Delimitar la visualización
axes = plt.gca()
axes.set_xlim([-98, -75])
axes.set_ylim([24, 46])

# Añadir texto al gráfico
plt.text(
    x = -98, y = 23, s = 'Elaborado por: <NAME>',
    fontdict= {
        'family': 'serif',
        'color':  'black',
        'weight': 'normal',
        'size': 12
})

# Añadir título
plt.title('Emisiones de NO$_{2}$ sobre Estados Unidos - 30-11-2019')

fig = plt.gcf()

# Guardar el gráfico en png
fig.savefig(
    fname = 'NO2_30112019.png', dpi = 300
)

plt.show()<jupyter_output><empty_output><jupyter_text>3.3 Elaborar un gráfico de emisiones de $NO_2$ en Estados Unidos durante el 16-03-2020.<jupyter_code># Leer archivo netCDF
ncd_file = Dataset('S5P_OFFL_L2__NO2____20200316T174758_20200316T192929_12561_01_010302_20200319T151817.nc', 'r')

# Guardar los datos en variables lat, long y no2_data
lat = ncd_file.groups['PRODUCT'].variables['latitude'][0, :, :]
lon = ncd_file.groups['PRODUCT'].variables['longitude'][0, :, :]
no2_data = ncd_file.groups['PRODUCT'].variables['nitrogendioxide_tropospheric_column'][0, :, :]

# Extrayendo el valor de relleno
fill_value = ncd_file.groups['PRODUCT'].variables['nitrogendioxide_tropospheric_column']._FillValue
fill_val = fill_value*1000000

# Reemplazo de los valores de relleno/valores perdidos por 'nan'
no2_em = np.array(no2_data)*1000000
no2_em[no2_em == fill_val] = np.nan
no2_data = no2_em

# Modificar el tamaño del gráfico
plt.figure(figsize=(10,8))

# Crear un basemap
m = Basemap(projection = 'cyl', resolution = 'i', 
            llcrnrlat = -90, 
            urcrnrlat = 90,
            llcrnrlon = -180,
            urcrnrlon = 180)  

# Añadir bordes las costas
m.drawcoastlines(linewidth = 1)
# Añadir bordes de los países
m.drawcountries(linewidth = 1)

# Elaborar la barra de colores
cmap = plt.cm.get_cmap('jet')
cmap.set_under('w')
m.pcolormesh(lon, lat, no2_data, latlon = True, vmin =0 , vmax = 500, cmap = cmap)
color_bar = m.colorbar()
color_bar.set_label('μ.mol / m$^{2}$')
plt.autoscale()

# Delimitar la visualización
axes = plt.gca()
axes.set_xlim([-98, -75])
axes.set_ylim([24, 46])

# Añadir texto al gráfico
plt.text(
    x = -98, y = 23, s = 'Elaborado por: <NAME>',
    fontdict= {
        'family': 'serif',
        'color':  'black',
        'weight': 'normal',
        'size': 12
})

# Añadir título
plt.title('Emisiones de NO$_{2}$ sobre Estados Unidos - 16-03-2020')

fig = plt.gcf()

# Guardar el gráfico en png
fig.savefig(
    fname = 'NO2_16032020.png', dpi = 300
)

plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1182999117164838, 'fraction_numerical': 0.08525665279354269, 'mean_word_length': 4.9894259818731115, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 38, 'https://': 12, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '284861', 'license': 'MIT', 'n_tokens_mistral': 3577, 'n_tokens_neox': 3167, 'n_words': 650, 'path': 'analisis_espacial/003_sentinel_5p_tropomi.ipynb', 'repo_name': 'ErikSeras/usos_r_python', 'size': '7941'}