Cómo hice mi Yandex. Transporte con horarios y autobuses.



Publicado por Mikhail Aksenov, Desarrollador .NET, DataArt


Como empezó todo


En el otoño de 2014, hubo buenas noticias de que Yandex.Transport se lanzó en Voronezh, que muestra el movimiento de autobuses y trolebuses. Fue genial en la parada de autobús abrir un horario y descubrir que su autobús funcionará en 5 minutos.

Pero después de un par de meses, todo salió de acuerdo con un escenario completamente predecible. Como todo el transporte en Voronezh desde el tranvía hasta el minibús funciona en efectivo, cada conductor está interesado en transportar la mayor cantidad de pasajeros posible. Como resultado, organizan carreras entre ellos.

Los conductores utilizaron el nuevo servicio para seguirse en el mapa, adelantando y cortando a los competidores en el camino. Algunos comenzaron a perder ingresos, comenzaron a quejarse a los propietarios de la ruta y se dirigieron a personas que vendían equipos con GLONASS y GPS y enviaban datos sobre los movimientos de automóviles a Yandex. A pedido de los propietarios de la flota, dejaron de enviar información y los autobuses comenzaron a desaparecer inmediatamente del mapa. Ahora hay un poco más de ellos, pero esto es aún mucho menos que en la realidad.



Para aquellos que son demasiado flojos para leer más, les propongo un informe en video sobre este tema:

Por lo demás, describiré el proyecto en forma de texto.

¿Dónde obtener los datos?


Al mismo tiempo, en Voronezh hay un lugar donde se recopilan todos los datos: el Centro para la Organización del Tráfico Vial (DPC). Tienen una aplicación web grande y pesada en su sitio con JavaScript insostenible y otros artefactos, mientras que todo viene con solicitudes POST y nada se almacena en caché. Usando este sitio en sí, puede poner fácilmente un servicio que recopila datos sobre el movimiento de los autobuses.

Había una opción que le permite pinchar en el mapa y averiguar cuándo vendrá el autobús y qué será. Siempre que se detenga aproximadamente (± 50 metros). En el menú, podría abrir una lista de rutas y ver exactamente a dónde van los autobuses, pero había un problema: conducían de manera extraña. Por ejemplo, a lo largo de Koltsovskaya, una calle en el centro donde no se puede acelerar especialmente, el autobús avanzó y retrocedió a una velocidad de aproximadamente 200 km / h.


Por que Python


Elegí Python porque es genial, las baterías están agrupadas, etc. Y 3.6 porque hay formato para los literales de cadena, mecanografía, eso es todo. Veamos lo que básicamente utilicé:

  • Muchos se quejaron de que conducir el nombre exacto de una parada con todo tipo de signos de puntuación es muy difícil. Entonces me di cuenta de la posibilidad de búsqueda difusa y creé la primera prueba unitaria para ello.
  • Todo el sistema está alojado en Heroku. Es gratis, porque no tengo una base de datos. Espero sobrevivir con la base de datos del centro de datos. Estuve de acuerdo en su uso con el Centro cuando me di cuenta de que los datos que recopilo a través de la interfaz web no son suficientes.
  • En realidad, el alojamiento pasa por el servidor web Tornado. Creo que es familiar para cualquiera que haya encontrado solicitudes web en Python.
  • Necesitaba el paquete Pytz porque el servidor Heroku está en una zona horaria diferente, y los datos me llegan sin especificar una zona horaria. Por lo tanto, yo mismo me encargué de la localización.
  • Para crear el bot, utilicé la biblioteca Python-telegram-bot recomendada. La documentación aquí es bastante adecuada y, en general, la biblioteca cumple con los requisitos mínimos de producto viable. Inicialmente, todo el proyecto era un bot de Telegram, que en respuesta al envío de su ubicación envió un horario de autobuses.
  • Firebird, una antigua Interbase, es una base de datos de código abierto con la que creo que muchos de ustedes han trabajado. Por supuesto, no es tan genial como el mismo PostgreSQL, pero para una gran cantidad de consultas es suficiente. En nuestro caso, no se necesita más.
  • Cachetools es un módulo muy simple que le permite almacenar en caché los cálculos. Esto, por supuesto, no se trata de memecached o caché de páginas web, sino de aquellos casos en los que necesita una memoria para consultas largas. Solo tómalo, agrega el decorador apropiado, y todo funciona. El caché tiene diferentes opciones, utilizo la versión TTL, que guarda los datos durante el tiempo especificado, porque sé que los datos no se actualizarán con más frecuencia que a ciertos intervalos (en mi caso, 30 segundos).


