Bagaimana saya membuat Yandex.Transportasi saya dengan jadwal dan bus



Diposting oleh Mikhail Aksenov, .NET Developer, DataArt


Bagaimana semuanya dimulai


Pada musim gugur 2014, ada kabar baik bahwa Yandex.Transport diluncurkan di Voronezh, yang menunjukkan pergerakan bus dan troli. Itu sangat keren tepat di halte bus untuk membuka jadwal dan mengetahui bahwa bus Anda akan bekerja dalam 5 menit.

Tetapi setelah beberapa bulan semuanya berjalan sesuai dengan skenario yang benar-benar dapat diprediksi. Karena semua transportasi di Voronezh dari troli ke minibus bekerja secara tunai, setiap pengemudi tertarik untuk mengangkut penumpang sebanyak mungkin. Akibatnya, mereka mengatur balapan di antara mereka sendiri.

Pengemudi menggunakan layanan baru untuk mengikuti satu sama lain di peta, menyalip dan memotong pesaing di jalan. Beberapa mulai jatuh dalam pendapatan, mereka mulai mengeluh kepada pemilik rute, dan mereka pergi ke orang-orang yang menjual peralatan dengan GLONASS dan GPS dan mengirimkan data tentang pergerakan mobil ke Yandex. Atas permintaan pemilik armada, mereka berhenti mengirim informasi, dan bus-bus segera mulai menghilang dari peta. Sekarang ada sedikit lebih banyak dari mereka, tetapi ini masih jauh lebih sedikit daripada kenyataannya.



Bagi mereka yang terlalu malas untuk membaca lebih lanjut, saya mengusulkan laporan video tentang topik ini:

Selebihnya - saya akan menjelaskan proyek dalam bentuk teks.

Di mana mendapatkan data?


Pada saat yang sama, di Voronezh ada tempat di mana semua data dikumpulkan - Pusat Organisasi Lalu Lintas Jalan (DPC). Mereka memiliki aplikasi web yang besar dan berat di situs mereka dengan JavaScript yang tidak berkelanjutan dan artefak lainnya, sementara semua yang ada di dalamnya disertai dengan permintaan POST dan tidak ada yang di-cache. Menggunakan situs ini sendiri, Anda dapat dengan mudah menempatkan layanan yang mengumpulkan data tentang pergerakan bus.

Ada opsi yang memungkinkan Anda untuk melihat peta dan mencari tahu kapan bus akan datang dan apa yang akan terjadi. Asalkan Anda kira-kira berhenti (± 50 meter). Di menu, Anda dapat membuka daftar rute dan melihat dengan tepat ke mana bus pergi, tetapi ada masalah - mereka melaju dengan aneh. Misalnya, di sepanjang Koltsovskaya, sebuah jalan di tengah di mana Anda tidak dapat mempercepat, bus bergerak maju dan mundur dengan kecepatan sekitar 200 km / jam.


Mengapa python


Saya memilih Python karena itu keren, baterainya dibundel, dan seterusnya. Dan 3.6 karena ada format untuk string literal, mengetik, itu saja. Mari kita lihat apa yang pada dasarnya saya gunakan:

  • Banyak yang mengeluh bahwa mengendarai nama persis pemberhentian dengan segala macam tanda baca sangat sulit. Kemudian saya menyadari kemungkinan pencarian fuzzy dan membuat unit test pertama untuk itu.
  • Seluruh sistem di-host di Heroku. Ini gratis, karena saya tidak punya database - saya berharap bisa bertahan dengan database pusat data. Saya menyetujui penggunaannya dengan Center ketika saya menyadari bahwa data yang saya kumpulkan melalui antarmuka web tidak cukup.
  • Sebenarnya, hosting berjalan melalui server web Tornado. Saya pikir itu tidak asing bagi siapa saja yang menemukan permintaan web dengan Python.
  • Saya memerlukan paket Pytz karena server Heroku berada di zona waktu yang berbeda, dan data datang kepada saya tanpa menentukan zona waktu. Karena itu, saya sendiri yang mengurus lokalisasi.
  • Untuk membuat bot, saya menggunakan pustaka Python-telegram-bot yang disarankan. Dokumentasi di sini cukup memadai, dan secara umum perpustakaan memenuhi persyaratan produk minimum yang layak. Awalnya, seluruh proyek adalah bot Telegram, yang sebagai tanggapan atas pengiriman lokasi Anda mengirim jadwal bus.
  • Firebird, mantan Interbase, adalah database sumber terbuka yang saya pikir banyak dari Anda telah bekerja dengannya. Tentu saja, ini tidak sekeren PostgreSQL yang sama, tetapi untuk sejumlah besar pertanyaan, itu sudah cukup. Dalam kasus kami, tidak diperlukan lagi.
  • Cachetools adalah modul yang sangat sederhana yang memungkinkan Anda untuk melakukan cache perhitungan. Ini, tentu saja, bukan tentang memecached atau caching halaman web, tetapi tentang kasus-kasus ketika Anda membutuhkan memoisasi untuk permintaan panjang. Ambillah, tambahkan dekorator yang sesuai - dan semuanya berfungsi. Cache memiliki opsi yang berbeda, saya menggunakan versi TTL, yang menyimpan data untuk waktu yang ditentukan, karena saya tahu bahwa data tidak akan diperbarui lebih sering daripada pada interval tertentu (dalam kasus saya - 30 detik).


