
Movimiento sobre una ruta en google Earth

Primero es necesario crear una cuanta para tener acceso a la API de ecobici, se realiza de forma gratuita aquí:
https://www.ecobici.cdmx.gob.mx/es/informacion-del-servicio/open-data
Una vez obtenido obtendrán los client_id y client_secret los cuales es necesario que sustituyan en el código abajo mostrado.
Además, pueden descargar los archivos históricos de ecobici. En el código yo utilizo el correspondiente al mes de octubre de 2020 (2020-10.csv) Figura 1.
Figura 1. Descargar datos históricos.
Resultado obtenido:
Código:
import csv
import requests
from datetime import datetime
def read_bases_csv(name_base):
with open(name_base, encoding='latin-1') as file_infoFM:
read_csv = csv.reader(file_infoFM, delimiter=',')
rows = [ row for row in read_csv ]
return rows
def obtiene_coord_biciEstacion(col_id_biciEstacion, col_fecha, col_hora, bici_movilidad, estaciones_api):
linea = []
for mov in bici_movilidad:
for estacion in estaciones_api:
if int(mov[col_id_biciEstacion]) == estacion['id']:
dd, mm, yyyy = mov[col_fecha].split('/')
hh, mn, ss = mov[col_hora].split(':')
estacion['when'] = f"{yyyy}-{mm}-{dd}T{hh if len(hh) > 1 else '0'+str(hh)}:{mn}:{ss}Z"
estacion['datetime'] = datetime(int(yyyy), int(mm), int(dd),
int(hh), int(mn), int(ss))
linea.append(
(estacion['location']['lon'],
estacion['location']['lat'],
estacion['datetime'],
estacion['when']))
break
return linea
client_id = TU_CLIENT_ID
client_secret = tU_CLIENT_SECRET
bici_movilidad = read_bases_csv('2020-10.csv')
id_bici = 10041
bici_movilidad = list(filter(lambda x: x[2]!='NULL' and int(x[2])==id_bici, bici_movilidad[1::]))
a_token = requests.get(f'https://pubsbapi-latam.smartbike.com/oauth/v2/token?client_id={client_id}&client_secret={client_secret}&grant_type=client_credentials')
token = a_token.json()['access_token']
stations = requests.get(f'https://pubsbapi-latam.smartbike.com/api/v1/stations.json?access_token={token}')
estaciones_api = stations['stations']
coords_incio = obtiene_coord_biciEstacion(3, 4, 5, bici_movilidad, estaciones_api)
coords_final = obtiene_coord_biciEstacion(6, 7, 8, bici_movilidad, estaciones_api)
ruta = coords_incio + coords_final
ruta.sort(key=lambda x: x[2]) # Ordena cronológicamente
with open(f'ruta_bici_{id_bici}.kml', 'w') as file_kml:
when = ''
coord = ''
for punto in ruta:
when += f' <when>{punto[-1]}</when>\n'
coord += f' <gx:coord>{punto[0]} {punto[1]} 0</gx:coord>\n'
file_kml.write(f'''<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Folder>
<Style id="track_n">
<IconStyle>
<scale>2.0</scale>
<Icon>
<href>http://maps.google.com/mapfiles/kml/shapes/cycling.png</href>
</Icon>
</IconStyle>
<LineStyle>
<color>99ffac59</color>
<width>6</width>
</LineStyle>
</Style>
<Placemark>
<styleUrl>#track_n</styleUrl>
<gx:Track>
{when}
{coord}
</gx:Track>
</Placemark>
</Folder>
</kml>''')