Construyendo un Mapa Topográfico de Nepal Utilizando Python

Mapa Topográfico de Nepal con Python

Introducción

¿Alguna vez te has preguntado cómo la topografía de tu país influye en el desarrollo económico y político? Los mapas topográficos, que son mapas de la superficie terrestre que utilizan líneas de contorno para su visualización, ¡pueden ayudar a responder estas preguntas! Utilizaremos Python para crear un mapa topográfico de Nepal, un país con un entorno topográfico interesante. Aprenderás cómo leer datos geoespaciales que describen la topografía de un país, cómo interpretar estos datos y cómo visualizarlos. El mapa resultante se puede combinar con otros datos de interés a niveles subnacionales muy desagregados para comprender cómo la topografía de un país influye en su desarrollo económico y/o político. ¡Esta publicación del blog te enseñará cómo generar una herramienta realmente interesante que puede informar políticas y desarrollo del sector privado!

Objetivos de aprendizaje

  • Adquirir habilidades en técnicas de análisis de datos para datos de elevación digital.
  • Aprender a utilizar datos geoespaciales y herramientas de análisis relacionadas en Python.
  • Obtener conocimientos sobre técnicas de cartografía.
  • Desarrollar habilidades en visualización efectiva de datos para la comunicación.
  • Comprender la importancia de la elevación en la desigualdad y la pobreza.

Este artículo fue publicado como parte del Data Science Blogathon.

¿Qué son los mapas topográficos?

Los mapas topográficos son mapas de la superficie terrestre que utilizan líneas de contorno para su visualización. Los mapas topográficos son una herramienta valiosa para navegar por terrenos desconocidos y sirven como insumos para la planificación urbana y la gestión de desastres. A menudo se utilizan para comprender el contexto espacial de políticas o proyectos del sector privado en torno al desarrollo de infraestructura, para identificar áreas vulnerables a desastres naturales o con acceso limitado a servicios esenciales como educación, atención médica e infraestructura, o para la gestión de recursos naturales. En última instancia, estos mapas pueden servir como insumo para la toma de decisiones basada en evidencia. En esta publicación del blog, utilizaremos Python para crear un mapa topográfico de Nepal, un país con un entorno topográfico realmente interesante.

Descripción de los datos

Para generar nuestro mapa, nos basaremos en los datos publicados por el United States Geological Survey (USGS). El USGS es una agencia científica del gobierno federal de Estados Unidos que genera datos e investigaciones sobre recursos naturales, geología, geografía, recursos hídricos y riesgos naturales. Para acceder a su página de datos, escribe “USGS Data” en Google o haz clic en el enlace que te dirige a su Earth Explorer. El Earth Explorer es una herramienta en línea y un portal de datos que te permite buscar, acceder y descargar una amplia gama de datos científicos sobre la Tierra. Debes configurar una cuenta e iniciar sesión para utilizar completamente los datos.

Descarga de datos

Esta publicación del blog utilizará Nepal como ejemplo debido a sus características topográficas únicas. Nepal tiene una de las topografías más desafiantes e interesantes del mundo. 8 de las 14 montañas de más de 8,000 m están en Nepal (Trekking Trail Nepal), y el país está dividido en tres regiones topográficas muy diferentes: las montañas, colinas y Terai (o llanuras) (DHS). Si bien estas características hacen que el país sea único e interesante, algunas investigaciones muestran que la topografía de Nepal dificulta la conexión del país, la prestación de servicios esenciales a su población y plantea riesgos y barreras para un desarrollo sostenible.

Con este fin, filtraremos Nepal en los Criterios de búsqueda, como se indica en la imagen a continuación. Una vez que seleccionamos Nepal, seleccionamos nuestro conjunto de datos de interés. Para hacerlo, haz clic en la pestaña Data Sets y elige Digital Elevation. Hay varias opciones de Datos de Elevación Digital, y aunque podrías utilizar varios de estos conjuntos de datos, utilizaremos los datos GMTED2010 (Global Multi-resolution Terrain Elevation Data 2010). Estos datos proporcionan cobertura global del terreno de la Tierra a múltiples resoluciones (desde 7.5 segundos de arco (aproximadamente 250 metros) hasta 30 segundos de arco (aproximadamente 1 kilómetro)). Se generan a partir de datos de teledetección espacial y aérea, que incluyen altimetría satelital, imágenes estereoscópicas y mapas topográficos.

Una vez que elijas los datos, haz clic en la pestaña Results. Ahora puedes descargar los datos haciendo clic en el símbolo con las opciones de descarga. También puedes mostrar los datos a través del ícono de huella. Descargamos los datos en su resolución más alta (7.5 segundos de arco). Es importante destacar que, para cubrir todo Nepal, debemos descargar dos mosaicos (partes) diferentes de los datos subyacentes y combinarlos más tarde. Verás que el conjunto de datos resultante está en formato tif, lo que indica datos raster.

