From b50a090aa6a55260d52c638bdc5eb1698ade12b3 Mon Sep 17 00:00:00 2001 From: Kyler Chin <7539174+kylerchin@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:32:12 -0800 Subject: [PATCH 1/5] correct start and end dates --- anteater_gtfs/calendar.txt | 2 +- anteater_gtfs/shapes.txt | 191 +++++---- overrideshapes/M.geojson | 371 ++++++++++++++++++ .../features (10).geojson:Zone.Identifier | 3 - route-sup.json | 3 +- src/static/process.rs | 11 +- 6 files changed, 470 insertions(+), 111 deletions(-) create mode 100644 overrideshapes/M.geojson delete mode 100644 overrideshapes/features (10).geojson:Zone.Identifier diff --git a/anteater_gtfs/calendar.txt b/anteater_gtfs/calendar.txt index 0d4d663..732fbfe 100644 --- a/anteater_gtfs/calendar.txt +++ b/anteater_gtfs/calendar.txt @@ -1,3 +1,3 @@ service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date -monthurs,1,1,1,1,1,1,1,20230925,20231215 +monthurs,1,1,1,1,1,1,1,20240108,20240322 fri,0,0,0,0,1,0,0,20240108,20240322 diff --git a/anteater_gtfs/shapes.txt b/anteater_gtfs/shapes.txt index 4fcdb63..08f8730 100644 --- a/anteater_gtfs/shapes.txt +++ b/anteater_gtfs/shapes.txt @@ -295,108 +295,95 @@ shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled 8006668shape,33.64842,-117.83832,76, 8006668shape,33.64873,-117.83891,77, 8006668shape,33.64917,-117.83958,78, -8006670shape,33.64895,-117.8451,0, -8006670shape,33.64897,-117.84489,1, -8006670shape,33.649,-117.84477,2, -8006670shape,33.64914,-117.84412,3, -8006670shape,33.64942,-117.84348,4, -8006670shape,33.64971,-117.84313,5, -8006670shape,33.64999,-117.84294,6, -8006670shape,33.65008,-117.84283,7, -8006670shape,33.65064,-117.84247,8, -8006670shape,33.65086,-117.84217,9, -8006670shape,33.65099,-117.84182,10, -8006670shape,33.64699,-117.82957,11, -8006670shape,33.64685,-117.82955,12, -8006670shape,33.6462,-117.82932,13, -8006670shape,33.64576,-117.82926,14, -8006670shape,33.64559,-117.82921,15, -8006670shape,33.64521,-117.82918,16, -8006670shape,33.64488,-117.82919,17, -8006670shape,33.64412,-117.82925,18, -8006670shape,33.64315,-117.82946,19, -8006670shape,33.64249,-117.82969,20, -8006670shape,33.63994,-117.83006,21, -8006670shape,33.63956,-117.83015,22, -8006670shape,33.63917,-117.83034,23, -8006670shape,33.63933,-117.83069,24, -8006670shape,33.63953,-117.83124,25, -8006670shape,33.63989,-117.83247,26, -8006670shape,33.64016,-117.83303,27, -8006670shape,33.64092,-117.8344,28, -8006670shape,33.64101,-117.83455,29, -8006670shape,33.64137,-117.83505,30, -8006670shape,33.64166,-117.83539,31, -8006670shape,33.64279,-117.83642,32, -8006670shape,33.64258,-117.83697,33, -8006670shape,33.64251,-117.83748,34, -8006670shape,33.64255,-117.83795,35, -8006670shape,33.6428,-117.83905,36, -8006670shape,33.64282,-117.83962,37, -8006670shape,33.6428,-117.83987,38, -8006670shape,33.64275,-117.84033,39, -8006670shape,33.64269,-117.84062,40, -8006670shape,33.64244,-117.84153,41, -8006670shape,33.6423,-117.8425,42, -8006670shape,33.64226,-117.84267,43, -8006670shape,33.64213,-117.8431,44, -8006670shape,33.64177,-117.84392,45, -8006670shape,33.64167,-117.84441,46, -8006670shape,33.64163,-117.84559,47, -8006670shape,33.64139,-117.84694,48, -8006670shape,33.64143,-117.84759,49, -8006670shape,33.64157,-117.84801,50, -8006670shape,33.64181,-117.84842,51, -8006670shape,33.64215,-117.84877,52, -8006670shape,33.64262,-117.84901,53, -8006670shape,33.64295,-117.84909,54, -8006670shape,33.643,-117.84915,55, -8006670shape,33.64347,-117.8492,56, -8006670shape,33.64439,-117.84919,57, -8006670shape,33.64468,-117.84915,58, -8006670shape,33.64561,-117.84878,59, -8006670shape,33.64597,-117.84875,60, -8006670shape,33.6465,-117.84889,61, -8006670shape,33.64665,-117.84832,62, -8006670shape,33.64683,-117.84802,63, -8006670shape,33.64703,-117.84782,64, -8006670shape,33.64723,-117.84765,65, -8006670shape,33.64824,-117.84697,66, -8006670shape,33.6485,-117.84665,67, -8006670shape,33.64856,-117.84661,68, -8006670shape,33.64876,-117.84621,69, -8006670shape,33.64887,-117.84579,70, -8006670shape,33.64895,-117.8451,71, -8006670shape,33.64895,-117.8451,72, -8006670shape,33.64897,-117.84489,73, -8006670shape,33.649,-117.84477,74, -8006670shape,33.64914,-117.84412,75, -8006670shape,33.64942,-117.84348,76, -8006670shape,33.64971,-117.84313,77, -8006670shape,33.64999,-117.84294,78, -8006670shape,33.65008,-117.84283,79, -8006670shape,33.65064,-117.84247,80, -8006670shape,33.65086,-117.84217,81, -8006670shape,33.65099,-117.84182,82, -8006670shape,33.65099,-117.84182,83, -8006670shape,33.6507,-117.84167,84, -8006670shape,33.65016,-117.84121,85, -8006670shape,33.64983,-117.84086,86, -8006670shape,33.6498,-117.84076,87, -8006670shape,33.64924,-117.83991,88, -8006670shape,33.64924,-117.83991,89, -8006670shape,33.64856,-117.83886,90, -8006670shape,33.64842,-117.8386,91, -8006670shape,33.64815,-117.83796,92, -8006670shape,33.64806,-117.83774,93, -8006670shape,33.64793,-117.83725,94, -8006670shape,33.64777,-117.83629,95, -8006670shape,33.64776,-117.83538,96, -8006670shape,33.64777,-117.8351,97, -8006670shape,33.64797,-117.83402,98, -8006670shape,33.6488,-117.83015,99, -8006670shape,33.6488,-117.83015,100, -8006670shape,33.64699,-117.82957,101, +8006670shape,33.649056,-117.839729,0, +8006670shape,33.648943,-117.839547,1, +8006670shape,33.648842,-117.839342,2, +8006670shape,33.648693,-117.839091,3, +8006670shape,33.648416,-117.838639,4, +8006670shape,33.648267,-117.838303,5, +8006670shape,33.648145,-117.837987,6, +8006670shape,33.648024,-117.837633,7, +8006670shape,33.647872,-117.83704,8, +8006670shape,33.647815,-117.836713,9, +8006670shape,33.647791,-117.836497,10, +8006670shape,33.647762,-117.836173,11, +8006670shape,33.64774,-117.83589,12, +8006670shape,33.647742,-117.835517,13, +8006670shape,33.6478,-117.834887,14, +8006670shape,33.647887,-117.8344,15, +8006670shape,33.648029,-117.833715,16, +8006670shape,33.648577,-117.831196,17, +8006670shape,33.64877,-117.830244,18, +8006670shape,33.648719,-117.830146,19, +8006670shape,33.647759,-117.82983,20, +8006670shape,33.646856,-117.829543,21, +8006670shape,33.644618,-117.829144,22, +8006670shape,33.642305,-117.829693,23, +8006670shape,33.640753,-117.829933,24, +8006670shape,33.63925,-117.83029,25, +8006670shape,33.639204,-117.830405,26, +8006670shape,33.63932,-117.830683,27, +8006670shape,33.639513,-117.831174,28, +8006670shape,33.639909,-117.832471,29, +8006670shape,33.640343,-117.833386,30, +8006670shape,33.640992,-117.834599,31, +8006670shape,33.641685,-117.835414,32, +8006670shape,33.642695,-117.836385,33, +8006670shape,33.642686,-117.836608,34, +8006670shape,33.642581,-117.836997,35, +8006670shape,33.642521,-117.837401,36, +8006670shape,33.642533,-117.837715,37, +8006670shape,33.642807,-117.839053,38, +8006670shape,33.642854,-117.839418,39, +8006670shape,33.6428,-117.839978,40, +8006670shape,33.642754,-117.840401,41, +8006670shape,33.642508,-117.841274,42, +8006670shape,33.64239,-117.841939,43, +8006670shape,33.642191,-117.842935,44, +8006670shape,33.64192,-117.84356,45, +8006670shape,33.641718,-117.844132,46, +8006670shape,33.641654,-117.84469,47, +8006670shape,33.64165,-117.845374,48, +8006670shape,33.641616,-117.845716,49, +8006670shape,33.641471,-117.846549,50, +8006670shape,33.641413,-117.846846,51, +8006670shape,33.6414,-117.847175,52, +8006670shape,33.641418,-117.847559,53, +8006670shape,33.641576,-117.848042,54, +8006670shape,33.641866,-117.84854,55, +8006670shape,33.642263,-117.848841,56, +8006670shape,33.642616,-117.849016,57, +8006670shape,33.643076,-117.849115,58, +8006670shape,33.643423,-117.849192,59, +8006670shape,33.643949,-117.849192,60, +8006670shape,33.644605,-117.849121,61, +8006670shape,33.645028,-117.849008,62, +8006670shape,33.645546,-117.848785,63, +8006670shape,33.645893,-117.848755,64, +8006670shape,33.646156,-117.848777,65, +8006670shape,33.646387,-117.848837,66, +8006670shape,33.646461,-117.848817,67, +8006670shape,33.646556,-117.848497,68, +8006670shape,33.646676,-117.848223,69, +8006670shape,33.646866,-117.847935,70, +8006670shape,33.647485,-117.84747,71, +8006670shape,33.648184,-117.846993,72, +8006670shape,33.64844,-117.846723,73, +8006670shape,33.648608,-117.846467,74, +8006670shape,33.648784,-117.845998,75, +8006670shape,33.648864,-117.845512,76, +8006670shape,33.648994,-117.844782,77, +8006670shape,33.649133,-117.844166,78, +8006670shape,33.64934,-117.843606,79, +8006670shape,33.649618,-117.843161,80, +8006670shape,33.649948,-117.84289,81, +8006670shape,33.650469,-117.842563,82, +8006670shape,33.650775,-117.842244,83, +8006670shape,33.65095,-117.841853,84, +8006670shape,33.650506,-117.841545,85, +8006670shape,33.64997,-117.841033,86, +8006670shape,33.649725,-117.840716,87, +8006670shape,33.649173,-117.839902,88, 8006672shape,33.649283,-117.839741,0, 8006672shape,33.649804,-117.840551,1, 8006672shape,33.650117,-117.840969,2, diff --git a/overrideshapes/M.geojson b/overrideshapes/M.geojson new file mode 100644 index 0000000..04306c0 --- /dev/null +++ b/overrideshapes/M.geojson @@ -0,0 +1,371 @@ +{ + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + -117.839729, + 33.649056 + ], + [ + -117.839547, + 33.648943 + ], + [ + -117.839342, + 33.648842 + ], + [ + -117.839091, + 33.648693 + ], + [ + -117.838639, + 33.648416 + ], + [ + -117.838303, + 33.648267 + ], + [ + -117.837987, + 33.648145 + ], + [ + -117.837633, + 33.648024 + ], + [ + -117.83704, + 33.647872 + ], + [ + -117.836713, + 33.647815 + ], + [ + -117.836497, + 33.647791 + ], + [ + -117.836173, + 33.647762 + ], + [ + -117.83589, + 33.64774 + ], + [ + -117.835517, + 33.647742 + ], + [ + -117.834887, + 33.6478 + ], + [ + -117.8344, + 33.647887 + ], + [ + -117.833715, + 33.648029 + ], + [ + -117.831196, + 33.648577 + ], + [ + -117.830244, + 33.64877 + ], + [ + -117.830146, + 33.648719 + ], + [ + -117.82983, + 33.647759 + ], + [ + -117.829543, + 33.646856 + ], + [ + -117.829144, + 33.644618 + ], + [ + -117.829693, + 33.642305 + ], + [ + -117.829933, + 33.640753 + ], + [ + -117.83029, + 33.63925 + ], + [ + -117.830405, + 33.639204 + ], + [ + -117.830683, + 33.63932 + ], + [ + -117.831174, + 33.639513 + ], + [ + -117.832471, + 33.639909 + ], + [ + -117.833386, + 33.640343 + ], + [ + -117.834599, + 33.640992 + ], + [ + -117.835414, + 33.641685 + ], + [ + -117.836385, + 33.642695 + ], + [ + -117.836608, + 33.642686 + ], + [ + -117.836997, + 33.642581 + ], + [ + -117.837401, + 33.642521 + ], + [ + -117.837715, + 33.642533 + ], + [ + -117.839053, + 33.642807 + ], + [ + -117.839418, + 33.642854 + ], + [ + -117.839978, + 33.6428 + ], + [ + -117.840401, + 33.642754 + ], + [ + -117.841274, + 33.642508 + ], + [ + -117.841939, + 33.64239 + ], + [ + -117.842935, + 33.642191 + ], + [ + -117.84356, + 33.64192 + ], + [ + -117.844132, + 33.641718 + ], + [ + -117.84469, + 33.641654 + ], + [ + -117.845374, + 33.64165 + ], + [ + -117.845716, + 33.641616 + ], + [ + -117.846549, + 33.641471 + ], + [ + -117.846846, + 33.641413 + ], + [ + -117.847175, + 33.6414 + ], + [ + -117.847559, + 33.641418 + ], + [ + -117.848042, + 33.641576 + ], + [ + -117.84854, + 33.641866 + ], + [ + -117.848841, + 33.642263 + ], + [ + -117.849016, + 33.642616 + ], + [ + -117.849115, + 33.643076 + ], + [ + -117.849192, + 33.643423 + ], + [ + -117.849192, + 33.643949 + ], + [ + -117.849121, + 33.644605 + ], + [ + -117.849008, + 33.645028 + ], + [ + -117.848785, + 33.645546 + ], + [ + -117.848755, + 33.645893 + ], + [ + -117.848777, + 33.646156 + ], + [ + -117.848837, + 33.646387 + ], + [ + -117.848817, + 33.646461 + ], + [ + -117.848497, + 33.646556 + ], + [ + -117.848223, + 33.646676 + ], + [ + -117.847935, + 33.646866 + ], + [ + -117.84747, + 33.647485 + ], + [ + -117.846993, + 33.648184 + ], + [ + -117.846723, + 33.64844 + ], + [ + -117.846467, + 33.648608 + ], + [ + -117.845998, + 33.648784 + ], + [ + -117.845512, + 33.648864 + ], + [ + -117.844782, + 33.648994 + ], + [ + -117.844166, + 33.649133 + ], + [ + -117.843606, + 33.64934 + ], + [ + -117.843161, + 33.649618 + ], + [ + -117.84289, + 33.649948 + ], + [ + -117.842563, + 33.650469 + ], + [ + -117.842244, + 33.650775 + ], + [ + -117.841853, + 33.65095 + ], + [ + -117.841545, + 33.650506 + ], + [ + -117.841033, + 33.64997 + ], + [ + -117.840716, + 33.649725 + ], + [ + -117.839902, + 33.649173 + ] + ], + "type": "LineString" + }, + "id": "93f167e0a8a939a769d8bcc92e7caf00" + } + ], + "type": "FeatureCollection" +} \ No newline at end of file diff --git a/overrideshapes/features (10).geojson:Zone.Identifier b/overrideshapes/features (10).geojson:Zone.Identifier deleted file mode 100644 index 1b986fe..0000000 --- a/overrideshapes/features (10).geojson:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=https://studio.mapbox.com/ diff --git a/route-sup.json b/route-sup.json index ca1da58..33058af 100644 --- a/route-sup.json +++ b/route-sup.json @@ -74,7 +74,8 @@ "name": "M_Friday.csv", "monthurs": false } - ] + ], + "overrideshape": "overrideshapes/M.geojson" }, { "name": "N", diff --git a/src/static/process.rs b/src/static/process.rs index 3b87489..165df7d 100644 --- a/src/static/process.rs +++ b/src/static/process.rs @@ -799,6 +799,9 @@ async fn main() { let mut calendarwriter = Writer::from_writer(vec![]); + let start_date = chrono::naive::NaiveDate::from_ymd_opt(2024,1,8).unwrap(); + let end_date = chrono::naive::NaiveDate::from_ymd_opt(2024,3,22).unwrap(); + calendarwriter.serialize(gtfs_structures::Calendar { id: String::from("monthurs"), monday: true, @@ -808,8 +811,8 @@ async fn main() { friday: true, saturday: true, sunday: true, - start_date: chrono::naive::NaiveDate::from_ymd_opt(2023,09,25).unwrap(), - end_date: chrono::naive::NaiveDate::from_ymd_opt(2023,12,15).unwrap(), + start_date: start_date.clone(), + end_date: end_date.clone(), }).unwrap(); calendarwriter.serialize(gtfs_structures::Calendar { @@ -821,8 +824,8 @@ async fn main() { friday: true, saturday: false, sunday: false, - start_date: chrono::naive::NaiveDate::from_ymd_opt(2024,1,8).unwrap(), - end_date: chrono::naive::NaiveDate::from_ymd_opt(2024,3,22).unwrap(), + start_date: start_date.clone(), + end_date: end_date.clone(), }).unwrap(); let calendar_csv = String::from_utf8(calendarwriter.into_inner().unwrap()).unwrap(); From 6b3f3013af61eefecf34da4a160b1aef6747051d Mon Sep 17 00:00:00 2001 From: Kyler Chin <7539174+kylerchin@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:34:00 -0800 Subject: [PATCH 2/5] Format text --- src/main.rs | 598 ++++++++++++++++++++++++----------------- src/static/process.rs | 472 ++++++++++++++++++-------------- src/static/timeutil.rs | 13 +- 3 files changed, 624 insertions(+), 459 deletions(-) diff --git a/src/main.rs b/src/main.rs index cfdb4c3..0d5fcba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,23 @@ - -use serde::{Deserialize, Serialize}; -use std::collections::{BTreeMap, HashMap}; -use std::time::Instant; -use protobuf::{CodedInputStream, Message as ProtobufMessage}; -use prost::Message; -use std::time::UNIX_EPOCH; -use gtfs_rt::EntitySelector; use chrono::Datelike; -use chrono_tz::US::Pacific; -use gtfs_rt::TimeRange; -use serde_json; use chrono::TimeZone; use chrono::Timelike; use chrono_tz::Tz; +use chrono_tz::US::Pacific; use chrono_tz::UTC; +use gtfs_rt::EntitySelector; +use gtfs_rt::TimeRange; +use prost::Message; +use protobuf::{CodedInputStream, Message as ProtobufMessage}; +use serde::{Deserialize, Serialize}; +use serde_json; +use std::collections::{BTreeMap, HashMap}; +use std::time::Instant; +use std::time::UNIX_EPOCH; extern crate rand; -use rand::Rng; use crate::rand::prelude::SliceRandom; +use rand::Rng; use redis::Commands; use redis::RedisError; @@ -33,7 +32,7 @@ struct TranslocRealtime { api_latest_version: String, generated_on: String, data: BTreeMap>, - api_version: String + api_version: String, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -64,27 +63,32 @@ struct ArrivalEstimates { #[derive(Serialize, Deserialize, Debug, Clone)] struct TranslocLocation { lat: f32, - lng: f32 + lng: f32, } -fn allowtrip(trip_id: &String, trip: >fs_structures::Trip, route_id: &String, gtfs: >fs_structures::Gtfs) -> bool { - - +fn allowtrip( + trip_id: &String, + trip: >fs_structures::Trip, + route_id: &String, + gtfs: >fs_structures::Gtfs, +) -> bool { let calendarselected = gtfs.calendar.get(trip.service_id.as_str()).unwrap(); - + //is it friday in Los Angeles? // Get the timezone for Los Angeles. -let current_time = chrono::Utc::now(); + let current_time = chrono::Utc::now(); -let tz: Tz = "America/Los_Angeles".parse().unwrap(); + let tz: Tz = "America/Los_Angeles".parse().unwrap(); -// Convert this to the Los Angeles timezone. + // Convert this to the Los Angeles timezone. -let current_time_la = current_time.with_timezone(&tz); + let current_time_la = current_time.with_timezone(&tz); -let is_friday = current_time_la.weekday() == chrono::Weekday::Fri; + let is_friday = current_time_la.weekday() == chrono::Weekday::Fri; -let current_time_in_seconds = (current_time_la.hour() * 3600) + (current_time_la.minute() * 60) + current_time_la.second(); + let current_time_in_seconds = (current_time_la.hour() * 3600) + + (current_time_la.minute() * 60) + + current_time_la.second(); if trip.route_id != *route_id { return false; @@ -92,23 +96,27 @@ let current_time_in_seconds = (current_time_la.hour() * 3600) + (current_time_la /*if trip.stop_times[0].departure_time.is_some() { let departure_time = trip.stop_times[0].departure_time.as_ref().unwrap(); - + let diff = *departure_time as i32 - current_time_in_seconds as i32; //large time means the trip hasn't started yet - //negative time means the trip has already started - - + //negative time means the trip has already started + + if diff > 1500 || diff < -3600 { return false; } }*/ - let departure_comparison = trip.stop_times.iter().find(|stop_time| stop_time.departure_time.is_some()); + let departure_comparison = trip + .stop_times + .iter() + .find(|stop_time| stop_time.departure_time.is_some()); if departure_comparison.is_some() { let departure_comparison = departure_comparison.unwrap(); - let diff = departure_comparison.departure_time.unwrap() as i32 - current_time_in_seconds as i32; + let diff = + departure_comparison.departure_time.unwrap() as i32 - current_time_in_seconds as i32; if diff > 1500 || diff < -3600 { return false; @@ -116,14 +124,10 @@ let current_time_in_seconds = (current_time_la.hour() * 3600) + (current_time_la } else { } -return match is_friday { - true => { - calendarselected.friday == true - }, - false => { - calendarselected.monday == true - } - } + return match is_friday { + true => calendarselected.friday == true, + false => calendarselected.monday == true, + }; } fn arrival_estimates_length_to_end(bus: &EachBus) -> i32 { @@ -131,7 +135,7 @@ fn arrival_estimates_length_to_end(bus: &EachBus) -> i32 { 'estimation: for estimate in bus.arrival_estimates.iter() { if estimate.stop_id.is_some() { - /* + /* if estimate.stop_id.as_ref().unwrap().as_str() == "8197566" || estimate.stop_id.as_ref().unwrap().as_str() == "8274064" { break 'estimation; } @@ -139,7 +143,9 @@ fn arrival_estimates_length_to_end(bus: &EachBus) -> i32 { } if estimate.route_id.is_some() { - if estimate.route_id.as_ref().unwrap().as_str() != bus.route_id.as_ref().unwrap().as_str() { + if estimate.route_id.as_ref().unwrap().as_str() + != bus.route_id.as_ref().unwrap().as_str() + { break 'estimation; } } @@ -155,14 +161,15 @@ fn arrival_estimates_length_to_end(bus: &EachBus) -> i32 { #[tokio::main] async fn main() -> Result<(), Box> { color_eyre::install()?; - // curl https://transloc-api-1-2.p.rapidapi.com/vehicles.json?agencies=1039 - //-H "X-Mashape-Key: b0ebd9e8a5msh5aca234d74ce282p1737bbjsnddd18d7b9365" + // curl https://transloc-api-1-2.p.rapidapi.com/vehicles.json?agencies=1039 + //-H "X-Mashape-Key: b0ebd9e8a5msh5aca234d74ce282p1737bbjsnddd18d7b9365" - let redisclient = RedisClient::open("redis://127.0.0.1:6379/").unwrap(); - let mut con = redisclient.get_connection().unwrap(); + let redisclient = RedisClient::open("redis://127.0.0.1:6379/").unwrap(); + let mut con = redisclient.get_connection().unwrap(); let gtfs = gtfs_structures::GtfsReader::default() - .read("anteater_gtfs").unwrap(); + .read("anteater_gtfs") + .unwrap(); let rawgtfs = gtfs_structures::RawGtfs::new("anteater_gtfs").unwrap(); @@ -172,18 +179,18 @@ async fn main() -> Result<(), Box> { "16aff0066fmsh91bdf05e1ddc2a9p1bf246jsn4e66fe3531f2", "X7rzqy7Zx8mshBtXeYQjrv0aLyrYp1HBttujsnJ6BgNQxIMetU", "1d4175ed60msh03c8157af1f76e9p1d8e56jsnc909aeb67a68", - "fd6fe9ee6dmshb6b307335f13cdap178324jsnaa4128a7eb3c" - ]; + "fd6fe9ee6dmshb6b307335f13cdap178324jsnaa4128a7eb3c", + ]; - -let tz: Tz = "America/Los_Angeles".parse().unwrap(); + let tz: Tz = "America/Los_Angeles".parse().unwrap(); loop { let current_time = chrono::Utc::now(); let current_time_la = current_time.with_timezone(&tz); - let is_weekend = current_time_la.weekday() == chrono::Weekday::Sat || current_time_la.weekday() == chrono::Weekday::Sun; + let is_weekend = current_time_la.weekday() == chrono::Weekday::Sat + || current_time_la.weekday() == chrono::Weekday::Sun; if current_time_la.hour() < 6 || is_weekend { println!("Sleeping for 10 minutes"); @@ -199,8 +206,8 @@ let tz: Tz = "America/Los_Angeles".parse().unwrap(); let mut rng = rand::thread_rng(); let choice = *(apikeys.choose(&mut rng).unwrap()); - - let res = client.get("https://transloc-api-1-2.p.rapidapi.com/vehicles.json?agencies=1039") + let res = client + .get("https://transloc-api-1-2.p.rapidapi.com/vehicles.json?agencies=1039") .header("X-Mashape-Key", choice) .send() .await; @@ -225,7 +232,7 @@ let tz: Tz = "America/Los_Angeles".parse().unwrap(); let import_data: TranslocRealtime = serde_json::from_str(body.as_str()).unwrap(); - let mut vehicle_id_to_trip_id:HashMap = HashMap::new(); + let mut vehicle_id_to_trip_id: HashMap = HashMap::new(); let mut grouped_by_route: HashMap> = HashMap::new(); @@ -234,154 +241,235 @@ let tz: Tz = "America/Los_Angeles".parse().unwrap(); for (i, bus) in buses.iter().enumerate() { if bus.route_id.is_some() { if grouped_by_route.contains_key(bus.route_id.as_ref().unwrap()) { - grouped_by_route.get_mut(bus.route_id.as_ref().unwrap()).unwrap().push(bus.clone()); + grouped_by_route + .get_mut(bus.route_id.as_ref().unwrap()) + .unwrap() + .push(bus.clone()); } else { - grouped_by_route.insert(bus.route_id.as_ref().unwrap().clone(), vec![bus.clone()]); + grouped_by_route + .insert(bus.route_id.as_ref().unwrap().clone(), vec![bus.clone()]); } } } } }); - -let current_time = chrono::Utc::now(); + let current_time = chrono::Utc::now(); -let tz: Tz = "America/Los_Angeles".parse().unwrap(); + let tz: Tz = "America/Los_Angeles".parse().unwrap(); -// Convert this to the Los Angeles timezone. + // Convert this to the Los Angeles timezone. -let current_time_la = current_time.with_timezone(&tz); + let current_time_la = current_time.with_timezone(&tz); -let midnight = current_time_la.date().and_hms(0, 0, 0); + let midnight = current_time_la.date().and_hms(0, 0, 0); -let midnight_timestamp = midnight.timestamp(); + let midnight_timestamp = midnight.timestamp(); -let mut delay_hashmap: HashMap = HashMap::new(); + let mut delay_hashmap: HashMap = HashMap::new(); for (route_id, buses) in grouped_by_route.iter() { //let sort the buses by completion let mut sorted_buses = buses.clone(); - - sorted_buses.sort_by(|bus_a, bus_b| arrival_estimates_length_to_end(bus_a).cmp(&arrival_estimates_length_to_end(bus_b))); - println!("order of completion [{}]: {:?}", route_id, &sorted_buses.iter().map(|x| arrival_estimates_length_to_end(&x)).collect::>()); - - let mut possible_trips = gtfs.trips.iter().filter(|(trip_id,trip)| allowtrip(&trip_id, &trip, &route_id, >fs)).map(|(trip_id, trip)| trip).collect::>(); + sorted_buses.sort_by(|bus_a, bus_b| { + arrival_estimates_length_to_end(bus_a).cmp(&arrival_estimates_length_to_end(bus_b)) + }); + + println!( + "order of completion [{}]: {:?}", + route_id, + &sorted_buses + .iter() + .map(|x| arrival_estimates_length_to_end(&x)) + .collect::>() + ); + + let mut possible_trips = gtfs + .trips + .iter() + .filter(|(trip_id, trip)| allowtrip(&trip_id, &trip, &route_id, >fs)) + .map(|(trip_id, trip)| trip) + .collect::>(); possible_trips.sort_by(|trip_a, trip_b| trip_a.id.cmp(&trip_b.id)); - println!("possible trips on Route {}: {:?}",gtfs.get_route(route_id).unwrap().short_name , possible_trips.iter().map(|x| x.id.clone()).collect::>()); + println!( + "possible trips on Route {}: {:?}", + gtfs.get_route(route_id).unwrap().short_name, + possible_trips + .iter() + .map(|x| x.id.clone()) + .collect::>() + ); - for (i,bus) in (&sorted_buses).iter().enumerate() { + for (i, bus) in (&sorted_buses).iter().enumerate() { if possible_trips.len() == 0 { - vehicle_id_to_trip_id.insert(bus.vehicle_id.as_ref().unwrap().clone(), format!("extra-{}-{i}", bus.route_id.as_ref().unwrap().clone())); + vehicle_id_to_trip_id.insert( + bus.vehicle_id.as_ref().unwrap().clone(), + format!("extra-{}-{i}", bus.route_id.as_ref().unwrap().clone()), + ); } else { if possible_trips.len() == 1 { - vehicle_id_to_trip_id.insert(bus.vehicle_id.as_ref().unwrap().clone(), possible_trips[0].id.clone()); + vehicle_id_to_trip_id.insert( + bus.vehicle_id.as_ref().unwrap().clone(), + possible_trips[0].id.clone(), + ); } else { let assigned_id = possible_trips[0].id.clone(); let mut closest_past_trip: Option = None; - let mut remove_before_index:Option = None; + let mut remove_before_index: Option = None; + + let searchable_stop_times_from_bus = bus + .arrival_estimates + .iter() + .filter(|arrival_estimate| { + arrival_estimate.arrival_at.is_some() + && arrival_estimate.stop_id.is_some() + }) + .collect::>(); - let searchable_stop_times_from_bus = bus.arrival_estimates.iter().filter(|arrival_estimate| arrival_estimate.arrival_at.is_some() && arrival_estimate.stop_id.is_some()).collect::>(); - //println!("lineup {} vs {}", searchable_stop_times_from_gtfs.len(), searchable_stop_times_from_bus.len()); - let mut timedifference:Option = None; + let mut timedifference: Option = None; //search through the entire trip list - 'search_trip_list: for (tripcounter,lookingtrip) in possible_trips.iter().rev().enumerate() { - let searchable_stop_times_from_gtfs = possible_trips[tripcounter].stop_times.iter().filter(|stop_time| stop_time.departure_time.is_some()).collect::>(); - let searchable_stop_times_stop_ids = searchable_stop_times_from_gtfs.iter().map(|stop_time| stop_time.stop.id.clone()).collect::>(); - - let searchable_stop_times_bus_filterable = searchable_stop_times_from_bus.iter().filter(|arrival_estimate| searchable_stop_times_stop_ids.contains(arrival_estimate.stop_id.as_ref().unwrap())).collect::>(); - - if searchable_stop_times_bus_filterable.len() > 0 { - let bus_arrival_timestamp = chrono::DateTime::parse_from_rfc3339(searchable_stop_times_bus_filterable[0].arrival_at.as_ref().unwrap()).unwrap().timestamp() - midnight_timestamp; - - // println!("{}, {}", searchable_stop_times_from_gtfs[0].departure_time.as_ref().unwrap(), bus_arrival_timestamp); - let time_diff = *searchable_stop_times_from_gtfs[0].departure_time.as_ref().unwrap() as i32 - bus_arrival_timestamp as i32; - //positive means the bus would get there before the scheduled time - //negative means that it's late, as the projected arrival time is greater than the scheduled time - - //bias algorithm towards late buses i think? - let score:f64 = { - if time_diff < 0 { - time_diff.abs() as f64 - } else { - time_diff.abs() as f64 - } - }; - - if true { - // println!("time diff: {}", time_diff); - match timedifference { - Some(x) => { - //if the previous trip comparison is worse - if (x.abs() as f64) > score { + 'search_trip_list: for (tripcounter, lookingtrip) in + possible_trips.iter().rev().enumerate() + { + let searchable_stop_times_from_gtfs = possible_trips[tripcounter] + .stop_times + .iter() + .filter(|stop_time| stop_time.departure_time.is_some()) + .collect::>(); + let searchable_stop_times_stop_ids = searchable_stop_times_from_gtfs + .iter() + .map(|stop_time| stop_time.stop.id.clone()) + .collect::>(); + + let searchable_stop_times_bus_filterable = + searchable_stop_times_from_bus + .iter() + .filter(|arrival_estimate| { + searchable_stop_times_stop_ids + .contains(arrival_estimate.stop_id.as_ref().unwrap()) + }) + .collect::>(); + + if searchable_stop_times_bus_filterable.len() > 0 { + let bus_arrival_timestamp = chrono::DateTime::parse_from_rfc3339( + searchable_stop_times_bus_filterable[0] + .arrival_at + .as_ref() + .unwrap(), + ) + .unwrap() + .timestamp() + - midnight_timestamp; + + // println!("{}, {}", searchable_stop_times_from_gtfs[0].departure_time.as_ref().unwrap(), bus_arrival_timestamp); + let time_diff = *searchable_stop_times_from_gtfs[0] + .departure_time + .as_ref() + .unwrap() + as i32 + - bus_arrival_timestamp as i32; + //positive means the bus would get there before the scheduled time + //negative means that it's late, as the projected arrival time is greater than the scheduled time + + //bias algorithm towards late buses i think? + let score: f64 = { + if time_diff < 0 { + time_diff.abs() as f64 + } else { + time_diff.abs() as f64 + } + }; + + if true { + // println!("time diff: {}", time_diff); + match timedifference { + Some(x) => { + //if the previous trip comparison is worse + if (x.abs() as f64) > score { + timedifference = Some(time_diff); + closest_past_trip = + Some(possible_trips[tripcounter].id.clone()); + remove_before_index = Some(tripcounter); + delay_hashmap.insert( + bus.vehicle_id.as_ref().unwrap().clone(), + time_diff, + ); + } else { + break 'search_trip_list; + } + } + None => { timedifference = Some(time_diff); - closest_past_trip = Some(possible_trips[tripcounter].id.clone()); - remove_before_index = Some(tripcounter); - delay_hashmap.insert(bus.vehicle_id.as_ref().unwrap().clone(), time_diff); - } else { - break 'search_trip_list; + closest_past_trip = + Some(possible_trips[tripcounter].id.clone()); + delay_hashmap.insert( + bus.vehicle_id.as_ref().unwrap().clone(), + time_diff, + ); } - }, - None => { - timedifference = Some(time_diff); - closest_past_trip = Some(possible_trips[tripcounter].id.clone()); - delay_hashmap.insert(bus.vehicle_id.as_ref().unwrap().clone(), time_diff); } + } else { } } else { + println!( + "No trips left to search for {}", + bus.vehicle_id.as_ref().unwrap().clone() + ); } - } else { - println!("No trips left to search for {}", bus.vehicle_id.as_ref().unwrap().clone()); - - - } } if remove_before_index.is_some() { possible_trips.drain(0..remove_before_index.unwrap() + 1); } - + let closest_past_trip = match closest_past_trip { Some(x) => x, - None => { - String::from("GoAnteaters!") - } + None => String::from("GoAnteaters!"), }; - println!("Route: {}, Bus: {} assigned to {}", gtfs.get_route(route_id).unwrap().short_name, bus.call_name.as_ref().unwrap(), &closest_past_trip); - vehicle_id_to_trip_id.insert(bus.vehicle_id.as_ref().unwrap().clone(), closest_past_trip); + println!( + "Route: {}, Bus: {} assigned to {}", + gtfs.get_route(route_id).unwrap().short_name, + bus.call_name.as_ref().unwrap(), + &closest_past_trip + ); + vehicle_id_to_trip_id + .insert(bus.vehicle_id.as_ref().unwrap().clone(), closest_past_trip); } } } + } - } - - println!("vehicle_id_to_trip_id: {:?}", vehicle_id_to_trip_id); - + println!("vehicle_id_to_trip_id: {:?}", vehicle_id_to_trip_id); - println!("Delay Hashmap {:#?}", delay_hashmap); + println!("Delay Hashmap {:#?}", delay_hashmap); import_data.data.iter().for_each(|(agency_id, buses)| { if agency_id.as_str() == "1039" { for (i, bus) in buses.iter().enumerate() { - let bruhposition = Some(gtfs_rt::Position { latitude: bus.location.lat, longitude: bus.location.lng, bearing: bus.heading, odometer: None, - speed: Some((bus.speed.unwrap_or(0.0) as f32 * (1.0/3.6)) as f32), + speed: Some((bus.speed.unwrap_or(0.0) as f32 * (1.0 / 3.6)) as f32), }); let trip_ident = gtfs_rt::TripDescriptor { - trip_id: Some(vehicle_id_to_trip_id.get(bus.vehicle_id.as_ref().unwrap()).unwrap().clone()), + trip_id: Some( + vehicle_id_to_trip_id + .get(bus.vehicle_id.as_ref().unwrap()) + .unwrap() + .clone(), + ), route_id: Some(bus.route_id.as_ref().unwrap().clone()), direction_id: Some(0), start_time: None, @@ -391,60 +479,84 @@ let mut delay_hashmap: HashMap = HashMap::new(); let vehicleposition = gtfs_rt::FeedEntity { id: bus.vehicle_id.as_ref().unwrap().clone(), - vehicle: Some( - gtfs_rt::VehiclePosition { - trip: Some(trip_ident.clone()), - vehicle: Some(gtfs_rt::VehicleDescriptor { - id: Some(bus.vehicle_id.as_ref().unwrap().clone()), - label: Some(bus.call_name.as_ref().unwrap().clone()), - license_plate: None, - }), - position: bruhposition, - current_stop_sequence: None, - stop_id: None, - current_status: None, - timestamp: Some(bus.last_updated_on.parse::>().unwrap().timestamp() as u64), - congestion_level: None, - occupancy_status: None - } - ), + vehicle: Some(gtfs_rt::VehiclePosition { + trip: Some(trip_ident.clone()), + vehicle: Some(gtfs_rt::VehicleDescriptor { + id: Some(bus.vehicle_id.as_ref().unwrap().clone()), + label: Some(bus.call_name.as_ref().unwrap().clone()), + license_plate: None, + }), + position: bruhposition, + current_stop_sequence: None, + stop_id: None, + current_status: None, + timestamp: Some( + bus.last_updated_on + .parse::>() + .unwrap() + .timestamp() as u64, + ), + congestion_level: None, + occupancy_status: None, + }), is_deleted: None, trip_update: None, - alert: None + alert: None, }; - let this_trip_length = std::cmp::min(arrival_estimates_length_to_end(bus) + 2, bus.arrival_estimates.len() as i32); - - let this_trip_updates:Vec = bus.arrival_estimates[0..this_trip_length as usize].to_vec(); - - let time_updates:Vec = this_trip_updates.iter().map(|x| gtfs_rt::trip_update::StopTimeUpdate { - stop_sequence: None, - stop_id: x.stop_id.clone(), - //unix time - arrival: Some(gtfs_rt::trip_update::StopTimeEvent { - time: Some(chrono::DateTime::parse_from_rfc3339(x.arrival_at.as_ref().unwrap()).unwrap().timestamp()), - delay: None, - uncertainty: None - - }), - departure: None, - schedule_relationship: Some(0) - }).collect::>(); + let this_trip_length = std::cmp::min( + arrival_estimates_length_to_end(bus) + 2, + bus.arrival_estimates.len() as i32, + ); + + let this_trip_updates: Vec = + bus.arrival_estimates[0..this_trip_length as usize].to_vec(); + + let time_updates: Vec = this_trip_updates + .iter() + .map(|x| gtfs_rt::trip_update::StopTimeUpdate { + stop_sequence: None, + stop_id: x.stop_id.clone(), + //unix time + arrival: Some(gtfs_rt::trip_update::StopTimeEvent { + time: Some( + chrono::DateTime::parse_from_rfc3339( + x.arrival_at.as_ref().unwrap(), + ) + .unwrap() + .timestamp(), + ), + delay: None, + uncertainty: None, + }), + departure: None, + schedule_relationship: Some(0), + }) + .collect::>(); let tripupdate = gtfs_rt::FeedEntity { id: bus.vehicle_id.as_ref().unwrap().clone(), vehicle: None, is_deleted: None, - trip_update: Some( - gtfs_rt::TripUpdate { trip: trip_ident, vehicle: - Some(gtfs_rt::VehicleDescriptor { + trip_update: Some(gtfs_rt::TripUpdate { + trip: trip_ident, + vehicle: Some(gtfs_rt::VehicleDescriptor { id: Some(bus.vehicle_id.as_ref().unwrap().clone()), label: Some(bus.call_name.as_ref().unwrap().clone()), license_plate: None, - }) - , stop_time_update: time_updates, timestamp: Some(bus.last_updated_on.parse::>().unwrap().timestamp() as u64), delay: delay_hashmap.get(bus.vehicle_id.as_ref().unwrap()).map(|x| *x as i32), } - ), - alert: None + }), + stop_time_update: time_updates, + timestamp: Some( + bus.last_updated_on + .parse::>() + .unwrap() + .timestamp() as u64, + ), + delay: delay_hashmap + .get(bus.vehicle_id.as_ref().unwrap()) + .map(|x| *x as i32), + }), + alert: None, }; listoftripupdates.push(tripupdate); @@ -457,10 +569,12 @@ let mut delay_hashmap: HashMap = HashMap::new(); header: gtfs_rt::FeedHeader { gtfs_realtime_version: String::from("2.0"), incrementality: None, - timestamp: Some(SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs()), + timestamp: Some( + SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), + ), }, entity: list_of_vehicle_positions, }; @@ -469,81 +583,69 @@ let mut delay_hashmap: HashMap = HashMap::new(); header: gtfs_rt::FeedHeader { gtfs_realtime_version: String::from("2.0"), incrementality: None, - timestamp: Some(SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs()), + timestamp: Some( + SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), + ), }, entity: listoftripupdates, }; - // println!("Encoded to protobuf! {:#?}", entire_feed_vehicles); + // println!("Encoded to protobuf! {:#?}", entire_feed_vehicles); //let entire_feed_vehicles = entire_feed_vehicles.encode_to_vec(); - let buf:Vec = entire_feed_vehicles.encode_to_vec(); - let trip_buf:Vec = trip_feed.encode_to_vec(); - - let _: () = con - .set( - format!( - "gtfsrt|{}|{}", - "f-anteaterexpress~rt", "vehicles" - ), - &buf, - ) - .unwrap(); - - let _:() = con - .set( - format!( - "gtfsrt|{}|{}", - "f-anteaterexpress~rt", "trips" - ), - &trip_buf, - ) - .unwrap(); - - let _:() = con - .set( - format!( - "gtfsrttime|{}|{}", - "f-anteaterexpress~rt", "vehicles" - ), - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() - .to_string(), - ) - .unwrap(); - - let _:() = con - .set( - format!( - "gtfsrttime|{}|{}", - "f-anteaterexpress~rt", "trips" - ), - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() - .to_string(), - ).unwrap(); - - let _ :()= con - .set( - format!( - "gtfsrtexists|{}", - "f-anteaterexpress~rt" - ), - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() - .to_string(), - ) - .unwrap(); + let buf: Vec = entire_feed_vehicles.encode_to_vec(); + let trip_buf: Vec = trip_feed.encode_to_vec(); + + let _: () = con + .set( + format!("gtfsrt|{}|{}", "f-anteaterexpress~rt", "vehicles"), + &buf, + ) + .unwrap(); + + let _: () = con + .set( + format!("gtfsrt|{}|{}", "f-anteaterexpress~rt", "trips"), + &trip_buf, + ) + .unwrap(); + + let _: () = con + .set( + format!("gtfsrttime|{}|{}", "f-anteaterexpress~rt", "vehicles"), + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() + .to_string(), + ) + .unwrap(); + + let _: () = con + .set( + format!("gtfsrttime|{}|{}", "f-anteaterexpress~rt", "trips"), + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() + .to_string(), + ) + .unwrap(); + + let _: () = con + .set( + format!("gtfsrtexists|{}", "f-anteaterexpress~rt"), + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() + .to_string(), + ) + .unwrap(); println!("Inserted into Redis!"); diff --git a/src/static/process.rs b/src/static/process.rs index 165df7d..70380ed 100644 --- a/src/static/process.rs +++ b/src/static/process.rs @@ -1,4 +1,5 @@ use csv::Writer; +use geo::GeodesicLength; use geo_types::geometry::LineString; use gtfs_structures; use polyline; @@ -9,14 +10,11 @@ use std::collections::{BTreeMap, HashMap}; use std::fs; use std::fs::File; use std::io::Write; -use geo::GeodesicLength; mod timeutil; use timeutil::string_h_m_to_u32; use geojson::GeoJson; - - #[derive(Deserialize, Debug, Serialize)] struct ScheduleManualInput { name: String, @@ -24,13 +22,13 @@ struct ScheduleManualInput { timed: Vec, files: Vec, extrasegments: Option>>, - overrideshape: Option + overrideshape: Option, } #[derive(Copy, Clone)] struct ComparisonOfSegments { distance: f64, - index: usize + index: usize, } #[derive(Deserialize, Debug, Serialize)] @@ -135,11 +133,11 @@ struct TranslocStops { } #[derive(Debug, Clone)] - struct Segmentinfo { - segment_id: String, - data: Vec, - length: f64 - } +struct Segmentinfo { + segment_id: String, + data: Vec, + length: f64, +} fn hextorgb(x: String) -> rgb::RGB { let numberarray: Vec = x.chars().collect(); @@ -160,6 +158,7 @@ fn hextorgb(x: String) -> rgb::RGB { }; } +// Written by Kyler Chin #[tokio::main] async fn main() { let blockedfromboardings = vec!["201"]; @@ -266,7 +265,7 @@ async fn main() { .serialize(gtfs_structures::Stop { id: stop.stop_id.clone(), code: Some(stop.code.clone()), - name: stop.name.clone().replace(" Stop ",""), + name: stop.name.clone().replace(" Stop ", ""), description: stop.description.clone(), location_type: gtfs_structures::LocationType::StopPoint, parent_station: None, @@ -306,20 +305,28 @@ async fn main() { segments_map.insert(segment_id.clone(), segment_polyline.clone()); - segment_polyline.coords().enumerate().for_each(|(i, coord)| - segments_polyline_debug.serialize(debugpolyline { - lat: coord.y, - lng: coord.x, - segment_id: segment_id.clone(), - number: i - }).unwrap()); - + segment_polyline + .coords() + .enumerate() + .for_each(|(i, coord)| { + segments_polyline_debug + .serialize(debugpolyline { + lat: coord.y, + lng: coord.x, + segment_id: segment_id.clone(), + number: i, + }) + .unwrap() + }); } - let segments_polyline_debug_csv = String::from_utf8(segments_polyline_debug.into_inner().unwrap()).unwrap(); + let segments_polyline_debug_csv = + String::from_utf8(segments_polyline_debug.into_inner().unwrap()).unwrap(); let mut segments_polyline_debug_file = File::create("segments_polyline_debug.csv").unwrap(); - segments_polyline_debug_file.write_all(segments_polyline_debug_csv.as_bytes()).unwrap(); + segments_polyline_debug_file + .write_all(segments_polyline_debug_csv.as_bytes()) + .unwrap(); println!("segments_map: {:?}", segments_map); @@ -331,11 +338,11 @@ async fn main() { for route in routes_array { // println!("Route: {:?}", route); - //make the schedule here + //make the schedule here - let data_to_use = manualhashmap.get(&route.short_name).unwrap(); + let data_to_use = manualhashmap.get(&route.short_name).unwrap(); - println!("data_to_use: {:?}", data_to_use); + println!("data_to_use: {:?}", data_to_use); let mut vec_of_trips: Vec = vec![]; let mut vec_of_stop_times: Vec = vec![]; @@ -360,17 +367,17 @@ async fn main() { }) .unwrap(); - let mut arrayofsegments: Vec = vec![]; + let mut arrayofsegments: Vec = vec![]; - let mut sourcedata = route.segments.clone(); + let mut sourcedata = route.segments.clone(); - if data_to_use.extrasegments.is_some() { - for x in data_to_use.extrasegments.clone().unwrap() { + if data_to_use.extrasegments.is_some() { + for x in data_to_use.extrasegments.clone().unwrap() { println!("Joining extra {:?} to route {}", x, route.route_id); - sourcedata.push(x.clone()); - } + sourcedata.push(x.clone()); } - + } + for segment_part in &sourcedata { let segment_id = segment_part[0].clone(); //can be "forward" or "backward" @@ -379,113 +386,140 @@ async fn main() { let mut segment = segments_map.get(&segment_id).unwrap().clone().into_inner(); if segment_direction == "backward" { - println!("reversing segment {} of route {}", segment_id, route.route_id); + println!( + "reversing segment {} of route {}", + segment_id, route.route_id + ); segment.reverse(); } - - let dataofthisseg = segment.clone().into_iter().collect::>(); + + let dataofthisseg = segment + .clone() + .into_iter() + .collect::>(); //Lazy o(n^2) algo arrayofsegments.push(Segmentinfo { segment_id: segment_id.clone(), data: dataofthisseg.clone(), length: geo::geometry::LineString::from_iter( - dataofthisseg.iter().map(|x| geo::geometry::Point::new(x.x, x.y)) + dataofthisseg + .iter() + .map(|x| geo::geometry::Point::new(x.x, x.y)), ) - .geodesic_length() + .geodesic_length(), }); - - } - //sort array - arrayofsegments.sort_by(|a, b| bool::cmp(&(a.length < b.length), &(b.length < a.length))); - - println!("segments {:?}", arrayofsegments.iter().map(|x| x.length).collect::>()); + //sort array + arrayofsegments + .sort_by(|a, b| bool::cmp(&(a.length < b.length), &(b.length < a.length))); - let mut segmentordered:LineString = LineString(vec![]); + println!( + "segments {:?}", + arrayofsegments + .iter() + .map(|x| x.length) + .collect::>() + ); - segmentordered = segmentordered.into_iter().chain(arrayofsegments[0].data.clone().into_iter()).collect::>(); + let mut segmentordered: LineString = LineString(vec![]); - println!("segmentordered {:?}", segmentordered); + segmentordered = segmentordered + .into_iter() + .chain(arrayofsegments[0].data.clone().into_iter()) + .collect::>(); - arrayofsegments.remove(0); + println!("segmentordered {:?}", segmentordered); - while arrayofsegments.len() > 0 { - - let mut closest_end_to_my_start: Option = None; - let mut closest_start_to_my_end: Option = None; + arrayofsegments.remove(0); - let coordsofmyself:Vec = segmentordered.clone().into_iter().map(|coord| coord).collect::>(); + while arrayofsegments.len() > 0 { + let mut closest_end_to_my_start: Option = None; + let mut closest_start_to_my_end: Option = None; - let my_start = coordsofmyself[0].clone(); - let my_end = segmentordered[coordsofmyself.len() - 1].clone(); + let coordsofmyself: Vec = segmentordered + .clone() + .into_iter() + .map(|coord| coord) + .collect::>(); - - // println!("my start {:?}", my_start); + let my_start = coordsofmyself[0].clone(); + let my_end = segmentordered[coordsofmyself.len() - 1].clone(); - for (index, segment) in arrayofsegments.iter().enumerate() { - let start_partner = segment.data[0].clone(); - let end_partner = segment.data[segment.data.len() - 1].clone(); + // println!("my start {:?}", my_start); - //println!("their end {:?}", end_partner); - let my_start_to_their_end_distance = vincenty_core::distance_from_coords( - &my_start, - &end_partner - ).unwrap(); + for (index, segment) in arrayofsegments.iter().enumerate() { + let start_partner = segment.data[0].clone(); + let end_partner = segment.data[segment.data.len() - 1].clone(); - let my_end_to_their_start_distance = vincenty_core::distance_from_coords( - &my_end, - &start_partner - ).unwrap(); + //println!("their end {:?}", end_partner); + let my_start_to_their_end_distance = + vincenty_core::distance_from_coords(&my_start, &end_partner).unwrap(); - - if (closest_end_to_my_start.is_none() || my_start_to_their_end_distance < closest_end_to_my_start.unwrap().distance) { - closest_end_to_my_start = Some(ComparisonOfSegments { - distance: my_start_to_their_end_distance, - index: index - }); - } - - if (closest_start_to_my_end.is_none() || my_end_to_their_start_distance < closest_start_to_my_end.unwrap().distance) { - closest_start_to_my_end = Some(ComparisonOfSegments { - distance: my_end_to_their_start_distance, - index: index - }); - } + let my_end_to_their_start_distance = + vincenty_core::distance_from_coords(&my_end, &start_partner).unwrap(); - - } - - let mut index_to_remove :Option = None; - - if closest_end_to_my_start.unwrap().distance < closest_start_to_my_end.unwrap().distance { - //join partner + me - segmentordered = arrayofsegments[closest_end_to_my_start.unwrap().index].data.clone().into_iter().chain(segmentordered.into_iter()).collect::>(); + if (closest_end_to_my_start.is_none() + || my_start_to_their_end_distance + < closest_end_to_my_start.unwrap().distance) + { + closest_end_to_my_start = Some(ComparisonOfSegments { + distance: my_start_to_their_end_distance, + index: index, + }); + } - //drop the segment - index_to_remove = Some(closest_end_to_my_start.unwrap().index); - } else { - //join me + partner + if (closest_start_to_my_end.is_none() + || my_end_to_their_start_distance + < closest_start_to_my_end.unwrap().distance) + { + closest_start_to_my_end = Some(ComparisonOfSegments { + distance: my_end_to_their_start_distance, + index: index, + }); + } + } - segmentordered = segmentordered.into_iter().chain(arrayofsegments[closest_start_to_my_end.unwrap().index].data.clone().into_iter()).collect::>(); + let mut index_to_remove: Option = None; - //drop the segment - index_to_remove = Some(closest_start_to_my_end.unwrap().index); - } - - if index_to_remove.is_some() { - arrayofsegments.remove(index_to_remove.unwrap()); - } - - } + if closest_end_to_my_start.unwrap().distance + < closest_start_to_my_end.unwrap().distance + { + //join partner + me + segmentordered = arrayofsegments[closest_end_to_my_start.unwrap().index] + .data + .clone() + .into_iter() + .chain(segmentordered.into_iter()) + .collect::>(); + + //drop the segment + index_to_remove = Some(closest_end_to_my_start.unwrap().index); + } else { + //join me + partner + + segmentordered = segmentordered + .into_iter() + .chain( + arrayofsegments[closest_start_to_my_end.unwrap().index] + .data + .clone() + .into_iter(), + ) + .collect::>(); + + //drop the segment + index_to_remove = Some(closest_start_to_my_end.unwrap().index); + } - + if index_to_remove.is_some() { + arrayofsegments.remove(index_to_remove.unwrap()); + } + } //now they have to be seperated and put into the shapes list if data_to_use.overrideshape.is_some() { - - let file = File::open(data_to_use.overrideshape.clone().unwrap()).unwrap(); let geojson = GeoJson::from_reader(file).unwrap(); @@ -511,7 +545,13 @@ async fn main() { }; if linestring.is_some() { - segmentordered = LineString::from(linestring.unwrap().into_iter().map(|x| geo_types::Point::new(x[0], x[1])).collect::>>()); + segmentordered = LineString::from( + linestring + .unwrap() + .into_iter() + .map(|x| geo_types::Point::new(x[0], x[1])) + .collect::>>(), + ); } } @@ -533,8 +573,6 @@ async fn main() { seqcount = seqcount + 1; } - - for file in data_to_use.files.iter() { // let scheduletimes = fs::read_to_string(format!("schedules/{}", file.name).as_str()).unwrap().as_str(); @@ -566,15 +604,13 @@ async fn main() { arrivals: Option, departures: Option, enabled: bool, - boardingsallowed: bool + boardingsallowed: bool, } let mut tripnumber = 1; //for each row for row in vecofrows { - - let mut scheduleforthistime: Vec = vec![]; for i in 2..row.len() { @@ -603,38 +639,42 @@ async fn main() { println!("repeat {:?} times", repeatnumberoftimes); - - /* - rowvec.push(Stoptimepre { - stop_id: stopcode_to_stopid - .get(&routelooppoint.clone()) - .unwrap() - .clone(), - stop_code: routelooppoint.clone(), - timed: data_to_use.timed.contains(&routelooppoint.clone()), - arrivals: None, - departures: None, - enabled: true, - }); */ - - let firsttimedindex = scheduleforthistime.iter().position(|x| x.contains(":")).unwrap(); - let initialtime = string_h_m_to_u32(scheduleforthistime[firsttimedindex].clone()); - let mut offset = 0; - - for eachtrip in 0..repeatnumberoftimes { + /* + rowvec.push(Stoptimepre { + stop_id: stopcode_to_stopid + .get(&routelooppoint.clone()) + .unwrap() + .clone(), + stop_code: routelooppoint.clone(), + timed: data_to_use.timed.contains(&routelooppoint.clone()), + arrivals: None, + departures: None, + enabled: true, + }); */ + + let firsttimedindex = scheduleforthistime + .iter() + .position(|x| x.contains(":")) + .unwrap(); + let initialtime = + string_h_m_to_u32(scheduleforthistime[firsttimedindex].clone()); + let mut offset = 0; + + for eachtrip in 0..repeatnumberoftimes { //inclusive, cancel everything from 0 until let mut cancelindexpre: Option = None; - let mut canceldeparturesindex:Option = None; + let mut canceldeparturesindex: Option = None; let mut rowvec: Vec = vec![]; //process each stop along this trip - let whichintervaltouse = repeatinterval[eachtrip as usize % repeatinterval.len() as usize]; + let whichintervaltouse = + repeatinterval[eachtrip as usize % repeatinterval.len() as usize]; let mut stopnumber = 0; - - - for (routeordercounter, routelooppoint) in data_to_use.routeorder.iter().enumerate() { + for (routeordercounter, routelooppoint) in + data_to_use.routeorder.iter().enumerate() + { let mut calcboardingsallowed = true; if routeordercounter == data_to_use.routeorder.len() - 1 { @@ -655,14 +695,17 @@ async fn main() { arrivals: None, departures: None, enabled: true, - boardingsallowed: calcboardingsallowed + boardingsallowed: calcboardingsallowed, }); //use scheduleforthistime to get the initial times let mut departuretime = None; if headervec.contains(&routelooppoint.clone()) { - let index = headervec.iter().position(|r| r.as_str() == routelooppoint.clone().as_str()).unwrap(); + let index = headervec + .iter() + .position(|r| r.as_str() == routelooppoint.clone().as_str()) + .unwrap(); let stringofdeparturetime = scheduleforthistime[index].clone(); @@ -670,15 +713,19 @@ async fn main() { departuretime = None; } else { if stringofdeparturetime.contains(":") { - departuretime = Some(string_h_m_to_u32( - stringofdeparturetime.clone(), - ) + offset); + departuretime = Some( + string_h_m_to_u32(stringofdeparturetime.clone()) + + offset, + ); } } if stringofdeparturetime.contains("*") { cancelindexpre = Some(stopnumber - 1); - println!("Cancelled all service 0 to {}", cancelindexpre.unwrap()) + println!( + "Cancelled all service 0 to {}", + cancelindexpre.unwrap() + ) } if stringofdeparturetime.contains("$") { @@ -706,11 +753,9 @@ async fn main() { rowvec[stopnumber].departures = departuretime; - - stopnumber = stopnumber + 1; } - + offset = offset + whichintervaltouse as u32; tripnumber = tripnumber + 1; @@ -722,8 +767,9 @@ async fn main() { true => "monthurs", false => "fri", }; - - let trip_id = format!("{}-{}-{}", route.short_name, tripnumber, schedulename); + + let trip_id = + format!("{}-{}-{}", route.short_name, tripnumber, schedulename); let rawtripgtfs = gtfs_structures::RawTrip { id: trip_id.clone(), @@ -735,7 +781,7 @@ async fn main() { trip_short_name: None, shape_id: Some(this_routes_shape_id.clone()), bikes_allowed: gtfs_structures::BikesAllowedType::AtLeastOneBike, - wheelchair_accessible: gtfs_structures::Availability::Available + wheelchair_accessible: gtfs_structures::Availability::Available, }; tripswriter.serialize(rawtripgtfs).unwrap(); @@ -752,7 +798,9 @@ async fn main() { stop_headsign: None, pickup_type: match stoptimefinal.boardingsallowed { true => gtfs_structures::PickupDropOffType::Regular, - false => gtfs_structures::PickupDropOffType::NotAvailable, + false => { + gtfs_structures::PickupDropOffType::NotAvailable + } }, drop_off_type: gtfs_structures::PickupDropOffType::Regular, shape_dist_traveled: None, @@ -760,17 +808,18 @@ async fn main() { true => gtfs_structures::TimepointType::Exact, false => gtfs_structures::TimepointType::Approximate, }, - continuous_pickup: gtfs_structures::ContinuousPickupDropOff::NotAvailable, - continuous_drop_off: gtfs_structures::ContinuousPickupDropOff::NotAvailable, + continuous_pickup: + gtfs_structures::ContinuousPickupDropOff::NotAvailable, + continuous_drop_off: + gtfs_structures::ContinuousPickupDropOff::NotAvailable, }; stoptimeswriter.serialize(rawstoptimegtfs).unwrap(); - - stopcounterfinal = stopcounterfinal + 1; - } + stopcounterfinal = stopcounterfinal + 1; + } } - } + } } } } @@ -799,34 +848,38 @@ async fn main() { let mut calendarwriter = Writer::from_writer(vec![]); - let start_date = chrono::naive::NaiveDate::from_ymd_opt(2024,1,8).unwrap(); - let end_date = chrono::naive::NaiveDate::from_ymd_opt(2024,3,22).unwrap(); - - calendarwriter.serialize(gtfs_structures::Calendar { - id: String::from("monthurs"), - monday: true, - tuesday: true, - wednesday: true, - thursday: true, - friday: true, - saturday: true, - sunday: true, - start_date: start_date.clone(), - end_date: end_date.clone(), - }).unwrap(); - - calendarwriter.serialize(gtfs_structures::Calendar { - id: String::from("fri"), - monday: false, - tuesday: false, - wednesday: false, - thursday: false, - friday: true, - saturday: false, - sunday: false, - start_date: start_date.clone(), - end_date: end_date.clone(), - }).unwrap(); + let start_date = chrono::naive::NaiveDate::from_ymd_opt(2024, 1, 8).unwrap(); + let end_date = chrono::naive::NaiveDate::from_ymd_opt(2024, 3, 22).unwrap(); + + calendarwriter + .serialize(gtfs_structures::Calendar { + id: String::from("monthurs"), + monday: true, + tuesday: true, + wednesday: true, + thursday: true, + friday: true, + saturday: true, + sunday: true, + start_date: start_date.clone(), + end_date: end_date.clone(), + }) + .unwrap(); + + calendarwriter + .serialize(gtfs_structures::Calendar { + id: String::from("fri"), + monday: false, + tuesday: false, + wednesday: false, + thursday: false, + friday: true, + saturday: false, + sunday: false, + start_date: start_date.clone(), + end_date: end_date.clone(), + }) + .unwrap(); let calendar_csv = String::from_utf8(calendarwriter.into_inner().unwrap()).unwrap(); let mut calendarfile = File::create("anteater_gtfs/calendar.txt").unwrap(); @@ -837,17 +890,20 @@ async fn main() { let cancellations = [ //MLK JR DAY - ((2024,01,15), "monthurs"), + ((2024, 01, 15), "monthurs"), //President's day - ((2024,02,19), "monthurs") + ((2024, 02, 19), "monthurs"), ]; for cancel in cancellations { - calendardateswriter.serialize(gtfs_structures::CalendarDate { - service_id: String::from(cancel.1), - date: chrono::naive::NaiveDate::from_ymd_opt(cancel.0.0,cancel.0.1, cancel.0.2).unwrap(), - exception_type: gtfs_structures::Exception::Deleted, - }).unwrap(); + calendardateswriter + .serialize(gtfs_structures::CalendarDate { + service_id: String::from(cancel.1), + date: chrono::naive::NaiveDate::from_ymd_opt(cancel.0 .0, cancel.0 .1, cancel.0 .2) + .unwrap(), + exception_type: gtfs_structures::Exception::Deleted, + }) + .unwrap(); } //write now @@ -855,27 +911,29 @@ async fn main() { let calendardates_csv = String::from_utf8(calendardateswriter.into_inner().unwrap()).unwrap(); let mut calendardatesfile = File::create("anteater_gtfs/calendar_dates.txt").unwrap(); - calendardatesfile.write_all(calendardates_csv.as_bytes()).unwrap(); + calendardatesfile + .write_all(calendardates_csv.as_bytes()) + .unwrap(); //now validate it - let gtfs = gtfs_structures::GtfsReader::default() - .read("anteater_gtfs"); - - match gtfs { - Ok(gtfs) => { - println!("Valid"); - }, - Err(e) => { - println!("error: {:?}", e); - } - } + let gtfs = gtfs_structures::GtfsReader::default().read("anteater_gtfs"); + + match gtfs { + Ok(gtfs) => { + println!("Valid"); + } + Err(e) => { + println!("error: {:?}", e); + } + } } fn cleanupstring(x: String) -> String { - return x.replace("!","").replace("#", "") - .replace("*","").replace("$", "").replace(" ", ""); + return x + .replace("!", "") + .replace("#", "") + .replace("*", "") + .replace("$", "") + .replace(" ", ""); } - - - diff --git a/src/static/timeutil.rs b/src/static/timeutil.rs index b73dfa5..02b06e6 100644 --- a/src/static/timeutil.rs +++ b/src/static/timeutil.rs @@ -1,12 +1,17 @@ -pub fn string_h_m_to_u32(x:String) -> u32 { +pub fn string_h_m_to_u32(x: String) -> u32 { //split string into h and m based on : - let mut input = x.clone().replace("!","").replace("#", "") - .replace("*","").replace("$", "").replace(" ", ""); + let mut input = x + .clone() + .replace("!", "") + .replace("#", "") + .replace("*", "") + .replace("$", "") + .replace(" ", ""); //it's okay if it runs over 24, that's expected let mut h = input.split(":").nth(0).unwrap().parse::().unwrap(); let mut m = input.split(":").nth(1).unwrap().parse::().unwrap(); (h * 3600) + (m * 60) -} \ No newline at end of file +} From a002639d3acf08e109492113b1edaf0be99ee2a2 Mon Sep 17 00:00:00 2001 From: Kyler Chin <7539174+kylerchin@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:37:29 -0800 Subject: [PATCH 3/5] Create new zip file --- anteater_express.zip | Bin 26587 -> 0 bytes anteater_gtfs.zip | Bin 0 -> 26675 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 anteater_express.zip create mode 100644 anteater_gtfs.zip diff --git a/anteater_express.zip b/anteater_express.zip deleted file mode 100644 index bf748969924883ea74cd457a47ba5fc7ac20ad52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26587 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 diff --git a/anteater_gtfs.zip b/anteater_gtfs.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca9e25fbcd27eda12feb30da3000d47f3368365d GIT binary patch literal 26675 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 YcXo1i6ao%dAkaqOdmdo$#xa)kA4$n$sQ>@~ literal 0 HcmV?d00001 From b434d2d83385bfa73f7501d714b747a1be805a78 Mon Sep 17 00:00:00 2001 From: Kyler Chin <7539174+kylerchin@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:38:47 -0800 Subject: [PATCH 4/5] Correct file name and documentation --- README.md | 2 +- anteater_gtfs.zip | Bin 26675 -> 26663 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8dbcd05..6cd3785 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ cargo run --bin processstatic 3. Zip the folder `anteater_gtfs` with no underlying folder inside the final zip ```bash -zip -r anteater_express.zip anteater_express/ +zip -r anteater_gtfs.zip anteater_express/ ``` Now your Anteater static file is done! diff --git a/anteater_gtfs.zip b/anteater_gtfs.zip index ca9e25fbcd27eda12feb30da3000d47f3368365d..eac788c1593c29600832d87b9672c895832f5b20 100644 GIT binary patch literal 26663 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 YcXo1i6ao%dAkaqOdmdo$#xa)kA4$n$sQ>@~ From c72907446d966b230e8f98037a7c585734c7b7c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 06:43:15 +0000 Subject: [PATCH 5/5] Bump geo-types from 0.7.11 to 0.7.13 Bumps [geo-types](https://github.com/georust/geo) from 0.7.11 to 0.7.13. - [Changelog](https://github.com/georust/geo/blob/main/CHANGES.md) - [Commits](https://github.com/georust/geo/compare/geo-types-0.7.11...geo-types-0.7.13) --- updated-dependencies: - dependency-name: geo-types dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 91f6ebe..b6d331f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -674,9 +674,9 @@ dependencies = [ [[package]] name = "geo-types" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9705398c5c7b26132e74513f4ee7c1d7dafd786004991b375c172be2be0eecaa" +checksum = "9ff16065e5720f376fbced200a5ae0f47ace85fd70b7e54269790281353b6d61" dependencies = [ "approx", "num-traits", diff --git a/Cargo.toml b/Cargo.toml index c4e678f..9693e93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ chrono-tz = "0.8.3" color-eyre = "0.6.2" csv = "1.3.0" geo = "0.26.0" -geo-types = "0.7.11" +geo-types = "0.7.13" geojson = "0.24.1" gtfs-rt = "0.3.0" gtfs-structures = "0.36.1"