En un post anterior ya demostré cómo usar Nominatim en Python (usando el módulo Geopy) para geocodificar un nombre de ubicación en coordenadas de longitud y latitud.
En este post quiero mostrar cómo se puede geocodificar una lista de localizaciones utilizando Geopy.
Para ello, empezaré utilizando el módulo Pandas para leer un simple y breve archivo csv que contiene nombres de lugares especificados por entradas en una columna de país, ciudad y calle:
# importando pandas
import pandas
# leer el archivo csv que contiene los datos de localización
data = pandas.read_csv("locations.csv")
# mostrar la tabla del archivo csv
data
| country | city | street | metric | |
|---|---|---|---|---|
| 0 | Germany | Berlin | Alexanderplatz 1 | 10 |
| 1 | Germany | Berlin | Dircksenstrasse 2 | 5 |
| 2 | Germany | Berlin | Rathausstrasse 1 | 16 |
Comprobemos el tipo de dato de los datos tabulares:
type(data)
pandas.core.frame.DataFrame
Ahora que he leído los datos voy a geocodificar las localizaciones y asignar los coordiantes geocodificados a una nueva columna. Como los datos son un DataFrame de pandas, puedo hacer uso del método apply() para aplicar el servicio de geocodificación de Nominatim correspondiente a cada dirección del dataframe.
Primero tengo que convertir todas las entradas de la columna en direcciones, añadiendo éstas en una nueva columna en el DataFrame tabular. A continuación, puedo crear un objeto de servicio que haga referencia al servicio Geopy de Nominatim y aplicar ese servicio a cada ubicación, devolviendo el resultado geocodificado en una nueva columna adicional:
# fusionar el país, la ciudad y la calle en una sola cadena de direcciones data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "] # importar el módulo geopy import geopy # crear un objeto de servicio service = geopy.Nominatim(user_agent = "myGeocoder") # geocodificar cada dirección, utilizando el método .apply() para pandas DataFrame from geopy.extra.rate_limiter import RateLimiter data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1)) # mostrar datos tabulares data
| country | city | street | metric | addresses | coordinates | |
|---|---|---|---|---|---|---|
| 0 | Germany | Berlin | Alexanderplatz 1 | 10 | Germany, Berlin, Alexanderplatz 1 | (Alexanderstraße, Spandauer Vorstadt, Mitte, B… |
| 1 | Germany | Berlin | Dircksenstrasse 2 | 5 | Germany, Berlin, Dircksenstrasse 2 | (2, Dircksenstraße, Luisenstadt, Mitte, Berlin… |
| 2 | Germany | Berlin | Rathausstrasse 1 | 16 | Germany, Berlin, Rathausstrasse 1 | (1-14, Rathausstraße, Spandauer Vorstadt, Mitt… |
Comprobemos el tipo de datos de las entradas de la columna «coordinates»:
type(data["coordinates"][0])
geopy.location.Location
Comprobemos el tipo de datos de las entradas de la columna «coordenadas»:
data[«coordenadas»][0].longitud
13.4144809
datos[«coordenadas»][0].latitud
52.5228654
Ahora calculo las puntuaciones «medias» de longitud y latitud. Quiero utilizarlos como punto central de mi mapa de marcadores de ubicación Folium:
# extrayendo los valores de longitud y latitud a listas separadas
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
# calcular los valores medios de longitud y latitud
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
# mostrar el resultado
print("meanLong = " + str(meanLong) + "; meanLat = " + str(meanLat))
meanLong = 13.412910038576356; meanLat = 52.52100943333333
[longs,lats]
[[13.4144809, 13.4136431, 13.410606115729072], [52.5228654, 52.5208149, 52.519348]]
Utilizando el módulo Folium, ahora puedo crear marcadores para las localizaciones y trazarlas en los mosaicos del mapa:
# import folium
import folium
# crear un mapa base centrado en Berlín
mapObj = folium.Map(location = [meanLat,meanLong], zoom_start = 15)
# crear objeto marcador para Berlín, uno por uno para cada ubicación en los datos DataFrame
for i in range(0,data.shape[0]): # .shape[0] for Pandas DataFrame is the number of rows
# crear un marcador para el lugar i
markerObj = folium.Marker(location = [lats[i],longs[i]])
# añadir marcador al mapa
markerObj.add_to(mapObj)
# mostrar mapa
mapObj


Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)

Leave a Reply