Preparar los Datos con Herramientas de Análisis Geoespacial en Python

Python proporciona varias herramientas para el análisis geoespacial. En esta publicación del blog, confiamos en la biblioteca Rasterio que permite leer y escribir datos raster geoespaciales (datos en cuadrícula). Comencemos y leamos el primer mosaico (parte) de los datos que descargamos previamente en nuestro Jupyter Notebook:

#importar bibliotecas relevantes (después de instalarlas)
import rasterio
import matplotlib.pyplot as plt
import numpy as np

#Leer los datos y mostrar la forma del conjunto de datos
archivo = rasterio.open(r'ruta\10n060e_20101117_gmted_mea075.tif')
conjunto_datos = archivo.read()
print(conjunto_datos.shape)

También vamos a cargar el segundo mosaico y combinarlos fusionándolos. Para ello, seguimos las técnicas estándar de lectura y manipulación de datos raster en Python de la siguiente manera:

#Cargar el segundo conjunto de datos y mostrar la forma del conjunto de datos
archivo2 = rasterio.open(r'ruta\30n060e_20101117_gmted_mea075.tif')
conjunto_datos2 = archivo2.read()
print(conjunto_datos2.shape)


#Combinar ambos conjuntos de datos
from rasterio.merge import merge
from rasterio.plot import show

#Crear una lista vacía
archivos_fuentes_para_mosaico = []

#Agregar los archivos a la lista
archivos_fuentes_para_mosaico.append(archivo)
archivos_fuentes_para_mosaico.append(archivo2)
archivos_fuentes_para_mosaico

#Combinar ambos archivos
mosaico, trans_salida = merge(archivos_fuentes_para_mosaico)

# Copiar metadatos
metadatos_salida = archivo.meta.copy()

#Actualizar metadatos
metadatos_salida.update(
    {"driver": "GTiff",
        "height": mosaico.shape[1],
        "width": mosaico.shape[2],
        "transform": trans_salida,
    }
)

#Escribir en el destino
# Escribir el mosaico raster en el disco
ruta_salida = r"ruta\Nepal_Mosaic.tif"

with rasterio.open(ruta_salida, "w", **metadatos_salida) as destino:
        destino.write(mosaico)

#Abrir los datos raster combinados
archivo_mosaico = rasterio.open(ruta_salida)

#Leer los datos
conjunto_datos_mosaico = archivo_mosaico.read()
print(archivo_mosaico.shape)

#Mostrar los datos
plt.imshow(conjunto_datos_mosaico[0], cmap='Spectral')
plt.show()

Datos de Elevación del Terreno a Nivel Global de Resolución Múltiple

Ahora tenemos un conjunto de datos combinado de los Datos de Elevación del Terreno a Nivel Global de Resolución Múltiple 2010 GMTED2010 para toda Nepal, pero el archivo también cubre grandes partes del área circundante que no forman parte de Nepal. Vamos a restringir el área a Nepal utilizando un shapefile de Nepal. Utilizaremos un shapefile con los límites de los países del mundo. Puede descargar este conjunto de datos aquí. Luego, recortaremos los datos raster y el shapefile utilizando la función “mask”. Solo usaremos la primera fila del shapefile y la columna de geometría. El resultado de esta operación se almacena en “clipped_array”, que es los datos raster recortados, y “clipped_transform”, que representa la información de transformación del raster recortado.

import geopandas as gpd
from shapely.geometry import mapping
from rasterio import mask as msk

#Cargar el shapefile con los límites de los países del mundo
df = gpd.read_file(r'ruta/world-administrative-boundaries.shp')

#Restringir a Nepal
nepal = df.loc[df.name=="Nepal"]
nepal.head()

#Recortar los datos
clipped_array, clipped_transform = msk.mask(archivo_mosaico, [mapping(nepal.iloc[0].geometry)], crop=True)

#

Hay un problema que queda. Los valores de sin datos en los datos raster son altamente perjudiciales. Por lo tanto, distorsionarían la visualización de nuestro mapa, ya que forman parte del rango de valores.

Comprender el Problema