Fungsi bot


  • / nextbus stop name - perkiraan waktu kedatangan;
  • / nomor rute terakhir dipisahkan oleh spasi - perhentian terakhir;
  • Pengiriman lokasi - perkiraan waktu kedatangan untuk tiga perhentian berikutnya;
  • Nomor entri - rute gratis dan jarak ke bus (saat mengirim lokasi).


Saya mencoba menggambarkan perintah-perintah itu dengan cukup sehingga orang tidak akan bertanya bagaimana cara menggunakannya. Pada dasarnya ada dua perintah dasar: nextbus, ketika Anda menulis nama berhenti, dan mengirim lokasi.

Fungsionalitas situs


Saya membuat situs web seminimal mungkin. Dari perpustakaan pihak ketiga, saya hanya menggunakan dua untuk mendukung pengambilan dan janji, karena versi yang lebih lama dari browser pra-instal di telepon tidak dapat melakukannya tanpa mereka. Jika Anda tidak mendukung metode ini, Anda akan mendapatkan mi panggilan balik yang cukup berat untuk permintaan itu sendiri. Dengan mengambil, semuanya terlihat lebih elegan.



Sebenarnya, fungsional di sini terdiri dari 4 poin:

  1. Kedatangan Anda bisa menyaksikannya. Dengan mengklik tombol (omong-omong, mungkin layak untuk melakukan lebih banyak - saya akan memikirkannya!), Anda mengirim lokasi Anda, sistem mencari tiga perhentian terdekat Anda dan menampilkan informasi tentang mereka. Anda dapat memasukkan nama pemberhentian dan mendapatkan informasi tentang hal itu. Karena Anda hampir tidak membutuhkan semua 20-30 bus yang dapat tiba di halte, Anda dapat memfilternya berdasarkan rute.
  2. Bus Halaman kedua berisi informasi tentang bus. Ini karena cerita lain yang mendorong saya ke proyek ini. Suatu hari, saya lupa topi di bus, yang disebut ruang kontrol, menjelaskan di mana itu terjadi. Operator itu menyarankan agar saya naik bus di tengah, di mana ia akan kembali, berbalik di terminal. Saya ingat bahwa saya memiliki login dan kata sandi dari sistem Pusat Manajemen Lalu Lintas, tetapi ternyata saya masih tidak dapat melacak lokasi mobil yang saya butuhkan melalui antarmuka web. Saya mengembalikan topinya, tetapi dengan susah payah.
    Saya pikir menemukan bus bisa jauh lebih mudah. Saya menulis nomor rute, dan sistem menunjukkan kepada Anda mobil-mobil di telepon, lokasi mereka saat ini dan waktu ketika mereka lewat berhenti di sepanjang jalan. Dan bahkan jika Anda tahu nomor rute, tetapi Anda tahu nomor bus (ini juga terjadi), Anda masih dapat menemukannya.
  3. Peta. Peta di situs tanpa animasi. Di sini Anda dapat memilih bus dari daftar atau memasukkan angka secara manual, Anda dapat memfilternya. Hingga 600 bus dapat ditampilkan di peta, meskipun setelah 20 menjadi sulit untuk menemukan sesuatu di pusat, hanya karena semua rute terkonsentrasi di sini. Karena itu, lebih baik membatasi pencarian ke parameter yang lebih ketat.
  4. Tentang proyek. Sekarang proyek memiliki situs web, ada bot Telegram, grup di jejaring sosial.


***
Untungnya, Python adalah bahasa dengan baterai di luar kotak. Untuk hal-hal sederhana, Anda bahkan tidak perlu mengunduh apa pun, cukup baca dokumentasinya dengan cermat.

Tentu saja, layanan tersebut dapat dilakukan untuk kota-kota lain, terlebih lagi, di beberapa mereka sudah bekerja. Banyak hal bergantung pada pusat data lokal, di beberapa tempat, misalnya, di St. Petersburg bahkan ada API untuk pengembang. Tapi yang paling penting adalah warga kota yang ingin mengubah kota mereka menjadi lebih baik.

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


All Articles