Usar en Python¶
Con requests
¶
Normalizar una entidad¶
import requests
import urllib
API_BASE_URL = "https://apis.datos.gob.ar/georef/api/"
def get_similar(endpoint, nombre, **kwargs):
kwargs["nombre"] = nombre
url = "{}{}?{}".format(API_BASE_URL, endpoint, urllib.urlencode(kwargs))
return requests.get(url).json()[endpoint]
provincias = get_similar("provincias", "San Juan")
[{
u'centroide': {
u'lat': -30.865368,
u'lon': -68.889491
},
u'id': u'70',
u'nombre': u'San Juan'
}]
Normalizar varias entidades¶
def get_similar_bulk(endpoint, nombres):
"""Normaliza una lista de nombres de alguna de las entidades geográficas."""
# realiza consulta a la API
data = {
endpoint: [
{"nombre": nombre, "max": 1} for nombre in nombres
]}
url = API_BASE_URL + endpoint
results = requests.post(
url, json=data, headers={"Content-Type": "application/json"}
).json()
# convierte a una lista de "resultado más probable" o "vacío" cuando no hay
parsed_results = [
single_result[endpoint][0] if single_result[endpoint] else {}
for single_result in results["resultados"]
]
return parsed_results
provincias = get_similar_bulk("provincias", ["pxa", "sant fe"])
[
{},
{
u'centroide': {
u'lat': -30.706927,
u'lon': -60.949837
},
u'id': u'82',
u'nombre': u'Santa Fe'
}
]
Enriquecer coordenadas con las unidades territoriales que las contienen¶
def get_territorial_units(ubicaciones):
"""Pide las unidades territoriales que contienen a c/punto de una lista de coordenadas."""
# realiza consulta a la API
endpoint = "ubicacion"
data = {
"ubicaciones": [
{"lat": ubicacion["lat"], "lon": ubicacion["lon"], "aplanar": True}
for ubicacion in ubicaciones
]}
url = API_BASE_URL + endpoint
results = requests.post(
url, json=data, headers={"Content-Type": "application/json"}
).json()
# convierte a una lista de "resultado más probable" o "vacío" cuando no hay
parsed_results = [
single_result[endpoint] if single_result[endpoint] else {}
for single_result in results["resultados"]
]
return parsed_results
ubicaciones = get_territorial_units([
{"lat": -32.9477132, "lon": -60.6304658},
{"lat": -34.6037389, "lon": -58.3815704}
])
[
{
u'departamento_id': u'30105',
u'departamento_nombre': u'Victoria',
u'lat': -32.9477132,
u'lon': -60.6304658,
u'municipio_id': u'82210',
u'municipio_nombre': u'Rosario',
u'provincia_id': u'30',
u'provincia_nombre': u'Entre Ríos'
},
{
u'departamento_id': u'02007',
u'departamento_nombre': u'Comuna 1',
u'lat': -34.6037389,
u'lon': -58.3815704,
u'municipio_id': None,
u'municipio_nombre': None,
u'provincia_id': u'02',
u'provincia_nombre': u'Ciudad Autónoma de Buenos Aires'
}
]
Con pandas
¶
Consultar listas de referencia¶
Todas las consultas a la API en formato CSV, se pueden leer fácilmente a un pandas.DataFrame
. De ahí se pueden tomar listas de referencia para distintas unidades territoriales.
import pandas as pd
provincias = pd.read_csv("https://apis.datos.gob.ar/georef/api/provincias?formato=csv")
provincia_id provincia_nombre
14 Córdoba
22 Chaco
26 Chubut
6 Buenos Aires
10 Catamarca
30 Entre Ríos
34 Formosa
42 La Pampa
62 Río Negro
70 San Juan
78 Santa Cruz
82 Santa Fe
94 Tierra del Fuego, Antártida e Islas del Atlánt...
38 Jujuy
54 Misiones
2 Ciudad Autónoma de Buenos Aires
18 Corrientes
46 La Rioja
66 Salta
86 Santiago del Estero
50 Mendoza
58 Neuquén
74 San Luis
90 Tucumán
Enriquecer coordenadas¶
def add_territorial_units(df, column_lat, column_lon):
"""Agrega unidades territoriales que contienen coordenadas a un DataFrame.
Args:
df (pandas.DataFrame): Un DataFrame que tiene coordenadas.
column_lat (str): Nombre de la columna que tiene latitud.
column_lon (str): Nombre de la columna que tiene longitud.
Returns:
pandas.DataFrame: DataFrame original aumentado con unidades territoriales que contienen a las coordenadas.
"""
# toma una lista de coordenadas únicas (no repetidas)
coordinates = df[[column_lon, column_lat]].rename(
columns={column_lon: "lon", column_lat: "lat"}
).drop_duplicates().to_dict("records")
# crea DataFrame de unidades territoriales que contienen a las coordenadas
ubicaciones = pd.DataFrame(get_territorial_units(coordinates))
# agrega las unidades territoriales al DataFrame original
df_with_territorial_units = df.merge(
ubicaciones, "left",
left_on=[column_lon, column_lat],
right_on=["lon", "lat"]
)
# elimina columnas de coordenadas repetidas, dejando las originales
return df_with_territorial_units.drop(["lon", "lat"], axis=1)
# descarga un CSV con coordenadas de aeropuertos
df = pd.read_csv("https://servicios.transporte.gob.ar/gobierno_abierto/descargar.php?t=aeropuertos&d=detalle", sep=";")
# Agrega unidades territoriales que contienen coordenadas a un DataFrame
df_with_territorial_units = add_territorial_units(df, "longitud", "latitud")
tipo denominacion latitud longitud elev \
Aeródromo CORONEL BOGADO/AGROSERVICIOS -60.57066 -33.27226 44.0
Aeródromo GENERAL ACHA -64.61351 -37.40164 277.0
Aeródromo ARRECIFES/LA CURA MALAL -60.14170 -34.07574 37.0
Aeródromo PUERTO DESEADO -65.90410 -47.73511 82.0
Aeródromo BANDERA/AGROSERVICIOS DOÑA TERESA -62.26462 -28.85541 75.0
departamento_id departamento_nombre municipio_id municipio_nombre \
82084 Rosario 823393 Coronel Bogado
42154 Utracán 420133 General Acha
06077 Arrecifes 060077 Arrecifes
78014 Deseado None None
86077 General Taboada None None
provincia_id provincia_nombre
82 Santa Fe
42 La Pampa
06 Buenos Aires
78 Santa Cruz
86 Santiago del Estero