From 548adf06235c326c76ca597bf3c8ae495c83e859 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:49:44 -0600 Subject: [PATCH 01/11] add: mock bustime server for dev; update: README with new dev instructions; add: DEV env var and DEV mode to main.go; - rename Config.Url to .BaseUrl as it was causing confusion in Scraper.fetch(), where we compute the complete url with params, etc - use the mock bustime server when in DEV mode in ./main.go - fix log typo in VehicleBroadcaster.Start() --- .gitignore | 1 + Makefile | 14 +++++++- README.md | 47 ++++++++++++++++---------- main.go | 40 ++++++++++++++++++---- mock_bustime_server/go.mod | 3 ++ mock_bustime_server/main.go | 19 +++++++++++ mock_bustime_server/mock_vehicles.json | 34 +++++++++++++++++++ 7 files changed, 132 insertions(+), 26 deletions(-) create mode 100644 mock_bustime_server/go.mod create mode 100644 mock_bustime_server/main.go create mode 100644 mock_bustime_server/mock_vehicles.json diff --git a/.gitignore b/.gitignore index efaac16..8901b85 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,6 @@ go.work node_modules nola-transit-map +server .DS_Store diff --git a/Makefile b/Makefile index 4aa0adb..f564bdc 100644 --- a/Makefile +++ b/Makefile @@ -12,5 +12,17 @@ run: show: open http://localhost:8080 +### DEV ### +export CLEVER_DEVICES_KEY := DEV +export CLEVER_DEVICES_IP := DEV + +mock: + cd mock_bustime_server && go build && ./server + +dev: + npm install + go build + ./nola-transit-map || echo "Couldn't run the binary." + watch: - npm run watch + npm run watch \ No newline at end of file diff --git a/README.md b/README.md index 09e28ff..b8b5329 100644 --- a/README.md +++ b/README.md @@ -5,41 +5,52 @@ Realtime map of all New Orleans public transit vehicles (streetcars and busses). For some reason, going from the old RTA app to the new Le Pass app has resulted in the loss of realtime functionality. Not having realtime makes getting around the city extremely frustrating. This map is just a stop gap to get the data out to people again. -### Needs to be done +### Needs to be Done * somehow communicate the staleness of the data to the user (we have a status indicator for the connection but could use the vehicle timestamps) * nice icons and popups for the vehicles * show the user's location on the map -### Developing +### Contributing -You need to get the key from Ben on Slack in #civic-hacking. If you aren't in the NOLA Devs slack here is an invite: https://nola.slack.com/join/shared_invite/zt-4882ja82-iGm2yO6KCxsi2aGJ9vnsUQ +Join #civic-hacking in Nola Devs Slack channel, where this project is discussed: https://nola.slack.com/join/shared_invite/zt-4882ja82-iGm2yO6KCxsi2aGJ9vnsUQ. -You need a few things your machine on your machine to build the project. If you are an `asdf` user there is a .tool-versions file with acceptable versions of node, npm, and go, but not make to keep from conflicting with system build tools. +The API key is coveted. Only a few chosen ones will be granted access, hence the included mock server that is used in DEV mode. + +You need a few things on your machine to build the project. If you are an `asdf` user there is a .tool-versions file with acceptable versions of node, npm, and go, but not make to keep from conflicting with system build tools. * node and npm * go * make -First build. This builds the frontend application and compiles the go code: +### To Run in Development: -``` -make build -``` +1. Run the mock bustime server in a terminal. The mock server serves fake vehicle data. Vehicles will appear stationary. + ``` + # terminal tab 1 - Mock bustime server + make mock + ``` -To run: +2. Run the main server _in another terminal_. + ``` + # terminal tab 2 - Go backend + make dev DEV=1 + ``` -``` -make run CLEVER_DEVICES_KEY=thekey CLEVER_DEVICES_IP=ipaddr -``` +3. (Optional) If working on the frontend, you probably want changes to trigger a build automatically. You'll still have to refresh the page to see changes. +_In a 3rd terminal_: + ``` + # terminal tab 3 - React frontend + make watch + ``` -Open the frontend [http://localhost:8080](http://localhost:8080) +4. Open the frontend [http://localhost:8080](http://localhost:8080) + You may need to refresh the page after the browser window is automatically opened by the `make` command. -You need to run `make build` (or `npm run build`) to build the frontend code. It doesn't auto-build. You can run an auto-build in a new tab: +### To Run in Production: +Add the API and IP env vars to `make run`: ``` -make watch -``` - -but you still need to refresh the page \ No newline at end of file +make build && make run CLEVER_DEVICES_KEY=thekey CLEVER_DEVICES_IP=ipaddr +``` \ No newline at end of file diff --git a/main.go b/main.go index 0a5f091..84779d7 100644 --- a/main.go +++ b/main.go @@ -30,6 +30,8 @@ var ( ReadBufferSize: 1024, WriteBufferSize: 1024, } + + DEV = false ) type VehicleTimestamp struct { @@ -127,7 +129,7 @@ type BustimeResponse struct { type Config struct { Key string `yaml:"key"` Interval time.Duration `yaml:"interval"` - Url string `yaml:"url"` + BaseUrl string `yaml:"url"` } type Scraper struct { @@ -135,6 +137,9 @@ type Scraper struct { config *Config } +const cleverDevicesUrlFormatter = "https://%s/bustime/api/v3/getvehicles" +const mockCleverDevicesUrl = "http://localhost:8081/getvehicles" + func NewScraper() *Scraper { api_key, ok := os.LookupEnv("CLEVER_DEVICES_KEY") if !ok { @@ -145,16 +150,22 @@ func NewScraper() *Scraper { panic("Need to set environment variable CLEVER_DEVICES_KEY. Try `make run CLEVER_DEVICES_KEY=thekey`. Get key from Ben on slack") } + baseUrl := fmt.Sprintf(cleverDevicesUrlFormatter, ip) + if DEV { + baseUrl = mockCleverDevicesUrl + } config := &Config{ - Url: fmt.Sprintf("https://%s/bustime/api/v3/getvehicles", ip), + BaseUrl: baseUrl, Interval: 10 * time.Second, Key: api_key, } + tr := &http.Transport{ MaxIdleConnsPerHost: 1024, TLSHandshakeTimeout: 0 * time.Second, } client := &http.Client{Transport: tr} + return &Scraper{ client, config, @@ -170,16 +181,24 @@ func (s *Scraper) Start(vs chan []Vehicle) { } } +const vehicleQueryFormatter = "%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json" + func (v *Scraper) fetch() *BustimeData { key := v.config.Key - baseURL := v.config.Url - url := fmt.Sprintf("%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json", baseURL, key) + baseURL := v.config.BaseUrl + url := fmt.Sprintf(vehicleQueryFormatter, baseURL, key) + if DEV { + url = fmt.Sprintf(baseURL) + log.Printf("Using mock bustime server URL %s \n", baseURL) + } resp, err := v.client.Get(url) + log.Println("Scraper response:", resp) + if resp.Body != nil { defer resp.Body.Close() } if err != nil { - log.Println(err) + log.Println("ERROR: Scraper response error: ", err) } body, readErr := ioutil.ReadAll(resp.Body) if readErr != nil { @@ -220,10 +239,9 @@ func (b *VehicleBroadcaster) Unregister(c VehicleChannel) { } func (b *VehicleBroadcaster) Start() { - //config := bustime.GetConfig() scraper := NewScraper() defer scraper.Close() - log.Println("start sraper") + log.Println("Start scraper") go scraper.Start(b.incoming) b.broadcast() } @@ -341,6 +359,14 @@ func (s *Server) serveWs(w http.ResponseWriter, r *http.Request) { } func main() { + // in DEV mode if the env var exists + if _, exists := os.LookupEnv("DEV"); exists { + DEV = true + log.Println("Set to DEV mode.") + } + server := NewServer() server.Start() + + log.Printf("\n", server) } diff --git a/mock_bustime_server/go.mod b/mock_bustime_server/go.mod new file mode 100644 index 0000000..d089498 --- /dev/null +++ b/mock_bustime_server/go.mod @@ -0,0 +1,3 @@ +module server + +go 1.23.3 diff --git a/mock_bustime_server/main.go b/mock_bustime_server/main.go new file mode 100644 index 0000000..be416ea --- /dev/null +++ b/mock_bustime_server/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "log" + "net/http" +) + +const port = ":8081" + +func main() { + http.HandleFunc( + "/getvehicles", + func(w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, "./mock_vehicles.json") + }, + ) + log.Printf("\n\nMock bustime server is running at: http://localhost%s \n", port) + log.Fatal(http.ListenAndServe(port, nil)) +} diff --git a/mock_bustime_server/mock_vehicles.json b/mock_bustime_server/mock_vehicles.json new file mode 100644 index 0000000..9d0284e --- /dev/null +++ b/mock_bustime_server/mock_vehicles.json @@ -0,0 +1,34 @@ +{ + "bustime-response": { + "vehicle": [ + { + "vid": "155", + "tmstmp": "20200827 11:51", + "lat": "29.962149326173048", + "lon": "-90.05214051918121", + "hdg": "357", + "pid": 275, + "rt": "5", + "des": "Saratoga at Canal", + "pdist": 10122, + "dly": false, + "spd": 20, + "tatripid": "3130339", + "tablockid": "15", + "zone": "", + "srvtmstmp": "20200827 11:51", + "oid": "445", + "or": true, + "rid": "501", + "blk": 2102, + "tripid": 982856020 + } + ], + "error": [ + { + "rt": "5", + "msg": "No clue what this message should look like." + } + ] + } +} From 180b172cfd9128b13b21ab5a801b514999f625a3 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Tue, 26 Nov 2024 21:05:30 -0600 Subject: [PATCH 02/11] add: full mock vehicles response; add: log scraper url; correct url var in Scraper.fetch() --- main.go | 6 +- mock_bustime_server/mock_vehicles.json | 2799 +++++++++++++++++++++++- 2 files changed, 2770 insertions(+), 35 deletions(-) diff --git a/main.go b/main.go index 84779d7..202f4d5 100644 --- a/main.go +++ b/main.go @@ -188,9 +188,10 @@ func (v *Scraper) fetch() *BustimeData { baseURL := v.config.BaseUrl url := fmt.Sprintf(vehicleQueryFormatter, baseURL, key) if DEV { - url = fmt.Sprintf(baseURL) + url = baseURL log.Printf("Using mock bustime server URL %s \n", baseURL) } + log.Println("Scraper URL:", url) resp, err := v.client.Get(url) log.Println("Scraper response:", resp) @@ -359,7 +360,6 @@ func (s *Server) serveWs(w http.ResponseWriter, r *http.Request) { } func main() { - // in DEV mode if the env var exists if _, exists := os.LookupEnv("DEV"); exists { DEV = true log.Println("Set to DEV mode.") @@ -367,6 +367,4 @@ func main() { server := NewServer() server.Start() - - log.Printf("\n", server) } diff --git a/mock_bustime_server/mock_vehicles.json b/mock_bustime_server/mock_vehicles.json index 9d0284e..86c3570 100644 --- a/mock_bustime_server/mock_vehicles.json +++ b/mock_bustime_server/mock_vehicles.json @@ -1,34 +1,2771 @@ { "bustime-response": { - "vehicle": [ - { - "vid": "155", - "tmstmp": "20200827 11:51", - "lat": "29.962149326173048", - "lon": "-90.05214051918121", - "hdg": "357", - "pid": 275, - "rt": "5", - "des": "Saratoga at Canal", - "pdist": 10122, - "dly": false, - "spd": 20, - "tatripid": "3130339", - "tablockid": "15", - "zone": "", - "srvtmstmp": "20200827 11:51", - "oid": "445", - "or": true, - "rid": "501", - "blk": 2102, - "tripid": 982856020 - } - ], - "error": [ - { - "rt": "5", - "msg": "No clue what this message should look like." - } - ] + "vehicle": [ + { + "vid": "2409", + "tmstmp": "20241126 20:55", + "lat": "29.96765833333333", + "lon": "-90.08832333333334", + "hdg": "110", + "pid": 677, + "rt": "PI", + "des": "", + "pdist": 43618, + "dly": false, + "spd": 0, + "tatripid": "3668461", + "origtatripno": "3668461", + "tablockid": "19", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1829", + "or": false, + "rid": "913", + "lwid1": "N/A", + "lwid2": "000913", + "blk": 3102, + "tripid": 7417024, + "tripdyn": 0, + "stst": 70920, + "stsd": "2024-11-26" + }, + { + "vid": "2414", + "tmstmp": "20241126 20:55", + "lat": "29.968194999999998", + "lon": "-90.08832", + "hdg": "227", + "pid": 677, + "rt": "PI", + "des": "", + "pdist": 43675, + "dly": false, + "spd": 10, + "tatripid": "3667507", + "origtatripno": "3667507", + "tablockid": "262", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1798", + "or": false, + "rid": "6205", + "lwid1": "N/A", + "lwid2": "006205", + "blk": 5502, + "tripid": 7366024, + "tripdyn": 0, + "stst": 73320, + "stsd": "2024-11-26" + }, + { + "vid": "338", + "tmstmp": "20241126 20:55", + "lat": "29.958843333333334", + "lon": "-90.084045", + "hdg": "298", + "pid": 686, + "rt": "PI", + "des": "", + "pdist": 3120, + "dly": false, + "spd": 28, + "tatripid": "3651193", + "origtatripno": "3651193", + "tablockid": "461", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1504", + "or": false, + "rid": "6107", + "lwid1": "N/A", + "lwid2": "006107", + "blk": 9402, + "tripid": 7320024, + "tripdyn": 0, + "stst": 75240, + "stsd": "2024-11-26" + }, + { + "vid": "347", + "tmstmp": "20241126 20:55", + "lat": "29.967608333333335", + "lon": "-90.08825", + "hdg": "32", + "pid": 686, + "rt": "PI", + "des": "", + "pdist": 6144, + "dly": true, + "spd": 0, + "tatripid": "3668925", + "origtatripno": "3668925", + "tablockid": "33", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1918", + "or": false, + "rid": "310", + "lwid1": "N/A", + "lwid2": "000310", + "blk": 6802, + "tripid": 7272024, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "2401", + "tmstmp": "20241126 20:55", + "lat": "29.954868198102766", + "lon": "-90.0753552843829", + "hdg": "117", + "pid": 691, + "rt": "PI", + "des": "", + "pdist": 81, + "dly": false, + "spd": 0, + "tatripid": "3667074", + "origtatripno": "3667074", + "tablockid": "2103", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1711", + "or": false, + "rid": "10306", + "lwid1": "N/A", + "lwid2": "010306", + "blk": 3802, + "tripid": 7301024, + "tripdyn": 0, + "stst": 74880, + "stsd": "2024-11-26" + }, + { + "vid": "288", + "tmstmp": "20241126 20:55", + "lat": "29.967736666666664", + "lon": "-90.08841499999998", + "hdg": "129", + "pid": 697, + "rt": "PI", + "des": "Not In Service", + "pdist": 15833, + "dly": true, + "spd": 0, + "tatripid": "3652459", + "origtatripno": "3652459", + "tablockid": "491", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "22", + "or": false, + "rid": "9105", + "lwid1": "N/A", + "lwid2": "009105", + "blk": 9802, + "tripid": 7267024, + "tripdyn": 0, + "stst": 72120, + "stsd": "2024-11-26" + }, + { + "vid": "350", + "tmstmp": "20241126 20:53", + "lat": "29.977351666666664", + "lon": "-90.03861666666666", + "hdg": "284", + "pid": 682, + "rt": "PO", + "des": "", + "pdist": 6233, + "dly": true, + "spd": 20, + "tatripid": "3652203", + "origtatripno": "3652203", + "tablockid": "384", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:53", + "oid": "1522", + "or": false, + "rid": "8405", + "lwid1": "N/A", + "lwid2": "008405", + "blk": 7802, + "tripid": 7147023, + "tripdyn": 0, + "stst": 73200, + "stsd": "2024-11-26" + }, + { + "vid": "81713", + "tmstmp": "20241126 20:55", + "lat": "29.95286666666667", + "lon": "-90.05624166666666", + "hdg": "102", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "306", + "tmstmp": "20241126 20:55", + "lat": "29.967660000000002", + "lon": "-90.08857000000002", + "hdg": "212", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "948", + "tmstmp": "20241126 20:55", + "lat": "29.95009166666667", + "lon": "-90.12898333333332", + "hdg": "339", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "951", + "tmstmp": "20241126 20:55", + "lat": "29.949756666666666", + "lon": "-90.12951166666666", + "hdg": "227", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "315", + "tmstmp": "20241126 20:55", + "lat": "29.96755333333333", + "lon": "-90.08871333333333", + "hdg": "215", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "317", + "tmstmp": "20241126 20:55", + "lat": "29.968276666666664", + "lon": "-90.08911166666667", + "hdg": "359", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "280", + "tmstmp": "20241126 20:55", + "lat": "29.96795666666667", + "lon": "-90.08980166666667", + "hdg": "50", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "285", + "tmstmp": "20241126 20:55", + "lat": "29.967476666666666", + "lon": "-90.08837833333334", + "hdg": "58", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "961", + "tmstmp": "20241126 20:55", + "lat": "29.949813333333335", + "lon": "-90.12931833333332", + "hdg": "287", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "334", + "tmstmp": "20241126 20:55", + "lat": "29.96776333333333", + "lon": "-90.08840333333335", + "hdg": "124", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "2413", + "tmstmp": "20241126 20:55", + "lat": "29.967816666666668", + "lon": "-90.08943666666667", + "hdg": "121", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "2411", + "tmstmp": "20241126 20:55", + "lat": "29.95640443650701", + "lon": "-90.07356802737672", + "hdg": "217", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "228", + "tmstmp": "20241126 20:55", + "lat": "29.968101666666666", + "lon": "-90.08957333333335", + "hdg": "359", + "pid": -1, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "N/A", + "origtatripno": "", + "tablockid": "N/A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "N/A", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "N/A", + "tripdyn": 0 + }, + { + "vid": "922", + "tmstmp": "20241126 20:55", + "lat": "29.950098333333337", + "lon": "-90.12895833333332", + "hdg": "187", + "pid": 0, + "rt": "U", + "des": "", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "null", + "origtatripno": "", + "tablockid": "412", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "787", + "or": true, + "rid": "N/A", + "lwid1": "N/A", + "lwid2": "001204", + "blk": 8802, + "tripdyn": 0 + }, + { + "vid": "333", + "tmstmp": "20241126 20:55", + "lat": "29.96495614534672", + "lon": "-90.11105632380969", + "hdg": "222", + "pid": 568, + "rt": "3", + "des": "Jefferson Hwy. at Causeway Blvd.", + "pdist": 13711, + "dly": false, + "spd": 16, + "tatripid": "3669000", + "origtatripno": "3669000", + "tablockid": "73", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1902", + "or": false, + "rid": "313", + "lwid1": "N/A", + "lwid2": "000313", + "blk": 11802, + "tripid": 18020, + "tripdyn": 0, + "stst": 74400, + "stsd": "2024-11-26" + }, + { + "vid": "323", + "tmstmp": "20241126 20:55", + "lat": "29.96049496084649", + "lon": "-90.17014471488912", + "hdg": "55", + "pid": 571, + "rt": "3", + "des": "Main Library-CBD via Ochsner", + "pdist": 6157, + "dly": false, + "spd": 26, + "tatripid": "3668997", + "origtatripno": "3668997", + "tablockid": "43", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1415", + "or": false, + "rid": "311", + "lwid1": "N/A", + "lwid2": "000311", + "blk": 8902, + "tripid": 5086020, + "tripdyn": 0, + "stst": 75060, + "stsd": "2024-11-26" + }, + { + "vid": "224", + "tmstmp": "20241126 20:55", + "lat": "29.955519255361367", + "lon": "-90.12067931342773", + "hdg": "41", + "pid": 571, + "rt": "3", + "des": "Main Library-CBD via Ochsner", + "pdist": 24727, + "dly": false, + "spd": 3, + "tatripid": "3668926", + "origtatripno": "3668926", + "tablockid": "83", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1967", + "or": false, + "rid": "314", + "lwid1": "N/A", + "lwid2": "000314", + "blk": 12202, + "tripid": 3033020, + "tripdyn": 0, + "stst": 73800, + "stsd": "2024-11-26" + }, + { + "vid": "37449", + "tmstmp": "20241126 20:55", + "lat": "29.922166666666666", + "lon": "-89.97329833333333", + "hdg": "228", + "pid": 533, + "rt": "4", + "des": "Algiers", + "pdist": 2363, + "dly": false, + "spd": 0, + "tatripid": "3647265", + "origtatripno": "3647265", + "tablockid": "14", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "71003", + "or": false, + "rid": "401", + "lwid1": "N/A", + "lwid2": "000401", + "blk": 1302, + "tripid": 3675020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "290", + "tmstmp": "20241126 20:55", + "lat": "29.958801666666666", + "lon": "-90.00768000000001", + "hdg": "293", + "pid": 538, + "rt": "8", + "des": "Main Library-CBD via Arabi", + "pdist": 11, + "dly": false, + "spd": 0, + "tatripid": "3667230", + "origtatripno": "3667230", + "tablockid": "58", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1952", + "or": false, + "rid": "809", + "lwid1": "N/A", + "lwid2": "000809", + "blk": 10702, + "tripid": 5909020, + "tripdyn": 0, + "stst": 75600, + "stsd": "2024-11-26" + }, + { + "vid": "293", + "tmstmp": "20241126 20:55", + "lat": "29.9690613614157", + "lon": "-90.05011640818577", + "hdg": "284", + "pid": 538, + "rt": "8", + "des": "Main Library-CBD via Arabi", + "pdist": 14070, + "dly": false, + "spd": 0, + "tatripid": "3667229", + "origtatripno": "3667229", + "tablockid": "38", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1712", + "or": false, + "rid": "807", + "lwid1": "N/A", + "lwid2": "000807", + "blk": 7702, + "tripid": 5657020, + "tripdyn": 0, + "stst": 74520, + "stsd": "2024-11-26" + }, + { + "vid": "335", + "tmstmp": "20241126 20:55", + "lat": "29.95571557538049", + "lon": "-90.07344868833226", + "hdg": "37", + "pid": 561, + "rt": "8", + "des": "Arabi", + "pdist": 4800, + "dly": false, + "spd": 0, + "tatripid": "3667299", + "origtatripno": "3667299", + "tablockid": "68", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1873", + "or": false, + "rid": "810", + "lwid1": "N/A", + "lwid2": "000810", + "blk": 11402, + "tripid": 3400020, + "tripdyn": 0, + "stst": 75060, + "stsd": "2024-11-26" + }, + { + "vid": "275", + "tmstmp": "20241126 20:55", + "lat": "29.95962186168207", + "lon": "-90.01024887220316", + "hdg": "111", + "pid": 561, + "rt": "8", + "des": "Arabi", + "pdist": 27476, + "dly": false, + "spd": 24, + "tatripid": "3667298", + "origtatripno": "3667298", + "tablockid": "48", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1859", + "or": false, + "rid": "808", + "lwid1": "N/A", + "lwid2": "000808", + "blk": 9602, + "tripid": 169020, + "tripdyn": 0, + "stst": 73980, + "stsd": "2024-11-26" + }, + { + "vid": "341", + "tmstmp": "20241126 20:55", + "lat": "30.029876178782757", + "lon": "-89.9749707305829", + "hdg": "149", + "pid": 553, + "rt": "9", + "des": "Tchoupitoulas St. via Ochsner Baptist", + "pdist": 2130, + "dly": false, + "spd": 28, + "tatripid": "3668387", + "origtatripno": "3668387", + "tablockid": "89", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1977", + "or": false, + "rid": "916", + "lwid1": "N/A", + "lwid2": "000916", + "blk": 12302, + "tripid": 547020, + "tripdyn": 0, + "stst": 74340, + "stsd": "2024-11-26" + }, + { + "vid": "340", + "tmstmp": "20241126 20:55", + "lat": "29.925446932914742", + "lon": "-90.1020563268553", + "hdg": "174", + "pid": 553, + "rt": "9", + "des": "Tchoupitoulas St. via Ochsner Baptist", + "pdist": 72212, + "dly": false, + "spd": 27, + "tatripid": "3668386", + "origtatripno": "3668386", + "tablockid": "109", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1776", + "or": false, + "rid": "917", + "lwid1": "N/A", + "lwid2": "000917", + "blk": 3402, + "tripid": 6153020, + "tripdyn": 0, + "stst": 72540, + "stsd": "2024-11-26" + }, + { + "vid": "354", + "tmstmp": "20241126 20:55", + "lat": "0.0", + "lon": "0.0", + "hdg": "0", + "pid": 593, + "rt": "9", + "des": "N.O. East Hub via Ochsner Baptist", + "pdist": 3430, + "dly": false, + "spd": 0, + "tatripid": "3668459", + "origtatripno": "3668459", + "tablockid": "49", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1650", + "or": true, + "rid": "911", + "lwid1": "N/A", + "lwid2": "000911", + "blk": 9702, + "tripid": 1352020, + "tripdyn": 0, + "stst": 65160, + "stsd": "2024-11-26" + }, + { + "vid": "320", + "tmstmp": "20241126 20:55", + "lat": "29.96352663358928", + "lon": "-90.0889249708319", + "hdg": "37", + "pid": 593, + "rt": "9", + "des": "N.O. East Hub via Ochsner Baptist", + "pdist": 19068, + "dly": false, + "spd": 23, + "tatripid": "3668442", + "origtatripno": "3668442", + "tablockid": "59", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1545", + "or": false, + "rid": "915", + "lwid1": "N/A", + "lwid2": "000915", + "blk": 10802, + "tripid": 1695020, + "tripdyn": 0, + "stst": 74520, + "stsd": "2024-11-26" + }, + { + "vid": "269", + "tmstmp": "20241126 20:55", + "lat": "30.013222", + "lon": "-89.993124", + "hdg": "343", + "pid": 593, + "rt": "9", + "des": "N.O. East Hub via Ochsner Baptist", + "pdist": 57464, + "dly": false, + "spd": 34, + "tatripid": "3668441", + "origtatripno": "3668441", + "tablockid": "99", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1995", + "or": false, + "rid": "918", + "lwid1": "N/A", + "lwid2": "000918", + "blk": 12502, + "tripid": 1097020, + "tripdyn": 0, + "stst": 72720, + "stsd": "2024-11-26" + }, + { + "vid": "282", + "tmstmp": "20241126 20:55", + "lat": "29.939653121555104", + "lon": "-90.07216345687748", + "hdg": "13", + "pid": 555, + "rt": "11", + "des": "Children's Hospital \u003E\u003E Canal at Magazine", + "pdist": 22941, + "dly": false, + "spd": 17, + "tatripid": "3648067", + "origtatripno": "3648067", + "tablockid": "211", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "235", + "or": false, + "rid": "1104", + "lwid1": "N/A", + "lwid2": "001104", + "blk": 3902, + "tripid": 1314020, + "tripdyn": 0, + "stst": 73680, + "stsd": "2024-11-26" + }, + { + "vid": "278", + "tmstmp": "20241126 20:55", + "lat": "29.9386040009454", + "lon": "-90.07130309175989", + "hdg": "197", + "pid": 596, + "rt": "11", + "des": "Canal at Magazine \u003E\u003E Children's Hospital", + "pdist": 5040, + "dly": false, + "spd": 15, + "tatripid": "3648105", + "origtatripno": "3648105", + "tablockid": "511", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1683", + "or": false, + "rid": "1106", + "lwid1": "N/A", + "lwid2": "001106", + "blk": 10002, + "tripid": 1687020, + "tripdyn": 0, + "stst": 74880, + "stsd": "2024-11-26" + }, + { + "vid": "345", + "tmstmp": "20241126 20:55", + "lat": "29.916518333333336", + "lon": "-90.12737833333334", + "hdg": "289", + "pid": 596, + "rt": "11", + "des": "Canal at Magazine \u003E\u003E Children's Hospital", + "pdist": 27849, + "dly": false, + "spd": 0, + "tatripid": "3648104", + "origtatripno": "3648104", + "tablockid": "411", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1894", + "or": false, + "rid": "1105", + "lwid1": "N/A", + "lwid2": "001105", + "blk": 8602, + "tripid": 4413020, + "tripdyn": 0, + "stst": 73080, + "stsd": "2024-11-26" + }, + { + "vid": "920", + "tmstmp": "20241126 20:55", + "lat": "29.951078140017177", + "lon": "-90.07017651986784", + "hdg": "193", + "pid": 558, + "rt": "12", + "des": "Canal St. \u003E\u003E S. Carrollton at S. Claiborne", + "pdist": 1200, + "dly": false, + "spd": 0, + "tatripid": "3670137", + "origtatripno": "3670137", + "tablockid": "1012", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "724", + "or": false, + "rid": "1218", + "lwid1": "N/A", + "lwid2": "001218", + "blk": 3302, + "tripid": 6576020, + "tripdyn": 0, + "stst": 73980, + "stsd": "2024-11-26" + }, + { + "vid": "930", + "tmstmp": "20241126 20:55", + "lat": "29.95117448002808", + "lon": "-90.12519229272161", + "hdg": "42", + "pid": 558, + "rt": "12", + "des": "Canal St. \u003E\u003E S. Carrollton at S. Claiborne", + "pdist": 31787, + "dly": false, + "spd": 16, + "tatripid": "3670136", + "origtatripno": "3670136", + "tablockid": "212", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "787", + "or": false, + "rid": "1216", + "lwid1": "N/A", + "lwid2": "001204", + "blk": 4202, + "tripid": 4747020, + "tripdyn": 0, + "stst": 72780, + "stsd": "2024-11-26" + }, + { + "vid": "460", + "tmstmp": "20241126 20:55", + "lat": "29.936777908299298", + "lon": "-90.12620085453253", + "hdg": "132", + "pid": 588, + "rt": "12", + "des": "Canal St. via Garden District", + "pdist": 9426, + "dly": false, + "spd": 19, + "tatripid": "3670055", + "origtatripno": "3670055", + "tablockid": "1112", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "609", + "or": false, + "rid": "1217", + "lwid1": "N/A", + "lwid2": "001217", + "blk": 3502, + "tripid": 2916020, + "tripdyn": 0, + "stst": 74400, + "stsd": "2024-11-26" + }, + { + "vid": "934", + "tmstmp": "20241126 20:55", + "lat": "29.94574836065188", + "lon": "-90.07298438715135", + "hdg": "14", + "pid": 588, + "rt": "12", + "des": "Canal St. via Garden District", + "pdist": 31124, + "dly": false, + "spd": 9, + "tatripid": "3670054", + "origtatripno": "3670054", + "tablockid": "1212", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "767", + "or": false, + "rid": "1219", + "lwid1": "N/A", + "lwid2": "001219", + "blk": 3602, + "tripid": 4086020, + "tripdyn": 0, + "stst": 73200, + "stsd": "2024-11-26" + }, + { + "vid": "249", + "tmstmp": "20241126 20:55", + "lat": "29.93166200844894", + "lon": "-90.0930946865058", + "hdg": "337", + "pid": 536, + "rt": "27", + "des": "Delgado CC via Xavier", + "pdist": 14626, + "dly": false, + "spd": 9, + "tatripid": "3648850", + "origtatripno": "3648850", + "tablockid": "227", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1646", + "or": false, + "rid": "2704", + "lwid1": "N/A", + "lwid2": "002704", + "blk": 4302, + "tripid": 1970020, + "tripdyn": 0, + "stst": 74640, + "stsd": "2024-11-26" + }, + { + "vid": "328", + "tmstmp": "20241126 20:55", + "lat": "29.971497550552115", + "lon": "-90.11341482284713", + "hdg": "219", + "pid": 562, + "rt": "27", + "des": "Tchoup. Wal-Mart via Xavier", + "pdist": 9756, + "dly": false, + "spd": 4, + "tatripid": "3648827", + "origtatripno": "3648827", + "tablockid": "127", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1134", + "or": false, + "rid": "2703", + "lwid1": "N/A", + "lwid2": "002703", + "blk": 902, + "tripid": 3371020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "348", + "tmstmp": "20241126 20:55", + "lat": "29.961017147326707", + "lon": "-90.12308224299912", + "hdg": "244", + "pid": 606, + "rt": "31", + "des": "Children's Hospital", + "pdist": 36499, + "dly": false, + "spd": 26, + "tatripid": "3648986", + "origtatripno": "3648986", + "tablockid": "131", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1855", + "or": false, + "rid": "3103", + "lwid1": "N/A", + "lwid2": "003103", + "blk": 1102, + "tripid": 4957020, + "tripdyn": 0, + "stst": 73320, + "stsd": "2024-11-26" + }, + { + "vid": "308", + "tmstmp": "20241126 20:55", + "lat": "29.970454422278035", + "lon": "-90.10471897154947", + "hdg": "42", + "pid": 608, + "rt": "31", + "des": "Gentilly Woods Hub", + "pdist": 37939, + "dly": false, + "spd": 22, + "tatripid": "3648970", + "origtatripno": "3648970", + "tablockid": "231", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1626", + "or": false, + "rid": "3104", + "lwid1": "N/A", + "lwid2": "003104", + "blk": 4502, + "tripid": 3715020, + "tripdyn": 0, + "stst": 73200, + "stsd": "2024-11-26" + }, + { + "vid": "307", + "tmstmp": "20241126 20:55", + "lat": "29.978298004404774", + "lon": "-90.09355230254683", + "hdg": "313", + "pid": 612, + "rt": "32", + "des": "Children's Hospital", + "pdist": 16990, + "dly": false, + "spd": 22, + "tatripid": "3649088", + "origtatripno": "3649088", + "tablockid": "232", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "47", + "or": false, + "rid": "3203", + "lwid1": "N/A", + "lwid2": "003203", + "blk": 4602, + "tripid": 787020, + "tripdyn": 0, + "stst": 74400, + "stsd": "2024-11-26" + }, + { + "vid": "327", + "tmstmp": "20241126 20:55", + "lat": "29.928361666666667", + "lon": "-90.11708500000002", + "hdg": "16", + "pid": 616, + "rt": "32", + "des": "Main Library-CBD", + "pdist": 7219, + "dly": false, + "spd": 24, + "tatripid": "3649071", + "origtatripno": "3649071", + "tablockid": "132", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1117", + "or": true, + "rid": "3204", + "lwid1": "N/A", + "lwid2": "003204", + "blk": 1202, + "tripid": 2568020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "2022", + "tmstmp": "20241126 20:55", + "lat": "29.96988577193718", + "lon": "-90.09371087428566", + "hdg": "128", + "pid": 48, + "rt": "47", + "des": "Canal St. Ferry Terminal", + "pdist": 7531, + "dly": false, + "spd": 0, + "tatripid": "3649500", + "origtatripno": "3649500", + "tablockid": "247", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1867", + "or": false, + "rid": "4710", + "lwid1": "N/A", + "lwid2": "004710", + "blk": 4802, + "tripid": 6145020, + "tripdyn": 0, + "stst": 74760, + "stsd": "2024-11-26" + }, + { + "vid": "2019", + "tmstmp": "20241126 20:55", + "lat": "29.95580311922909", + "lon": "-90.07337871384308", + "hdg": "307", + "pid": 438, + "rt": "47", + "des": "Canal Ferry Terminal \u003E\u003E Cemeteries Transit Ctr.", + "pdist": 3334, + "dly": false, + "spd": 0, + "tatripid": "3649561", + "origtatripno": "3649561", + "tablockid": "447", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "722", + "or": false, + "rid": "4709", + "lwid1": "N/A", + "lwid2": "004709", + "blk": 9002, + "tripid": 3745020, + "tripdyn": 0, + "stst": 74760, + "stsd": "2024-11-26" + }, + { + "vid": "2012", + "tmstmp": "20241126 20:55", + "lat": "29.98270166666667", + "lon": "-90.11064999999999", + "hdg": "247", + "pid": 438, + "rt": "47", + "des": "Canal Ferry Terminal \u003E\u003E Cemeteries Transit Ctr.", + "pdist": 18907, + "dly": false, + "spd": 0, + "tatripid": "3649560", + "origtatripno": "3649560", + "tablockid": "347", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "706", + "or": false, + "rid": "4708", + "lwid1": "N/A", + "lwid2": "004708", + "blk": 6902, + "tripid": 1706020, + "tripdyn": 0, + "stst": 73440, + "stsd": "2024-11-26" + }, + { + "vid": "2006", + "tmstmp": "20241126 20:55", + "lat": "29.950294999999997", + "lon": "-90.06479499999999", + "hdg": "136", + "pid": 436, + "rt": "48", + "des": "City Park/Art Museum", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "3649914", + "origtatripno": "3649914", + "tablockid": "3448", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "668", + "or": false, + "rid": "4807", + "lwid1": "N/A", + "lwid2": "004807", + "blk": 8402, + "tripid": 3891020, + "tripdyn": 0, + "stst": 75420, + "stsd": "2024-11-26" + }, + { + "vid": "2004", + "tmstmp": "20241126 20:55", + "lat": "29.965764664828132", + "lon": "-90.08765649697565", + "hdg": "307", + "pid": 436, + "rt": "48", + "des": "City Park/Art Museum", + "pdist": 9056, + "dly": false, + "spd": 0, + "tatripid": "3649913", + "origtatripno": "3649913", + "tablockid": "3348", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "669", + "or": false, + "rid": "4806", + "lwid1": "N/A", + "lwid2": "004806", + "blk": 8302, + "tripid": 2607020, + "tripdyn": 0, + "stst": 74100, + "stsd": "2024-11-26" + }, + { + "vid": "2024", + "tmstmp": "20241126 20:55", + "lat": "29.983766666666664", + "lon": "-90.09023166666665", + "hdg": "51", + "pid": 436, + "rt": "48", + "des": "City Park/Art Museum", + "pdist": 18781, + "dly": true, + "spd": 0, + "tatripid": "3649912", + "origtatripno": "3649912", + "tablockid": "3248", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "619", + "or": false, + "rid": "4808", + "lwid1": "N/A", + "lwid2": "004808", + "blk": 8202, + "tripid": 6010020, + "tripdyn": 0, + "stst": 72780, + "stsd": "2024-11-26" + }, + { + "vid": "2015", + "tmstmp": "20241126 20:55", + "lat": "29.95759350944716", + "lon": "-90.07530815622025", + "hdg": "128", + "pid": 590, + "rt": "48", + "des": "Canal St. Ferry Terminal", + "pdist": 14322, + "dly": false, + "spd": 3, + "tatripid": "3649859", + "origtatripno": "3649859", + "tablockid": "3148", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "644", + "or": false, + "rid": "4805", + "lwid1": "N/A", + "lwid2": "004805", + "blk": 8102, + "tripid": 2839020, + "tripdyn": 0, + "stst": 74100, + "stsd": "2024-11-26" + }, + { + "vid": "2023", + "tmstmp": "20241126 20:55", + "lat": "29.945491666666666", + "lon": "-90.07821833333334", + "hdg": "300", + "pid": 639, + "rt": "49", + "des": "UPT \u003E\u003E French Market Station", + "pdist": 0, + "dly": false, + "spd": 0, + "tatripid": "3650155", + "origtatripno": "3650155", + "tablockid": "149", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "663", + "or": false, + "rid": "4905", + "lwid1": "N/A", + "lwid2": "004905", + "blk": 1702, + "tripid": 65020, + "tripdyn": 0, + "stst": 75600, + "stsd": "2024-11-26" + }, + { + "vid": "2007", + "tmstmp": "20241126 20:55", + "lat": "29.960833333333333", + "lon": "-90.05713666666666", + "hdg": "44", + "pid": 639, + "rt": "49", + "des": "UPT \u003E\u003E French Market Station", + "pdist": 13138, + "dly": false, + "spd": 0, + "tatripid": "3650154", + "origtatripno": "3650154", + "tablockid": "349", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "628", + "or": false, + "rid": "4904", + "lwid1": "N/A", + "lwid2": "004904", + "blk": 7002, + "tripid": 4674020, + "tripdyn": 0, + "stst": 73800, + "stsd": "2024-11-26" + }, + { + "vid": "2020", + "tmstmp": "20241126 20:55", + "lat": "29.951106914101587", + "lon": "-90.06599034199965", + "hdg": "301", + "pid": 642, + "rt": "49", + "des": "French Market Station \u003E\u003E UPT", + "pdist": 5739, + "dly": false, + "spd": 11, + "tatripid": "3650191", + "origtatripno": "3650191", + "tablockid": "249", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "759", + "or": false, + "rid": "4906", + "lwid1": "N/A", + "lwid2": "004902", + "blk": 4902, + "tripid": 5267020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "314", + "tmstmp": "20241126 20:55", + "lat": "29.955693333333336", + "lon": "-90.12033166666667", + "hdg": "250", + "pid": 594, + "rt": "51", + "des": "S. Carrollton via Main Library-CBD", + "pdist": 40204, + "dly": false, + "spd": 0, + "tatripid": "3650379", + "origtatripno": "3650379", + "tablockid": "15353", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1851", + "or": true, + "rid": "5302", + "lwid1": "N/A", + "lwid2": "005302", + "blk": 3702, + "tripid": 2274020, + "tripdyn": 0, + "stst": 73080, + "stsd": "2024-11-26" + }, + { + "vid": "252", + "tmstmp": "20241126 20:55", + "lat": "29.951851666666666", + "lon": "-90.10101833333334", + "hdg": "338", + "pid": 579, + "rt": "52", + "des": "UNO Via Main Library-CBD", + "pdist": 6395, + "dly": false, + "spd": 19, + "tatripid": "3650594", + "origtatripno": "3650594", + "tablockid": "25353", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1631", + "or": false, + "rid": "5301", + "lwid1": "N/A", + "lwid2": "005301", + "blk": 6202, + "tripid": 4344020, + "tripdyn": 0, + "stst": 74880, + "stsd": "2024-11-26" + }, + { + "vid": "284", + "tmstmp": "20241126 20:55", + "lat": "30.02845541261545", + "lon": "-90.06444001940392", + "hdg": "252", + "pid": 579, + "rt": "52", + "des": "UNO Via Main Library-CBD", + "pdist": 54265, + "dly": true, + "spd": 0, + "tatripid": "3650593", + "origtatripno": "3650593", + "tablockid": "152", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1968", + "or": false, + "rid": "5206", + "lwid1": "N/A", + "lwid2": "005206", + "blk": 1902, + "tripid": 4237020, + "tripdyn": 0, + "stst": 72120, + "stsd": "2024-11-26" + }, + { + "vid": "286", + "tmstmp": "20241126 20:55", + "lat": "29.954107013240797", + "lon": "-90.07526832127708", + "hdg": "206", + "pid": 589, + "rt": "52", + "des": "Hollygrove/Xavier via Main Library-CBD", + "pdist": 34279, + "dly": false, + "spd": 0, + "tatripid": "3650569", + "origtatripno": "3650569", + "tablockid": "352", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1783", + "or": false, + "rid": "5205", + "lwid1": "N/A", + "lwid2": "005205", + "blk": 7202, + "tripid": 374020, + "tripdyn": 0, + "stst": 73740, + "stsd": "2024-11-26" + }, + { + "vid": "279", + "tmstmp": "20241126 20:55", + "lat": "30.027778105150947", + "lon": "-90.06171135036386", + "hdg": "176", + "pid": 539, + "rt": "55", + "des": "Main Library-CBD via UNO/SUNO", + "pdist": 20014, + "dly": false, + "spd": 31, + "tatripid": "3650759", + "origtatripno": "3650759", + "tablockid": "555", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1455", + "or": false, + "rid": "5509", + "lwid1": "N/A", + "lwid2": "005509", + "blk": 10402, + "tripid": 813020, + "tripdyn": 0, + "stst": 74340, + "stsd": "2024-11-26" + }, + { + "vid": "297", + "tmstmp": "20241126 20:55", + "lat": "29.95375333333333", + "lon": "-90.07541833333335", + "hdg": "190", + "pid": 539, + "rt": "55", + "des": "Main Library-CBD via UNO/SUNO", + "pdist": 50099, + "dly": false, + "spd": 0, + "tatripid": "3650758", + "origtatripno": "3650758", + "tablockid": "255", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1934", + "or": true, + "rid": "5507", + "lwid1": "N/A", + "lwid2": "005507", + "blk": 5202, + "tripid": 1469020, + "tripdyn": 0, + "stst": 72660, + "stsd": "2024-11-26" + }, + { + "vid": "299", + "tmstmp": "20241126 20:55", + "lat": "29.990388212030087", + "lon": "-90.05840865461258", + "hdg": "355", + "pid": 564, + "rt": "55", + "des": "Gentilly Woods Hub via UNO/SUNO", + "pdist": 20901, + "dly": false, + "spd": 0, + "tatripid": "3650801", + "origtatripno": "3650801", + "tablockid": "455", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1986", + "or": false, + "rid": "5508", + "lwid1": "N/A", + "lwid2": "005508", + "blk": 9202, + "tripid": 1080020, + "tripdyn": 0, + "stst": 74280, + "stsd": "2024-11-26" + }, + { + "vid": "283", + "tmstmp": "20241126 20:55", + "lat": "30.018353330554962", + "lon": "-90.03567592813238", + "hdg": "159", + "pid": 564, + "rt": "55", + "des": "Gentilly Woods Hub via UNO/SUNO", + "pdist": 51550, + "dly": false, + "spd": 30, + "tatripid": "3650800", + "origtatripno": "3650800", + "tablockid": "155", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1862", + "or": false, + "rid": "5506", + "lwid1": "N/A", + "lwid2": "005506", + "blk": 2002, + "tripid": 6412020, + "tripdyn": 0, + "stst": 72600, + "stsd": "2024-11-26" + }, + { + "vid": "300", + "tmstmp": "20241126 20:55", + "lat": "29.954300626331747", + "lon": "-90.07474316149634", + "hdg": "48", + "pid": 628, + "rt": "57", + "des": "SUNO", + "pdist": 33120, + "dly": false, + "spd": 0, + "tatripid": "3651031", + "origtatripno": "3651031", + "tablockid": "357", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1703", + "or": false, + "rid": "5707", + "lwid1": "N/A", + "lwid2": "005707", + "blk": 7402, + "tripid": 149020, + "tripdyn": 0, + "stst": 73440, + "stsd": "2024-11-26" + }, + { + "vid": "303", + "tmstmp": "20241126 20:55", + "lat": "30.028188460208792", + "lon": "-90.05242139812444", + "hdg": "176", + "pid": 629, + "rt": "57", + "des": "Audubon Zoo via Tulane Univ.", + "pdist": 14518, + "dly": false, + "spd": 0, + "tatripid": "3651001", + "origtatripno": "3651001", + "tablockid": "457", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1906", + "or": true, + "rid": "MAN", + "lwid1": "0", + "lwid2": "0", + "blk": -1900558988, + "tripid": -730565389, + "tripdyn": 0, + "stst": 73500, + "stsd": "2024-11-26" + }, + { + "vid": "319", + "tmstmp": "20241126 20:55", + "lat": "29.953902613547275", + "lon": "-90.07531660878341", + "hdg": "194", + "pid": 629, + "rt": "57", + "des": "Audubon Zoo via Tulane Univ.", + "pdist": 40823, + "dly": false, + "spd": 0, + "tatripid": "3651001", + "origtatripno": "3651001", + "tablockid": "457", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1909", + "or": false, + "rid": "5708", + "lwid1": "N/A", + "lwid2": "005708", + "blk": 9302, + "tripid": 4192020, + "tripdyn": 0, + "stst": 73500, + "stsd": "2024-11-26" + }, + { + "vid": "301", + "tmstmp": "20241126 20:55", + "lat": "29.92646", + "lon": "-90.13189166666668", + "hdg": "18", + "pid": 629, + "rt": "57", + "des": "Audubon Zoo via Tulane Univ.", + "pdist": 67429, + "dly": true, + "spd": 0, + "tatripid": "3651000", + "origtatripno": "3651000", + "tablockid": "257", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1982", + "or": false, + "rid": "MAN", + "lwid1": "0", + "lwid2": "0", + "blk": -1108372680, + "tripid": -1277710698, + "tripdyn": 0, + "stst": 71280, + "stsd": "2024-11-26" + }, + { + "vid": "337", + "tmstmp": "20241126 20:55", + "lat": "30.01007326632373", + "lon": "-90.02084029256878", + "hdg": "351", + "pid": 578, + "rt": "61", + "des": "Village De'Lest via N.O. East Hub", + "pdist": 30024, + "dly": false, + "spd": 11, + "tatripid": "3651236", + "origtatripno": "3651236", + "tablockid": "561", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1766", + "or": false, + "rid": "6109", + "lwid1": "N/A", + "lwid2": "006109", + "blk": 10502, + "tripid": 5303020, + "tripdyn": 0, + "stst": 74100, + "stsd": "2024-11-26" + }, + { + "vid": "329", + "tmstmp": "20241126 20:55", + "lat": "30.03702579929512", + "lon": "-89.90975020601103", + "hdg": "249", + "pid": 578, + "rt": "61", + "des": "Village De'Lest via N.O. East Hub", + "pdist": 86409, + "dly": false, + "spd": 0, + "tatripid": "3651235", + "origtatripno": "3651235", + "tablockid": "361", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1861", + "or": false, + "rid": "6108", + "lwid1": "N/A", + "lwid2": "006108", + "blk": 7502, + "tripid": 4378020, + "tripdyn": 0, + "stst": 71940, + "stsd": "2024-11-26" + }, + { + "vid": "321", + "tmstmp": "20241126 20:55", + "lat": "30.029062724984435", + "lon": "-89.98264835072486", + "hdg": "333", + "pid": 580, + "rt": "61", + "des": "Main Library-CBD via N.O. East Hub", + "pdist": 25414, + "dly": false, + "spd": 11, + "tatripid": "3651194", + "origtatripno": "3651194", + "tablockid": "661", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1864", + "or": false, + "rid": "6110", + "lwid1": "N/A", + "lwid2": "006110", + "blk": 11202, + "tripid": 6246020, + "tripdyn": 0, + "stst": 74280, + "stsd": "2024-11-26" + }, + { + "vid": "325", + "tmstmp": "20241126 20:55", + "lat": "30.002497601643842", + "lon": "-90.03587942030947", + "hdg": "69", + "pid": 592, + "rt": "62", + "des": "N.O. East Hub via Wal-Mart", + "pdist": 23533, + "dly": false, + "spd": 0, + "tatripid": "3667509", + "origtatripno": "3667509", + "tablockid": "462", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1710", + "or": false, + "rid": "6209", + "lwid1": "N/A", + "lwid2": "006209", + "blk": 9502, + "tripid": 432020, + "tripdyn": 0, + "stst": 74880, + "stsd": "2024-11-26" + }, + { + "vid": "324", + "tmstmp": "20241126 20:55", + "lat": "30.042689493697996", + "lon": "-89.9801450006687", + "hdg": "67", + "pid": 592, + "rt": "62", + "des": "N.O. East Hub via Wal-Mart", + "pdist": 55465, + "dly": false, + "spd": 0, + "tatripid": "3667508", + "origtatripno": "3667508", + "tablockid": "362", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1505", + "or": false, + "rid": "6208", + "lwid1": "N/A", + "lwid2": "006208", + "blk": 7602, + "tripid": 4670020, + "tripdyn": 0, + "stst": 73380, + "stsd": "2024-11-26" + }, + { + "vid": "304", + "tmstmp": "20241126 20:55", + "lat": "30.0257650626177", + "lon": "-90.05613354141889", + "hdg": "260", + "pid": 655, + "rt": "66", + "des": "N.O. East Hub via UNO/SUNO", + "pdist": 32943, + "dly": false, + "spd": 28, + "tatripid": "3667858", + "origtatripno": "3667858", + "tablockid": "166", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1750", + "or": false, + "rid": "6602", + "lwid1": "N/A", + "lwid2": "006602", + "blk": 2402, + "tripid": 3977020, + "tripdyn": 0, + "stst": 74100, + "stsd": "2024-11-26" + }, + { + "vid": "346", + "tmstmp": "20241126 20:55", + "lat": "30.053354346622218", + "lon": "-89.93088979329276", + "hdg": "177", + "pid": 576, + "rt": "67", + "des": "N. O. East Hub via Michoud/NASA", + "pdist": 24054, + "dly": false, + "spd": 28, + "tatripid": "3651743", + "origtatripno": "3651743", + "tablockid": "167", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1465", + "or": false, + "rid": "6702", + "lwid1": "N/A", + "lwid2": "006702", + "blk": 2502, + "tripid": 4986020, + "tripdyn": 0, + "stst": 74580, + "stsd": "2024-11-26" + }, + { + "vid": "309", + "tmstmp": "20241126 20:55", + "lat": "30.067876073180805", + "lon": "-89.95351063008734", + "hdg": "49", + "pid": 546, + "rt": "68", + "des": "N.O. East Hub via Wal-Mart and Little Woods", + "pdist": 19628, + "dly": false, + "spd": 22, + "tatripid": "3651877", + "origtatripno": "3651877", + "tablockid": "268", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1530", + "or": false, + "rid": "6803", + "lwid1": "N/A", + "lwid2": "006803", + "blk": 5602, + "tripid": 4303020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "311", + "tmstmp": "20241126 20:55", + "lat": "30.038374943034942", + "lon": "-89.97677664946251", + "hdg": "235", + "pid": 546, + "rt": "68", + "des": "N.O. East Hub via Wal-Mart and Little Woods", + "pdist": 48761, + "dly": false, + "spd": 0, + "tatripid": "3651876", + "origtatripno": "3651876", + "tablockid": "168", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1437", + "or": false, + "rid": "6804", + "lwid1": "N/A", + "lwid2": "006804", + "blk": 2602, + "tripid": 3604020, + "tripdyn": 0, + "stst": 73260, + "stsd": "2024-11-26" + }, + { + "vid": "305", + "tmstmp": "20241126 20:55", + "lat": "29.976894332822788", + "lon": "-90.03748682663085", + "hdg": "194", + "pid": 583, + "rt": "80", + "des": "Elysian Fields via Delgado-Sidney Collier", + "pdist": 17658, + "dly": false, + "spd": 9, + "tatripid": "3651992", + "origtatripno": "3651992", + "tablockid": "280", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1816", + "or": false, + "rid": "8004", + "lwid1": "N/A", + "lwid2": "008004", + "blk": 5802, + "tripid": 439020, + "tripdyn": 0, + "stst": 74100, + "stsd": "2024-11-26" + }, + { + "vid": "316", + "tmstmp": "20241126 20:55", + "lat": "29.979644473058173", + "lon": "-90.05832951435622", + "hdg": "267", + "pid": 648, + "rt": "84", + "des": "Main Library-CBD", + "pdist": 21953, + "dly": false, + "spd": 26, + "tatripid": "3652173", + "origtatripno": "3652173", + "tablockid": "284", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1890", + "or": false, + "rid": "8404", + "lwid1": "N/A", + "lwid2": "008404", + "blk": 5902, + "tripid": 6396020, + "tripdyn": 0, + "stst": 74160, + "stsd": "2024-11-26" + }, + { + "vid": "302", + "tmstmp": "20241126 20:55", + "lat": "29.954668489795566", + "lon": "-90.01241414815708", + "hdg": "109", + "pid": 635, + "rt": "86", + "des": "Nunez CC \u003E\u003E Arabi", + "pdist": 43809, + "dly": false, + "spd": 2, + "tatripid": "3652335", + "origtatripno": "3652335", + "tablockid": "186", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1922", + "or": false, + "rid": "8602", + "lwid1": "N/A", + "lwid2": "008602", + "blk": 3002, + "tripid": 3485020, + "tripdyn": 0, + "stst": 73800, + "stsd": "2024-11-26" + }, + { + "vid": "2405", + "tmstmp": "20241126 20:55", + "lat": "29.93707051085529", + "lon": "-90.0830733985952", + "hdg": "253", + "pid": 577, + "rt": "91", + "des": "Tchoup. Wal-Mart", + "pdist": 32292, + "dly": false, + "spd": 4, + "tatripid": "3652461", + "origtatripno": "3652461", + "tablockid": "591", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1828", + "or": false, + "rid": "9107", + "lwid1": "N/A", + "lwid2": "009107", + "blk": 10902, + "tripid": 345020, + "tripdyn": 0, + "stst": 73500, + "stsd": "2024-11-26" + }, + { + "vid": "217", + "tmstmp": "20241126 20:55", + "lat": "29.954304113588865", + "lon": "-90.0748296915116", + "hdg": "75", + "pid": 597, + "rt": "91", + "des": "Cemeteries via Art Museum/Delgado CC", + "pdist": 16966, + "dly": false, + "spd": 0, + "tatripid": "3652500", + "origtatripno": "3652500", + "tablockid": "391", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1970", + "or": false, + "rid": "9106", + "lwid1": "N/A", + "lwid2": "009106", + "blk": 8002, + "tripid": 6379020, + "tripdyn": 0, + "stst": 74220, + "stsd": "2024-11-26" + }, + { + "vid": "339", + "tmstmp": "20241126 20:55", + "lat": "29.98354080795059", + "lon": "-90.11032712900641", + "hdg": "3", + "pid": 597, + "rt": "91", + "des": "Cemeteries via Art Museum/Delgado CC", + "pdist": 41807, + "dly": false, + "spd": 0, + "tatripid": "3652499", + "origtatripno": "3652499", + "tablockid": "691", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1865", + "or": false, + "rid": "9108", + "lwid1": "N/A", + "lwid2": "009108", + "blk": 11602, + "tripid": 5433020, + "tripdyn": 0, + "stst": 72420, + "stsd": "2024-11-26" + }, + { + "vid": "326", + "tmstmp": "20241126 20:55", + "lat": "29.930992600049347", + "lon": "-90.00115659289597", + "hdg": "297", + "pid": 550, + "rt": "103", + "des": "Main Library-CBD via Wilty Terminal", + "pdist": 6568, + "dly": false, + "spd": 41, + "tatripid": "3667075", + "origtatripno": "3667075", + "tablockid": "4103", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1931", + "or": false, + "rid": "10307", + "lwid1": "N/A", + "lwid2": "010307", + "blk": 8502, + "tripid": 1775020, + "tripdyn": 0, + "stst": 74400, + "stsd": "2024-11-26" + }, + { + "vid": "2407", + "tmstmp": "20241126 20:55", + "lat": "29.942661068733933", + "lon": "-90.04081479655825", + "hdg": "6", + "pid": 652, + "rt": "103", + "des": "Cutoff Rec Ctr. via Algiers Ferry", + "pdist": 38170, + "dly": false, + "spd": 21, + "tatripid": "3667105", + "origtatripno": "3667105", + "tablockid": "5103", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1951", + "or": false, + "rid": "10308", + "lwid1": "N/A", + "lwid2": "010308", + "blk": 9902, + "tripid": 173020, + "tripdyn": 0, + "stst": 73800, + "stsd": "2024-11-26" + }, + { + "vid": "313", + "tmstmp": "20241126 20:55", + "lat": "29.92066031552237", + "lon": "-90.04322029522534", + "hdg": "210", + "pid": 598, + "rt": "105", + "des": "Wilty Terminal via Wal-Mart", + "pdist": 45460, + "dly": false, + "spd": 0, + "tatripid": "3652852", + "origtatripno": "3652852", + "tablockid": "1105", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1419", + "or": false, + "rid": "10502", + "lwid1": "N/A", + "lwid2": "010502", + "blk": 302, + "tripid": 5156020, + "tripdyn": 0, + "stst": 73380, + "stsd": "2024-11-26" + }, + { + "vid": "322", + "tmstmp": "20241126 20:55", + "lat": "29.95472", + "lon": "-90.07530833333334", + "hdg": "120", + "pid": 547, + "rt": "114A", + "des": "Main Library-CBD via Wilty Terminal", + "pdist": 67673, + "dly": false, + "spd": 0, + "tatripid": "3652949", + "origtatripno": "3652949", + "tablockid": "4114A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1581", + "or": false, + "rid": "11413", + "lwid1": "N/A", + "lwid2": "011413", + "blk": 8702, + "tripid": 1844020, + "tripdyn": 0, + "stst": 72300, + "stsd": "2024-11-26" + }, + { + "vid": "2400", + "tmstmp": "20241126 20:55", + "lat": "29.92279856247605", + "lon": "-90.01808423325369", + "hdg": "134", + "pid": 563, + "rt": "114A", + "des": "Cutoff Rec. Ctr. via Wilty Terminal", + "pdist": 49329, + "dly": false, + "spd": 27, + "tatripid": "3652988", + "origtatripno": "3652988", + "tablockid": "2114A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1729", + "or": false, + "rid": "11409", + "lwid1": "N/A", + "lwid2": "011409", + "blk": 4002, + "tripid": 1509020, + "tripdyn": 0, + "stst": 73320, + "stsd": "2024-11-26" + }, + { + "vid": "332", + "tmstmp": "20241126 20:55", + "lat": "29.923143333333336", + "lon": "-89.98292333333332", + "hdg": "294", + "pid": 563, + "rt": "114A", + "des": "Cutoff Rec. Ctr. via Wilty Terminal", + "pdist": 74101, + "dly": true, + "spd": 0, + "tatripid": "3652980", + "origtatripno": "3652980", + "tablockid": "5114A", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1698", + "or": false, + "rid": "11414", + "lwid1": "N/A", + "lwid2": "011414", + "blk": 10102, + "tripid": 6397020, + "tripdyn": 0, + "stst": 71520, + "stsd": "2024-11-26" + }, + { + "vid": "2412", + "tmstmp": "20241126 20:55", + "lat": "29.93871204571504", + "lon": "-90.06237216182666", + "hdg": "85", + "pid": 543, + "rt": "114B", + "des": "Tall Timbers via Wilty Terminal", + "pdist": 14066, + "dly": false, + "spd": 42, + "tatripid": "3653168", + "origtatripno": "3653168", + "tablockid": "3114B", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "290", + "or": false, + "rid": "11410", + "lwid1": "N/A", + "lwid2": "011410", + "blk": 6602, + "tripid": 1961020, + "tripdyn": 0, + "stst": 74700, + "stsd": "2024-11-26" + }, + { + "vid": "343", + "tmstmp": "20241126 20:55", + "lat": "29.90433477070026", + "lon": "-89.99196455719535", + "hdg": "102", + "pid": 543, + "rt": "114B", + "des": "Tall Timbers via Wilty Terminal", + "pdist": 71900, + "dly": false, + "spd": 0, + "tatripid": "3653167", + "origtatripno": "3653167", + "tablockid": "1114B", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1787", + "or": false, + "rid": "11412", + "lwid1": "N/A", + "lwid2": "011412", + "blk": 602, + "tripid": 2005020, + "tripdyn": 0, + "stst": 72300, + "stsd": "2024-11-26" + }, + { + "vid": "2410", + "tmstmp": "20241126 20:55", + "lat": "29.904452639188765", + "lon": "-89.99192333138541", + "hdg": "51", + "pid": 543, + "rt": "114B", + "des": "Tall Timbers via Wilty Terminal", + "pdist": 71924, + "dly": true, + "spd": 0, + "tatripid": "3653166", + "origtatripno": "3653166", + "tablockid": "2114B", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1519", + "or": false, + "rid": "11411", + "lwid1": "N/A", + "lwid2": "011411", + "blk": 4102, + "tripid": 3553020, + "tripdyn": 0, + "stst": 69900, + "stsd": "2024-11-26" + }, + { + "vid": "349", + "tmstmp": "20241126 20:55", + "lat": "29.954794214461696", + "lon": "-90.07481128729921", + "hdg": "209", + "pid": 471, + "rt": "202", + "des": "Main Library-CBD", + "pdist": 81700, + "dly": false, + "spd": 0, + "tatripid": "3653375", + "origtatripno": "3653375", + "tablockid": "1202", + "zone": "", + "mode": 1, + "psgld": "N/A", + "srvtmstmp": "20241126 20:55", + "oid": "1972", + "or": false, + "rid": "20202", + "lwid1": "N/A", + "lwid2": "020202", + "blk": 802, + "tripid": 5200020, + "tripdyn": 0, + "stst": 73800, + "stsd": "2024-11-26" + } + ] } -} + } \ No newline at end of file From 0c20b225b1819f83cc7f886c40911e8f728a547d Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 08:52:31 -0600 Subject: [PATCH 03/11] add: logging to mock server --- .gitignore | 6 ++++++ mock_bustime_server/main.go | 1 + 2 files changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 8901b85..8930cc4 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,13 @@ go.work node_modules +# Binaries nola-transit-map server +__debug_* + +.vscode/* +# Track vscode debugger config +!.vscode/launch.json .DS_Store diff --git a/mock_bustime_server/main.go b/mock_bustime_server/main.go index be416ea..ebb6939 100644 --- a/mock_bustime_server/main.go +++ b/mock_bustime_server/main.go @@ -12,6 +12,7 @@ func main() { "/getvehicles", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./mock_vehicles.json") + log.Println("GET /getvehicles :: Served Vehicles") }, ) log.Printf("\n\nMock bustime server is running at: http://localhost%s \n", port) From 10e21f30a4bbac21b08f56c5735951b07200b39c Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 09:40:03 -0600 Subject: [PATCH 04/11] change: make Scraper error loggin more explicit; change: Scraper: move nil repsonse error check to before nil response.Body check --- main.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 202f4d5..faea60f 100644 --- a/main.go +++ b/main.go @@ -189,21 +189,20 @@ func (v *Scraper) fetch() *BustimeData { url := fmt.Sprintf(vehicleQueryFormatter, baseURL, key) if DEV { url = baseURL - log.Printf("Using mock bustime server URL %s \n", baseURL) + log.Println("Using mock bustime server.") } log.Println("Scraper URL:", url) resp, err := v.client.Get(url) - log.Println("Scraper response:", resp) - + if err != nil { + log.Println("ERROR: Scraper response:", err) + } if resp.Body != nil { defer resp.Body.Close() } - if err != nil { - log.Println("ERROR: Scraper response error: ", err) - } + log.Println("Scraper response:", resp) body, readErr := ioutil.ReadAll(resp.Body) if readErr != nil { - log.Fatal(readErr) + log.Fatal("ERROR: Scraper response reader:", readErr) } result := &BustimeResponse{} @@ -242,7 +241,7 @@ func (b *VehicleBroadcaster) Unregister(c VehicleChannel) { func (b *VehicleBroadcaster) Start() { scraper := NewScraper() defer scraper.Close() - log.Println("Start scraper") + log.Println("Starting scraper") go scraper.Start(b.incoming) b.broadcast() } From 14785beb570095496cd948d4dec4df615c4a5bd0 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:38:33 -0600 Subject: [PATCH 05/11] move: Scraper url constants to top of file for consistency & add comments --- main.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index faea60f..0d59e6c 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,19 @@ const ( // Send pings to client with this period. Must be less than pongWait. pingPeriod = (pongWait * 9) / 10 + + // Use in place of Clever Devices URL when in DEV mode + mockCleverDevicesUrl = "http://localhost:8081/getvehicles" + + // Clever Devices API URL: http://[host:port]/bustime/api/v3/getvehicles + // http://ride.smtd.org/bustime/apidoc/docs/DeveloperAPIGuide3_0.pdf + cleverDevicesUrlFormatter = "https://%s/bustime/api/v3/getvehicles" + + // Append to Clever Devices base url (above). + // tmres=m -> time resolution: minute. + // rtpidatafeed=bustime -> specify the bustime data feed. + // format=json -> respond with json (as opposed to XML). + vehicleQueryFormatter = "%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json" ) var ( @@ -137,9 +150,6 @@ type Scraper struct { config *Config } -const cleverDevicesUrlFormatter = "https://%s/bustime/api/v3/getvehicles" -const mockCleverDevicesUrl = "http://localhost:8081/getvehicles" - func NewScraper() *Scraper { api_key, ok := os.LookupEnv("CLEVER_DEVICES_KEY") if !ok { @@ -181,8 +191,6 @@ func (s *Scraper) Start(vs chan []Vehicle) { } } -const vehicleQueryFormatter = "%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json" - func (v *Scraper) fetch() *BustimeData { key := v.config.Key baseURL := v.config.BaseUrl From cbd4b63154651839d2a5d8b89d3cb5242f482089 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:45:37 -0600 Subject: [PATCH 06/11] add: vscode debugger config for main server --- .vscode/launch.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..66e8c8a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}", + "env": { + "DEV": "1", + "CLEVER_DEVICES_KEY": "DEV", + "CLEVER_DEVICES_IP": "DEV" + } + } + ] +} \ No newline at end of file From cf2bf9d722a13dd780bbfb188fcd314e21aa44cd Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:54:28 -0600 Subject: [PATCH 07/11] fix: bad choice of words in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8b5329..4686af5 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ getting around the city extremely frustrating. This map is just a stop gap to ge Join #civic-hacking in Nola Devs Slack channel, where this project is discussed: https://nola.slack.com/join/shared_invite/zt-4882ja82-iGm2yO6KCxsi2aGJ9vnsUQ. -The API key is coveted. Only a few chosen ones will be granted access, hence the included mock server that is used in DEV mode. +The API key is a protected secret. Only a few have access, hence the included mock server that is used in DEV mode. You need a few things on your machine to build the project. If you are an `asdf` user there is a .tool-versions file with acceptable versions of node, npm, and go, but not make to keep from conflicting with system build tools. From 27faea6f21ed71b6b776798993d3507f34052964 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:03:52 -0600 Subject: [PATCH 08/11] update: README dev instructions for building front end --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4686af5..bc3238a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ getting around the city extremely frustrating. This map is just a stop gap to ge ### Contributing -Join #civic-hacking in Nola Devs Slack channel, where this project is discussed: https://nola.slack.com/join/shared_invite/zt-4882ja82-iGm2yO6KCxsi2aGJ9vnsUQ. +Join #civic-hacking in the Nola Devs Slack channel, where this project is discussed: https://nola.slack.com/join/shared_invite/zt-4882ja82-iGm2yO6KCxsi2aGJ9vnsUQ. The API key is a protected secret. Only a few have access, hence the included mock server that is used in DEV mode. @@ -37,7 +37,7 @@ You need a few things on your machine to build the project. If you are an `asdf` make dev DEV=1 ``` -3. (Optional) If working on the frontend, you probably want changes to trigger a build automatically. You'll still have to refresh the page to see changes. +3. (Optional) If working on the frontend, you probably want changes to trigger a JS build automatically. You'll still have to refresh the page to see changes. _In a 3rd terminal_: ``` # terminal tab 3 - React frontend From 6b19a4b987a7679639c92d2d78ab583c8c5e4614 Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:09:20 -0600 Subject: [PATCH 09/11] rename 'vehicleQueryFormatter' to 'cleverDevicesVehicleQueryFormatter'; remove: log 'Scraper' response; change: run in dev mode with 'make dev' (no more '...DEV=1'; remove: unused vars from Makefile --- Makefile | 7 +------ README.md | 2 +- main.go | 5 ++--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index f564bdc..8847622 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,3 @@ -CLEVER_DEVICES_KEY?="" -CLEVER_DEVICES_IP?="" - build: npm install npm run build @@ -13,8 +10,6 @@ show: open http://localhost:8080 ### DEV ### -export CLEVER_DEVICES_KEY := DEV -export CLEVER_DEVICES_IP := DEV mock: cd mock_bustime_server && go build && ./server @@ -22,7 +17,7 @@ mock: dev: npm install go build - ./nola-transit-map || echo "Couldn't run the binary." + sh -c 'DEV=1 CLEVER_DEVICES_KEY=1 CLEVER_DEVICES_IP=1 ./nola-transit-map' || echo "Couldn't run the binary." watch: npm run watch \ No newline at end of file diff --git a/README.md b/README.md index bc3238a..d9b9710 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ You need a few things on your machine to build the project. If you are an `asdf` 2. Run the main server _in another terminal_. ``` # terminal tab 2 - Go backend - make dev DEV=1 + make dev ``` 3. (Optional) If working on the frontend, you probably want changes to trigger a JS build automatically. You'll still have to refresh the page to see changes. diff --git a/main.go b/main.go index 0d59e6c..47097f4 100644 --- a/main.go +++ b/main.go @@ -34,7 +34,7 @@ const ( // tmres=m -> time resolution: minute. // rtpidatafeed=bustime -> specify the bustime data feed. // format=json -> respond with json (as opposed to XML). - vehicleQueryFormatter = "%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json" + cleverDevicesVehicleQueryFormatter = "%s?key=%s&tmres=m&rtpidatafeed=bustime&format=json" ) var ( @@ -194,7 +194,7 @@ func (s *Scraper) Start(vs chan []Vehicle) { func (v *Scraper) fetch() *BustimeData { key := v.config.Key baseURL := v.config.BaseUrl - url := fmt.Sprintf(vehicleQueryFormatter, baseURL, key) + url := fmt.Sprintf(cleverDevicesVehicleQueryFormatter, baseURL, key) if DEV { url = baseURL log.Println("Using mock bustime server.") @@ -207,7 +207,6 @@ func (v *Scraper) fetch() *BustimeData { if resp.Body != nil { defer resp.Body.Close() } - log.Println("Scraper response:", resp) body, readErr := ioutil.ReadAll(resp.Body) if readErr != nil { log.Fatal("ERROR: Scraper response reader:", readErr) From a5fa848b80040c1b3bc9e9a05f8dfa13ac65241b Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Sat, 30 Nov 2024 08:50:59 -0600 Subject: [PATCH 10/11] remove: unnecessary 'if DEV' check in 'Scraper.fetch()'; change: make mock server log more explicit --- main.go | 4 ---- mock_bustime_server/main.go | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 47097f4..68b7fd7 100644 --- a/main.go +++ b/main.go @@ -195,10 +195,6 @@ func (v *Scraper) fetch() *BustimeData { key := v.config.Key baseURL := v.config.BaseUrl url := fmt.Sprintf(cleverDevicesVehicleQueryFormatter, baseURL, key) - if DEV { - url = baseURL - log.Println("Using mock bustime server.") - } log.Println("Scraper URL:", url) resp, err := v.client.Get(url) if err != nil { diff --git a/mock_bustime_server/main.go b/mock_bustime_server/main.go index ebb6939..b9edd41 100644 --- a/mock_bustime_server/main.go +++ b/mock_bustime_server/main.go @@ -9,12 +9,12 @@ const port = ":8081" func main() { http.HandleFunc( - "/getvehicles", + "/getvehicles", // ignores query params func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./mock_vehicles.json") log.Println("GET /getvehicles :: Served Vehicles") }, ) - log.Printf("\n\nMock bustime server is running at: http://localhost%s \n", port) + log.Printf("\n\nMock Clever Devices Bustime server is running at: http://localhost%s \n", port) log.Fatal(http.ListenAndServe(port, nil)) } From a0ce74a606cc4e7a9b8b8d62aa9ec793f0951a1b Mon Sep 17 00:00:00 2001 From: Ian Painter <95984061+its-all-waves@users.noreply.github.com> Date: Sat, 30 Nov 2024 11:10:50 -0600 Subject: [PATCH 11/11] fix: vscode debugger can now be run without main.go open in active tab --- .vscode/launch.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 66e8c8a..f3192f3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,15 +1,13 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { - "name": "Launch Package", + "name": "Dev Mode", "type": "go", "request": "launch", "mode": "auto", - "program": "${fileDirname}", + "program": "./", "env": { "DEV": "1", "CLEVER_DEVICES_KEY": "DEV",