Movimiento sobre una ruta en google Earth

Movimiento sobre una ruta en google Earth

mario.hernandez 22 November 2020

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 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.

ecobici datos historicos

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>''')