Corredor ecológico para lepidópteras en zonas urbanas, entre el cerro Mokoron y UNAN, Managua.
POR: Joxual J. Araque Pérez.
Descripción del Proyecto El proyecto consiste en la aplicación de herramientas SIG (Sistemas de Información Geográfica) y visualización de datos con diversas librerías “Pandas, GeoPandas, Matplotlib”. Se analiza una base de datos de mariposas para establecer patrones de conectividad ecológica entre zonas de bosques, las cuales son remanentes para diferentes especies de lepidópteros. La práctica de Python para el manejo de archivos de imágenes raster y shapefiles nos permite obtener de manera sencilla y rápida la visualización de los datos, generando imágenes. Además, el análisis de datos de una tabla de Excel permite comparar de manera general la estructura de una comunidad con otra en relación al número de individuos y especies.
Antecedentes El número de publicaciones referentes a comunidades de insectos en paisajes en proceso de fragmentación es muy limitado Maes et al. (2019), Hernández et al. (2003). Los parches o remanentes de bosques maduros pueden albergan mayor diversidad de especies, siendo prioridad establecer circuitos para conectarlos y que el flujo de fauna aumente (Araque,2024).
Los cambios en el uso del suelo y la falta de planificación territorial incrementan la fragmentación de los bosques, lo que lleva al aislamiento de las especies en parches. La presión de la urbanización amenaza la biodiversidad al reducir progresivamente los pocos parches que actúan como hábitats (Merckx et al., 2018). Proponer corredores ecológicos mediante el uso de circuitos, resistencias, costos y distancias es una alternativa efectiva para mitigar los efectos negativos del aislamiento de las especies en parches. Se han estudiado modelos de conectividad ecológica en áreas urbanas, y algunas de las aproximaciones para implementarlos se basan en la identificación de costos y distancias a través de una matriz de resistencias en un ráster, utilizando algoritmos que identifican rutas y cuantifican la distancia mínima y máxima (coste acumulado) entre núcleos previamente seleccionados (Balbi et al., 2020). Algunas especies de Lepidopteros se desplazan por espacios mayores por ende requerirán mayor cobertura boscosa, la variabilidad de las especies arbórea será un factor clave para encontrar especies generalista y especialista (Araque, 2023). Uno de los libros muy completo referentes a script para la librería de Matplotlist es el de Hunter, et al (2017), siendo aptos para generar mapas y visualización de datos de manera general para lo cual muestra ejemplos de como realizar dichos objetos. Shapely es un paquete de Python para la manipulación y análisis de objetos geométricos en el plano cartesiano. Utiliza la biblioteca de geometría de código abierto GEOS (el motor de PostGIS y un port de JTS). Shapely envuelve las geometrías y operaciones de GEOS para proporcionar tanto una interfaz de geometría rica en funciones para geometrías singulares (escalar) como funciones universales de alto rendimiento (ufuncs) de NumPy para operaciones. Shapely no se centra principalmente en los formatos de serialización de datos o sistemas de coordenadas, pero puede integrarse fácilmente con paquetes que sí lo hacen (GeoPandas, 2024).
Descripción del Problema Las especies de Mariposas están amenazadas debido a la reducción de hábitats, la perdida de bosque favorecerá a la perdida de especies y comunidades, siendo determinante crear estrategias que vinculen el intercambio genético de las especies. Son pocas las herramientas y artículos científicos existentes para la conectividad ecológica en zonas urbanas, esto no permite priorizar remanentes y programas de reforestación o planificación del uso de la tierra, razón por la cual cada vez se deteriorarán mas estos pequeños reductos de bosques. Crear una herramienta que concientice y permita evaluar posibles corredores en zonas urbanas permitirá mejorar el flujo genético de las especies de mariposas además que no lleguen al peligro de extinción, inclusive no solo ayudara a los insectos también podrá verificar y priorizar posibles áreas de cruce de fauna entre carretera o calles y crear un programa para evitar accidentes, debido a que muchos insectos pueden afectar a motorizados en la via.
Objetivos -Evaluar un corredor ecológico para mariposas en zonas urbanas entre Mokoron y Unan, Managua. Objetivos específicos: -Evaluar la composición de los lepidópteros entre las dos áreas. -Realizar
se requieren las librerias pandas y matplotlib, las cuales serviran¶
para generar el primer grafico de estadisticas basicas.Se realiza un llamado del excell de la base de datos.
import pandas as pd
import matplotlib.pyplot as plt
# CARGO MI EXCELL
file_path = 'C:/Users/Bio.araque/Documents/PAPER - JAIME/ESPECIES.xlsx' # Reemplaza con la ruta correcta
data = pd.read_excel(file_path, sheet_name='MOKORON')
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-1-5714fd09036f> in <cell line: 6>() 4 # CARGO MI EXCELL 5 file_path = 'C:/Users/Bio.araque/Documents/PAPER - JAIME/ESPECIES.xlsx' # Reemplaza con la ruta correcta ----> 6 data = pd.read_excel(file_path, sheet_name='MOKORON') /usr/local/lib/python3.10/dist-packages/pandas/io/excel/_base.py in read_excel(io, sheet_name, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, date_format, thousands, decimal, comment, skipfooter, storage_options, dtype_backend) 476 if not isinstance(io, ExcelFile): 477 should_close = True --> 478 io = ExcelFile(io, storage_options=storage_options, engine=engine) 479 elif engine and engine != io.engine: 480 raise ValueError( /usr/local/lib/python3.10/dist-packages/pandas/io/excel/_base.py in __init__(self, path_or_buffer, engine, storage_options) 1494 ext = "xls" 1495 else: -> 1496 ext = inspect_excel_format( 1497 content_or_path=path_or_buffer, storage_options=storage_options 1498 ) /usr/local/lib/python3.10/dist-packages/pandas/io/excel/_base.py in inspect_excel_format(content_or_path, storage_options) 1369 content_or_path = BytesIO(content_or_path) 1370 -> 1371 with get_handle( 1372 content_or_path, "rb", storage_options=storage_options, is_text=False 1373 ) as handle: /usr/local/lib/python3.10/dist-packages/pandas/io/common.py in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options) 866 else: 867 # Binary mode --> 868 handle = open(handle, ioargs.mode) 869 handles.append(handle) 870 FileNotFoundError: [Errno 2] No such file or directory: 'C:/Users/Bio.araque/Documents/PAPER - JAIME/ESPECIES.xlsx'
# Filtrar datos por áreas
MOKORON = data[data['AREA'] == 'MOKORON']
UNAN = data[data['AREA'] == 'UNAN']
# Trampas colocadas
TRAMPAS = ['TRAMPA 1', 'TRAMPA 2', 'TRAMPA 3', 'TRAMPA 4', 'TRAMPA 5', 'TRAMPA 6', 'TRAMPA 7']
# Estadísticas generales para MOKORON
stats_mokoron = MOKORON[TRAMPAS].describe().transpose()
# Estadísticas generales para UNAN
stats_unan = UNAN[TRAMPAS].describe().transpose()
# Crear gráficos de boxplot para comparar las estadísticas
fig, ax = plt.subplots(2, 1, figsize=(10, 12))
# Gráfico de boxplot para MOKORON
ax[0].boxplot(MOKORON[TRAMPAS].values, labels=TRAMPAS, showmeans=True, meanline=True)
ax[0].set_title('Capturas por Trampa - MOKORON')
ax[0].set_xlabel('Trampa')
ax[0].set_ylabel('Capturas')
ax[0].grid(axis='y')
# Gráfico de boxplot para UNAN
ax[1].boxplot(UNAN[TRAMPAS].values, labels=TRAMPAS, showmeans=True, meanline=True, patch_artist=True, boxprops=dict(facecolor='lightgreen', color='black'), whiskerprops=dict(color='black'), medianprops=dict(color='black'))
ax[1].set_title('Capturas por Trampa - UNAN')
ax[1].set_xlabel('Trampa')
ax[1].set_ylabel('Capturas')
ax[1].grid(axis='y')
plt.tight_layout()
plt.show()
# Mostrar estadísticas generales
print("Estadísticas generales para MOKORON:")
print(stats_mokoron)
print("\nEstadísticas generales para UNAN:")
print(stats_unan)
pip install geopandas shapely rasterio
import geopandas as gpd
import matplotlib.pyplot as plt
MANAGUA = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\managua.shp'
MAN = gpd.read_file(MANAGUA) #decidi colocar MAN COMO MANAGUA
# Visualizar managua en shape
MAN.plot()
# Cargar el shapefile
shapefile_path = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\UNAN.shp'
UNAN = gpd.read_file(shapefile_path)
# Visualizar el shapefile con color y etiquetas
fig, ax = plt.subplots(figsize=(5, 5))
UNAN.plot(ax=ax, color='green', edgecolor='black')
plt.show()
import rasterio
from rasterio.plot import show
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# Cargar el shapefile de Calles
shape_calles = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\Calles.shp'
CALLES = gpd.read_file(shape_calles)
# Cargar el shapefile de Calles
shape_nodos = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\NODOS1.shp'
NODOS = gpd.read_file(shape_nodos)
# Cargar el shapefile de UNAN
shape_unan = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\UNAN.shp'
UNAN = gpd.read_file(shape_unan)
# Cargar el raster
CONECTIVIDAD = r'C:\Users\Bio.araque\Documents\PAPER - JAIME\modelos-mokoton\UNION CORREDOR.tif'
raster = rasterio.open(CONECTIVIDAD)
# Crear una figura y un conjunto de ejes
fig, ax = plt.subplots(figsize=(10, 10))
# Configurar colores y opacidades para el raster
cmap_raster = 'turbo'
alpha = 0.7
# Mostrar el raster con colormap Turbo
show(raster, ax=ax, cmap=cmap_raster, alpha=alpha, transform=ax.transData)
# Visualizar los shapefiles
CALLES.plot(ax=ax, color='black', edgecolor='black', linewidth=2, label='Calles')
UNAN.plot(ax=ax, color='black', edgecolor='black', linewidth=1, alpha= 0.5, label='UNAN')
NODOS.plot(ax=ax, color='Green', edgecolor='black', linewidth=1, alpha= 0.5, label='UNAN')
# Añadir leyenda del raster
cbar = fig.colorbar(ax.collections[1], ax=ax, orientation='vertical', fraction=0.046, pad=0.04)
cbar.set_label('Valor Raster')
# Ajustar título y etiquetas de los ejes
plt.title("Conectividad por medio de Circuitos y Nodos")
plt.xlabel("Longitud")
plt.ylabel("Latitud")
# Mostrar el plot
plt.show()