Vamos a solucionar este problema de la siguiente manera, como se describe en esta publicación del blog:

  • Vamos a construir una función que se encargue de los valores de sin datos. Construimos un parámetro de sin datos para especificar el valor considerado “sin datos” en el array recortado. En este caso, se establece en (np.amax(clipped_array[0]) + 1), lo que significa que es igual al valor máximo en el array recortado más uno. Este valor se considerará como el valor de “sin datos”.
  • Ajustamos el array recortado agregando el valor absoluto del valor mínimo en el array recortado al primer banda (índice 0) del array recortado. Este paso asegura que todos los valores en el array recortado sean no negativos.
  • También calculamos el rango de valores del array recortado. Se suma el valor máximo y el valor absoluto del valor mínimo en el array recortado. La variable “value_range” contendrá el rango de valores calculado.
  • Usamos un diccionario de valores de color construido manualmente basado en uno existente (el de “seismic”) y definimos nuestro color de fondo para los valores de “sin datos”.
  • En el último paso, mostramos el mapa con el nuevo rango de colores llamado “new_seismic”.
#Investiguemos los valores sin datos

nodata_value = file_mosaic.nodata 
print("Valor sin datos:", nodata_value)
#Valor sin datos: -32768.0

#Cambiar el valor sin datos a uno más que la elevación máxima
def clip_raster(gdf, img):
    clipped_array, clipped_transform = msk.mask(img, [mapping(gdf.iloc[0].geometry)], crop=True)
    clipped_array, clipped_transform = msk.mask(img, [mapping(gdf.iloc[0].geometry)],
                                                           crop=True, nodata=(np.amax(clipped_array[0]) + 1))
    clipped_array[0] = clipped_array[0] + abs(np.amin(clipped_array))
    value_range = np.amax(clipped_array) + abs(np.amin(clipped_array))
    return clipped_array, value_range

nepal_topography, value_range = clip_raster(nepal, file_mosaic)


#Verifiquemos que esto funcionó
print(value_range)


#Demos a los valores sin datos un nuevo color de fondo
from matplotlib import cm
from matplotlib.colors import ListedColormap,LinearSegmentedColormap

#Sísmico
new_seismic = cm.get_cmap('seismic', 8828)

#Definir el color de fondo
background_color = np.array([0.9882352941176471, 0.9647058823529412, 0.9607843137254902, 1.0])

#Usar el mapa de colores
newcolors = new_seismic(np.linspace(0, 1, 8828))

# Agregar el color de fondo como la última fila en el arreglo newcolors.
newcolors = np.vstack((newcolors, background_color))

#Usar el nuevo mapa de colores
new_seismic = ListedColormap(newcolors)

#Crear el mapa final y guardarlo
plt.figure(figsize=(10,10))
c = plt.imshow(nepal_topography[0], cmap = new_seismic)
clb = plt.colorbar(c, shrink=0.4)
clb.ax.set_title('Elevación (metros)',fontsize=10)

plt.savefig(r'ruta\Mapa_Topográfico_Nepal.png', bbox_inches='tight')
plt.show()

¡Voilá! Tenemos un mapa topográfico de Nepal que indica claramente las diferentes elevaciones en el país y las tres zonas topográficas.

Conclusión

Aprendiste a generar un mapa topográfico en Python utilizando datos geoespaciales del Servicio Geológico de los Estados Unidos (USGS). También aprendiste la importancia de cuidar los valores faltantes en el conjunto de datos final para su visualización.

Los responsables de políticas o los profesionales ahora pueden utilizar este mapa para análisis adicionales, como combinarlo con otros mapas, como mapas de pobreza o desastres naturales, para analizar si existe alguna conexión. ¡Hemos generado una herramienta valiosa que puede informar la toma de decisiones basada en evidencia en política!

Puntos clave

  • Los mapas topográficos son herramientas útiles para la toma de decisiones basada en evidencia.
  • La topografía y la elevación juegan un papel crucial en la planificación urbana, la prestación de servicios y la desigualdad.
  • Python tiene herramientas útiles para analizar datos geoespaciales.
  • Cuidar los valores sin datos en este tipo de datos es crucial para la visualización.
  • La visualización de datos geoespaciales puede generar información valiosa a niveles desagregados.

Espero que hayas encontrado este artículo informativo. No dudes en contactarme en LinkedIn. ¡Conectemos y trabajemos juntos para aprovechar los datos para un cambio positivo.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Detecta cualquier cosa que desees con UniDetector

El aprendizaje profundo y la IA han avanzado notablemente en los últimos años, especialmente en los modelos de detecc...

Inteligencia Artificial

Limpieza con TidyBot

Un equipo multinstitucional de ingenieros acopló un brazo robótico móvil a un modelo de visión y a un gran modelo de ...

Inteligencia Artificial

La IA podría introducir mensajes secretos en memes

Los científicos de la computación afirman haber creado el primer algoritmo para ocultar mensajes de manera invisible ...

Inteligencia Artificial

IA en roles íntimos novias y terapeutas

Este artículo es una breve descripción del campo de la Inteligencia Emocional Artificial y las posibles aplicaciones ...