Output tables of vehicles on lines
2 files added
5 files modified
| | |
| | | { |
| | | "require": { |
| | | "google/gtfs-realtime-bindings": "^0.0.2", |
| | | "monolog/monolog": "^1.24" |
| | | "monolog/monolog": "^1.24", |
| | | "twig/twig": "^2.0" |
| | | } |
| | | } |
| | |
| | | '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', |
| | |
| | | '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', |
| | |
| | | '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); |
| | |
| | | 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, |
| | | ]; |
| | |
| | | return $this->ttssDate / 1000.0; |
| | | } |
| | | |
| | | public function getTTSSTrips() { |
| | | return $this->ttssTrips; |
| | | } |
| | | |
| | | public function loadGTFSRT($file) { |
| | | $data = file_get_contents($file); |
| | | $feed = new FeedMessage(); |
New file |
| | |
| | | <?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; |
| | | } |
| | |
| | | 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'); |
| | | |
| | |
| | | throw new Exception('Ignoring result due to better data already present'); |
| | | } |
| | | |
| | | |
| | | $logger->info('Creating mapping...'); |
| | | |
| | | $db->addMapping($mapping); |
| | | |
| | | $jsonContent = []; |
| | |
| | | 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]); |
New file |
| | |
| | | <!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> |