# Representación de un mapa en Python a partir de notas de Obsidian Buenas, este es un pequeño proyecto que fue inspirado por este artículo de Giulia Ulpiani https://doi.org/10.1016/j.scitotenv.2020.141727 que es una inspiración de cómo quiero enfocar mi propio artículo (cuyo tema está relacionado pero no del todo, pero me ENCANTA cómo lo enfoca) En este caso se monta unos mapitas como estos para poner donde son sus estudios ![imagen](https://hackmd.io/_uploads/rJIxfOqPZe.png) ## Resultado (esto a finales de enero del 26) ![Pasted image 20260114232130](https://hackmd.io/_uploads/B198IuqwWl.png) ## Proceso Primero lo que necesito son los _datos_ y estos son, por un lado un CSV con las coordenadas de los países que he encontrado aquí: https://datos.canarias.es/catalogos/estadisticas/dataset/paises-del-mundo-en-2016-delimitaciones-territoriales-para-fines-estadisticos-en-canarias/resource/36c79c62-04af-4fbf-88a7-2764303ae61c :::info He tenido que cambiarle el nombre a algunos países para ser consistente como, por ejemplo, Macedonia del Norte que no estaba atualizado. ::: Lo siguiente es sacar los datos de obsidian ### Parte del obsidian Por un lado tengo mis artículos con características donde yo pongo en cada artículo la institución principal del mismo. Por ejemplo: ![imagen](https://hackmd.io/_uploads/r1SBw_qv-x.png) Luego dentro de la institución pongo el país: ![imagen](https://hackmd.io/_uploads/Hytww_cDbe.png) Por último tengo todo puesto en una base del obsidian: Esta vista está claro, con un filtro de un tag ![imagen](https://hackmd.io/_uploads/r1tnv_qP-g.png) Y se ve tal que así. ![imagen](https://hackmd.io/_uploads/S1BpDu9DZg.png) Para que saque el país (que lo tiene que sacar de la institución) tengo que hacerle una pequeña Query tal que así: ![imagen](https://hackmd.io/_uploads/rk5Mu_cDZe.png) ``` note["institución principal"].asFile().properties.país ``` Esto lo explico más en detalle en [Cómo hacer una base de datos con elementos enlazados a otras notas](/7Hw9TTSbQ666bsFzW6zoSw) Ahora la última parte (que a mí no me pareció tan obvia) es sacar el csv haciendo clic derecho en el número de resultados y darle a exportar. ![imagen](https://hackmd.io/_uploads/BJ3kFOcPZx.png) A partir de ahí ya tenemos un CSV que podemos contar cosas. ## La parte de Python Para esto he tenido que utilizar las siguientes librerías: csv para tratar con el csv de países y el de obsidian. cartopy para el tema de mapas. Matplotlib porque es el que saca al final la imagen. ### Código Esta versión del código está un poco sucia pero funcionar funcionuvo. Ahora voy a trabajar en otro ejemplo más limpio. :::spoiler ``` import csv import cartopy.crs as ccrs import matplotlib.pyplot as plt countriesFile = "paises_2016_geom_10.csv" dataFile = "Análisis_países.csv" countries = dict() with open(countriesFile, encoding='utf-8') as file:     header = True     #vuelta de rellenar la lista de países     for line in file:         if header:             header = False             continue     # nombre de país, latitud, longitud         row = line.split(",")         # luego necesito longitud, latitud así que aquí lo giro         try:             countries[row[1]] = [ float(row[4][:-1]), float(row[3])]         except:             pass #print(countries) csvCountries = dict() with open(dataFile, encoding="utf-8") as file:     reader = csv.reader(file,dialect="excel")     header = True     for row in reader:         if header:             header = False             continue     # nombre,País de la institución,localización estudio,institución principal         if row[1] not in csvCountries:             csvCountries[row[1]] = 1         else:             csvCountries[row[1]] += 1 #print(csvCountries) printData = [] for country, size in csvCountries.items():     if country not in countries:         raise Exception("country not found", country)         #países cambiados: Rumanía, Macedonia del Norte, Corea del Sur     #nombre de país, longitud, latitud, tamaño del punto     printData.append([country, countries[country], size]) print(printData) ax = plt.axes(projection=ccrs.PlateCarree()) ax.coastlines() ax.set_global() lats = [] lons = [] sizes = [] names = [] for country in printData:     lons.append(country[1][0])     lats.append(country[1][1])     sizes.append(((country[2]+3.5)*2)**2)     ax.text(country[1][1], country[1][0]-2, country[0],         horizontalalignment='center', size = "x-small",          transform=ccrs.PlateCarree())     ax.scatter(country[1][1], country[1][0],                ((country[2]+4)*2)**2, #el tamaño es complicado                color= "red",                alpha= country[2]/7+0.1, #he puesto como máximo 6 y le puse luego una base                ) plt.show() ``` ::: ### Errores que me han pasado * Se me olvidó que el csv te lee strings, si lo pasas a coordenadas que son números, hay que convertir el tipo! ## Referencias: Ulpiani, G. (2021). On the linkage between urban heat island and urban pollution island: Three-decade literature review towards a conceptual framework. Science of The Total Environment, 751, 141727. https://doi.org/10.1016/j.scitotenv.2020.141727