Jacek Kowalski
2019-06-10 6b6842c72b28c1346ef501bc656ec3016d00e1c7
Add procedure to match TTSS to GTFS via bus positions
2 files modified
55 ■■■■■ changed files
lib/mapper.php 50 ●●●●● patch | view | raw | blame | history
parse.php 5 ●●●●● patch | view | raw | blame | history
lib/mapper.php
@@ -9,6 +9,8 @@
    private $ttssTrips = [];
    private $gtfsrtDate = NULL;
    private $gtfsrtTrips = [];
    private $gtfsTrips = [];
    private $gtfsRoutes = [];
    private $logger = NULL;
    
    private $specialNames = [
@@ -42,8 +44,11 @@
                    continue;
                }
            }
            $name = explode(' ', $vehicle->name, 2);
            $this->ttssTrips[(int)$vehicle->tripId] = [
                'id' => $vehicle->id,
                'line' => $name[0],
                'direction' => $name[1],
                'latitude' => (float)$vehicle->latitude / 3600000.0,
                'longitude' => (float)$vehicle->longitude / 3600000.0,
            ];
@@ -53,6 +58,29 @@
    
    public function getTTSSDate() {
        return $this->ttssDate / 1000.0;
    }
    public function loadGTFS($file) {
        $buffer_size = 512;
        $routes = fopen('phar://'.$file.'/routes.txt', 'r');
        $route_header = fgetcsv($routes, $buffer_size);
        while(($route = fgetcsv($routes, $buffer_size)) !== FALSE) {
            $this->gtfsRoutes[$route[0]] = $route[2];
        }
        fclose($routes);
        $trips = fopen('phar://'.$file.'/trips.txt', 'r');
        $trip_header = fgetcsv($trips, $buffer_size);
        var_dump($trip_header);
        while(($trip = fgetcsv($trips, $buffer_size)) !== FALSE) {
            $this->gtfsTrips[$trip[0]] = [
                'line' => $this->gtfsRoutes[$trip[1]] ?? NULL,
                'route' => $trip[1],
                'direction' => $trip[3],
            ];
        }
        fclose($trips);
    }
    
    public function loadGTFSRT($file) {
@@ -81,6 +109,28 @@
        return $this->gtfsrtDate;
    }
    
    public function mapUsingCoords() {
        $level = 0.002;
        foreach($this->gtfsrtTrips as $gkey => $gtrip) {
            $trip = $this->gtfsTrips[$gtrip['tripId']] ?? NULL;
            if($trip === NULL) continue;
            foreach($this->ttssTrips as $jkey => $jtrip) {
                echo $gtrip['latitude'].' '.$jtrip['latitude']."\n";
                echo $gtrip['longitude'].' '.$jtrip['longitude']."\n";
                echo $jtrip['line'].' '.$trip['line']."\n";
                echo "\n";
                if($jtrip['line'] != $trip['line']) continue;
                if(abs($gtrip['latitude'] - $jtrip['latitude']) > $level) continue;
                if(abs($gtrip['longitude'] - $jtrip['longitude']) < $level) continue;
                echo 'MATCH '.$gtrip['num'].' '.$gkey.' '.$jkey.' ('.($jkey-$gkey).')'."\n";
            }
        }
    }
    public function findOffset() {
        if(count($this->ttssTrips) == 0 || count($this->gtfsrtTrips) == 0) {
            return NULL;
parse.php
@@ -7,6 +7,8 @@
$sources = [
    'bus' => [
        'gtfs' => 'ftp://ztp.krakow.pl/GTFS_KRK_A.zip',
        'gtfs_file' => 'GTFS_KRK_A.zip',
        'gtfsrt' => 'ftp://ztp.krakow.pl/VehiclePositions_A.pb',
        'gtfsrt_file' => 'VehiclePositions_A.pb',
        'ttss' => 'http://91.223.13.70/internetservice/geoserviceDispatcher/services/vehicleinfo/vehicles',
@@ -38,6 +40,7 @@
        $mapper = new Mapper();
        
        $mapper->loadTTSS($source['ttss_file']);
        $timeDifference = time() - $mapper->getTTSSDate();
        if(abs($timeDifference) > 60) {
            throw new Exception('TTSS timestamp difference ('.$timeDifference.'s) is too high, aborting!');
@@ -49,6 +52,8 @@
            throw new Exception('GTFSRT timestamp difference ('.$timeDifference.'s) is too high, aborting!');
        }
        
        $mapper->loadGTFS($source['gtfs_file']);
        $db = new Database($source['database']);
        
        $logger->info('Finding correct offset...');