From c077c73b10f6581a1bc3983b8a0ca4a7446a2b91 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Fri, 21 Jun 2019 22:57:09 +0000 Subject: [PATCH] Output tables of vehicles on lines --- data/empty | 1 lib/mapper.php | 11 +++ parse.php | 10 +++ config.php | 10 +++ composer.json | 3 templates/vehicles.html | 59 +++++++++++++++++++ lib/output.php | 33 +++++++++++ 7 files changed, 122 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 277e92a..1adf1b5 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,7 @@ { "require": { "google/gtfs-realtime-bindings": "^0.0.2", - "monolog/monolog": "^1.24" + "monolog/monolog": "^1.24", + "twig/twig": "^2.0" } } diff --git a/config.php b/config.php index 2982b7e..d419565 100644 --- a/config.php +++ b/config.php @@ -7,7 +7,9 @@ 'ttss_file' => 'vehicles_A.json', 'database' => 'mapping_A.sqlite3', 'result' => 'mapping_A.json', + 'result_vehicles' => 'vehicles_A.html', 'mapper' => 'numToTypeB', + 'prefix' => 'b', ], 'tram' => [ 'gtfsrt' => 'ftp://ztp.krakow.pl/VehiclePositions_T.pb', @@ -16,7 +18,9 @@ 'ttss_file' => 'vehicles_T.json', 'database' => 'mapping_T.sqlite3', 'result' => 'mapping_T.json', + 'result_vehicles' => 'vehicles_T.html', 'mapper' => 'numToTypeT', + 'prefix' => 't', ], 'tram2' => [ 'gtfsrt' => 'ftp://ztp.krakow.pl/VehiclePositions.pb', @@ -25,14 +29,18 @@ 'ttss_file' => 'vehicles_T.json', 'database' => 'mapping_T.sqlite3', 'result' => 'mapping_T.json', + 'result_vehicles' => 'vehicles_T.html', 'mapper' => 'numToTypeT', + 'prefix' => 't', ], ]; foreach($sources as $name => &$source) { - foreach(['gtfsrt_file', 'ttss_file', 'database', 'result'] as $field) { + foreach(['gtfsrt_file', 'ttss_file', 'database', 'result', 'result_vehicles'] as $field) { $source[$field] = __DIR__.'/data/'.$source[$field]; } + $source['result_temp'] = $source['result'].'.tmp'; + $source['result_vehicles_temp'] = $source['result_vehicles'].'.tmp'; } unset($source); diff --git a/data/empty b/data/empty index 8b13789..e69de29 100644 --- a/data/empty +++ b/data/empty @@ -1 +0,0 @@ - diff --git a/lib/mapper.php b/lib/mapper.php index 42abecf..a36b4ef 100644 --- a/lib/mapper.php +++ b/lib/mapper.php @@ -34,13 +34,16 @@ if(!isset($vehicle->name) || !$vehicle->name) continue; if(!isset($vehicle->latitude) || !$vehicle->latitude) continue; if(!isset($vehicle->longitude) || !$vehicle->longitude) continue; - foreach($this->specialNames as $name) { - if(substr($vehicle->name, -strlen($name)) == $name) { + list($line, $direction) = explode(' ', $vehicle->name, 2); + foreach($this->specialNames as $specialName) { + if(substr($vehicle->name, -strlen($specialName)) == $specialName) { continue; } } $this->ttssTrips[(string)$vehicle->tripId] = [ 'id' => (string)$vehicle->id, + 'line' => $line, + 'direction' => $direction, 'latitude' => (float)$vehicle->latitude / 3600000.0, 'longitude' => (float)$vehicle->longitude / 3600000.0, ]; @@ -52,6 +55,10 @@ return $this->ttssDate / 1000.0; } + public function getTTSSTrips() { + return $this->ttssTrips; + } + public function loadGTFSRT($file) { $data = file_get_contents($file); $feed = new FeedMessage(); diff --git a/lib/output.php b/lib/output.php new file mode 100644 index 0000000..d3fd6d9 --- /dev/null +++ b/lib/output.php @@ -0,0 +1,33 @@ +<?php +function createVehiclesList($trips, $mapping, $saveConfig = FALSE) { + $lines = []; + foreach($trips as $trip) { + $lines[$trip['line']][] = [ + 'trip' => $trip, + 'vehicle' => $mapping[$trip['id']] ?? [], + ]; + } + foreach($lines as &$line) { + usort($line, function($a, $b) { + return (substr($a['vehicle']['num'] ?? '', 2) <=> substr($b['vehicle']['num'] ?? '', 2)); + }); + } + unset($line); + ksort($lines); + + if($saveConfig) { + $twigLoader = new \Twig\Loader\FilesystemLoader(__DIR__.'/../templates'); + $twig = new \Twig\Environment($twigLoader); + + $vehiclesHtml = $twig->render('vehicles.html', [ + 'lines' => $lines, + 'prefix' => $saveConfig['prefix'], + ]); + if(!file_put_contents($saveConfig['result_vehicles_temp'], $vehiclesHtml)) { + throw new Exception('Vehicles save failed'); + } + rename($saveConfig['result_vehicles_temp'], $saveConfig['result_vehicles']); + } + + return $lines; +} diff --git a/parse.php b/parse.php index 148962d..ebd18cd 100644 --- a/parse.php +++ b/parse.php @@ -3,6 +3,7 @@ require_once(__DIR__.'/lib/database.php'); require_once(__DIR__.'/lib/fetch.php'); require_once(__DIR__.'/lib/mapper.php'); +require_once(__DIR__.'/lib/output.php'); require_once(__DIR__.'/lib/vehicle_types.php'); require_once(__DIR__.'/config.php'); @@ -76,6 +77,9 @@ throw new Exception('Ignoring result due to better data already present'); } + + $logger->info('Creating mapping...'); + $db->addMapping($mapping); $jsonContent = []; @@ -88,6 +92,12 @@ throw new Exception('Result save failed'); } rename($source['result_temp'], $source['result']); + + + $logger->info('Creating vehicle list...'); + + createVehiclesList($mapper->getTTSSTrips(), $jsonContent, $source); + $logger->info('Finished'); } catch(Throwable $e) { $logger->error($e->getMessage(), ['exception' => $e, 'exception_string' => (string)$e]); diff --git a/templates/vehicles.html b/templates/vehicles.html new file mode 100644 index 0000000..7686d05 --- /dev/null +++ b/templates/vehicles.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<title>Vehicles on lines (TTSS-based)</title> +<meta name="viewport" content="width=device-width, initial-scale=1" /> + +<style type="text/css"> +table { + border-collapse: collapse; + border-spacing: 0; +} +th, td { + border: 1px solid black; + padding: 5px; +} +td { + vertical-align: top; + text-align: center; +} +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.low { + color: #000; +} +.low0 { + color: #C70; +} +.low1, .low2 { + color: #070; +} +</style> + +<table> + +<thead> +<tr> +{% for line in lines|keys %} +<th>{{ line | e }}</th> +{% endfor %} +</tr> +</thead> + +<tbody> +<tr> +{% for trips in lines %} +<td> +{% for trip in trips %} +<a href="https://mpk.jacekk.net/map.html#!{{ prefix }}{{ trip.trip.id | e }}" class="low{{ trip.vehicle.low | default }}"> +{{ trip.vehicle.num | default('<?>') | e }}<br /> +</a> +{% endfor %} +</td> +{% endfor %} +</tr> +</tbody> + +</table> -- Gitblit v1.9.1