Jacek Kowalski
2019-06-10 0c85a7bd59cfa3a0f99b630161ba31f1cc7cfab5
Refactoring: change $gtfs to $gtfsrt (Real Time) and $json to $ttss
2 files modified
60 ■■■■ changed files
lib/mapper.php 42 ●●●● patch | view | raw | blame | history
parse.php 18 ●●●● patch | view | raw | blame | history
lib/mapper.php
@@ -5,8 +5,8 @@
use transit_realtime\FeedMessage;
class Mapper {
    private $jsonTrips = [];
    private $gtfsTrips = [];
    private $ttssTrips = [];
    private $gtfsrtTrips = [];
    private $logger = NULL;
    
    private $specialNames = [
@@ -27,8 +27,8 @@
    }
    
    public function loadTTSS($file) {
        $json = json_decode(file_get_contents($file));
        foreach($json->vehicles as $vehicle) {
        $ttss = json_decode(file_get_contents($file));
        foreach($ttss->vehicles as $vehicle) {
            if(isset($vehicle->isDeleted) && $vehicle->isDeleted) continue;
            if(!isset($vehicle->tripId) || !$vehicle->tripId) continue;
            if(!isset($vehicle->name) || !$vehicle->name) continue;
@@ -39,16 +39,16 @@
                    continue;
                }
            }
            $this->jsonTrips[(int)$vehicle->tripId] = [
            $this->ttssTrips[(int)$vehicle->tripId] = [
                'id' => $vehicle->id,
                'latitude' => (float)$vehicle->latitude / 3600000.0,
                'longitude' => (float)$vehicle->longitude / 3600000.0,
            ];
        }
        ksort($this->jsonTrips);
        ksort($this->ttssTrips);
    }
    
    public function loadGTFS($file) {
    public function loadGTFSRT($file) {
        $data = file_get_contents($file);
        $feed = new FeedMessage();
        $feed->parse($data);
@@ -58,7 +58,7 @@
            $vehicle = $vehiclePosition->getVehicle();
            $trip = $vehiclePosition->getTrip();
            $tripId = $trip->getTripId();
            $this->gtfsTrips[self::convertTripId($tripId)] = [
            $this->gtfsrtTrips[self::convertTripId($tripId)] = [
                'id' => $entity->getId(),
                'num' => $vehicle->getLicensePlate(),
                'tripId' => $tripId,
@@ -66,21 +66,21 @@
                'longitude' => $position->getLongitude(),
            ];
        }
        ksort($this->gtfsTrips);
        ksort($this->gtfsrtTrips);
    }
    
    public function findOffset() {
        if(count($this->jsonTrips) == 0 || count($this->gtfsTrips) == 0) {
        if(count($this->ttssTrips) == 0 || count($this->gtfsrtTrips) == 0) {
            return NULL;
        }
        
        $jsonTripIds = array_keys($this->jsonTrips);
        $gtfsTripIds = array_keys($this->gtfsTrips);
        $ttssTripIds = array_keys($this->ttssTrips);
        $gtfsTripIds = array_keys($this->gtfsrtTrips);
        
        $possibleOffsets = [];
        for($i = 0; $i < count($this->jsonTrips); $i++) {
            for($j = 0; $j < count($this->gtfsTrips); $j++) {
                $possibleOffsets[$jsonTripIds[$i] - $gtfsTripIds[$j]] = TRUE;
        for($i = 0; $i < count($this->ttssTrips); $i++) {
            for($j = 0; $j < count($this->gtfsrtTrips); $j++) {
                $possibleOffsets[$ttssTripIds[$i] - $gtfsTripIds[$j]] = TRUE;
            }
        }
        $possibleOffsets = array_keys($possibleOffsets);
@@ -94,7 +94,7 @@
            
            foreach($gtfsTripIds as $tripId) {
                $tripId += $offset;
                if(isset($this->jsonTrips[$tripId])) {
                if(isset($this->ttssTrips[$tripId])) {
                    $matched++;
                }
            }
@@ -114,11 +114,11 @@
        return $bestOffset;
    }
    
    public function getMapping($offset) {
    public function mapUsingOffset($offset) {
        $result = [];
        foreach($this->gtfsTrips as $gtfsTripId => $gtfsTrip) {
            $jsonTripId = $gtfsTripId + $offset;
            if(isset($this->jsonTrips[$jsonTripId])) {
        foreach($this->gtfsrtTrips as $gtfsTripId => $gtfsTrip) {
            $ttssTripId = $gtfsTripId + $offset;
            if(isset($this->ttssTrips[$ttssTripId])) {
                $data = numToTypeB($gtfsTrip['id']);
                $num = $gtfsTrip['num'];
                if(!is_array($data) || !isset($data['num'])) {
@@ -130,7 +130,7 @@
                    // Ignore due to incorrect depot markings in the data
                    //$this->logger->warn('Got '.$num.', database has '.$data['num']);
                }
                $result[$this->jsonTrips[$jsonTripId]['id']] = $data;
                $result[$this->ttssTrips[$ttssTripId]['id']] = $data;
            }
        }
        return $result;
parse.php
@@ -6,9 +6,9 @@
$logger = new Monolog\Logger('Parse changes');
$sources = [
    'buses' => [
        'gtfs' => 'ftp://ztp.krakow.pl/VehiclePositions_A.pb',
        'gtfs_file' => 'VehiclePositions_A.pb',
    'bus' => [
        'gtfsrt' => 'ftp://ztp.krakow.pl/VehiclePositions_A.pb',
        'gtfsrt_file' => 'VehiclePositions_A.pb',
        'ttss' => 'http://91.223.13.70/internetservice/geoserviceDispatcher/services/vehicleinfo/vehicles',
        'ttss_file' => 'vehicles_A.json',
        'database' => 'mapping_A.sqlite3',
@@ -19,25 +19,25 @@
foreach($sources as $name => $source) {
    $logger = new Monolog\Logger('fetch_'.$name);
    try {
        foreach(['gtfs_file', 'ttss_file', 'database', 'result'] as $field) {
        foreach(['gtfsrt_file', 'ttss_file', 'database', 'result'] as $field) {
            $source[$field] = __DIR__.'/data/'.$source[$field];
        }
        $source['result_temp'] = $source['result'].'.tmp';
        
        $logger->info('Fetching '.$name.' position data from FTP...');
        $updated = ftp_fetch_if_newer($source['gtfs'], $source['gtfs_file']);
        $updated = ftp_fetch_if_newer($source['gtfsrt'], $source['gtfsrt_file']);
        if(!$updated) {
            $logger->info('Nothing to do, remote file not newer than local one');
            continue;
        }
        
        $logger->info('Fetching '.$name.' positions from TTSS...');
        fetch($source['ttss'],$source['ttss_file']);
        $logger->info('Fetching '.$name.' position data from TTSS...');
        fetch($source['ttss'], $source['ttss_file']);
        
        $logger->info('Loading data...');
        $mapper = new Mapper();
        $mapper->loadTTSS($source['ttss_file']);
        $mapper->loadGTFS($source['gtfs_file']);
        $mapper->loadGTFSRT($source['gtfsrt_file']);
        
        $db = new Database($source['database']);
        
@@ -48,7 +48,7 @@
        }
        
        $logger->info('Got offset '.$offset.', creating mapping...');
        $mapping = $mapper->getMapping($offset);
        $mapping = $mapper->mapUsingOffset($offset);
        
        $logger->info('Checking the data for correctness...');
        $weight = count($mapping);