Funcionalidad bot


  • / nextbus stop name: hora prevista de llegada;
  • / últimos números de ruta separados por espacios: últimas paradas;
  • Ubicación de envío: la hora prevista de llegada para las próximas tres paradas;
  • Entrada gratuita: números de ruta y distancia a los autobuses (al enviar la ubicación).


Traté de describir los comandos lo suficiente como para que la gente no preguntara cómo usarlos. Básicamente, hay dos comandos básicos: nextbus, cuando escribe el nombre de la parada y envía la ubicación.

Funcionalidad del sitio


Hice el sitio web lo más minimalista posible. De las bibliotecas de terceros, utilicé solo dos para admitir la búsqueda y la promesa, porque las versiones anteriores de los navegadores preinstalados en los teléfonos no pueden prescindir de ellas. Si no admite estos métodos, obtendrá fideos de devolución de llamada bastante pesados ​​para las propias solicitudes. Con fetch, todo se ve más elegante.



En realidad, el funcional aquí consta de 4 puntos:

  1. Llegada Solo puedes mirar la parada. Al hacer clic en el botón (por cierto, podría valer la pena hacer más, ¡lo pensaré!), Envía su ubicación, el sistema busca las tres paradas más cercanas a usted y muestra información sobre ellas. Puede ingresar el nombre de la parada y obtener información sobre ella. Como casi no necesita todos los autobuses 20-30 que pueden llegar a la parada de autobús, puede filtrarlos por ruta.
  2. Autobuses La segunda página contiene información sobre autobuses. Esto se debe a otra historia que me empujó a este proyecto. Un buen día, olvidé el sombrero en el autobús, llamé a la sala de control y le expliqué dónde sucedió. El despachador me sugirió que cogiera mi autobús en el centro, donde volverá, dando la vuelta en la terminal. Recordé que tengo un nombre de usuario y una contraseña del Centro para el sistema de gestión del tráfico, pero resultó que todavía no puedo rastrear la ubicación del automóvil que necesito a través de la interfaz web. Le devolví el sombrero, pero con gran dificultad.
    Pensé que encontrar un autobús podría ser mucho más fácil. Escribí el número de ruta, y el sistema le muestra los autos en la línea, su ubicación actual y la hora en que pasaron las paradas en el camino. E incluso si conoce el número de ruta, pero conoce el número de autobús (esto también sucede), aún puede encontrarlo.
  3. Mapa Mapa en el sitio sin animación. Aquí puede seleccionar autobuses de la lista o ingresar números manualmente, puede filtrarlos. Se pueden mostrar hasta 600 autobuses en el mapa, aunque después de 20 se hace difícil encontrar algo en el centro, simplemente porque las rutas están concentradas aquí. Por lo tanto, es mejor limitar la búsqueda a parámetros más estrictos.
  4. Sobre el proyecto Ahora el proyecto tiene un sitio web, hay un bot de Telegram, grupos en redes sociales.


***
Afortunadamente, Python es un lenguaje con baterías listas para usar. Para cosas simples, ni siquiera necesita descargar nada, solo lea la documentación cuidadosamente.

Por supuesto, dichos servicios se pueden hacer para otras ciudades, además, en algunas ya funcionan. Mucho depende del centro de datos local, en algunos lugares, por ejemplo, en San Petersburgo, incluso hay una API para desarrolladores. Pero lo más importante es la gente del pueblo que quiere cambiar su ciudad para mejor.

Source: https://habr.com/ru/post/es411249/


All Articles