Projekt

Obecné

Profil

Stáhnout (8.52 KB) Statistiky
| Větev: | Revize:
1 56cb34de horkym
<?php
2
3 a257bb07 horkym
require_once "traffic.php";
4
require_once "location.php";
5 6806f46f horkym
require_once "logging.php";
6 a257bb07 horkym
7 56cb34de horkym
class Parser {
8 a0baad16 horkym
    
9 a257bb07 horkym
    // Pro data o doprave - na kolik intervalu se ma rozdelit den (96 = 4 * 24 => intervaly po ctvrt hodine).
10 788fa6d8 horkym
    public $HOW_MANY_INTERVALS = 96;
11 a257bb07 horkym
    
12
    // Pro data o doprave - jak dlouho v milisekundach trva jeden interval.
13 788fa6d8 horkym
    public $intervalMilli;
14 a257bb07 horkym
    
15 56cb34de horkym
    private $name;
16
    private $path;
17
    
18 a257bb07 horkym
    // Pole informaci o lokacich.
19
    private $locations;
20
    
21
    // Pole informaci o doprave - peti-rozmerne pole s nasledujici strukturou:
22
    // Zaklad tvori pole zarizeni. Pro kazde zarizeni je pak pole pro casove intervaly.
23
    // Kazdy casovy interval ma pole o dvou prvcich (dva smery). Pro kazdy smer je vytvoreno pole o jedenacti
24
    // prvcich (jedenact typu vozidel). Pro kazde vozidlo je vytvoreno pole o dvou prvcich (pocet vozidel, suma rychlosti).
25
    private $traffic;
26
    
27 e1140d8a horkym
    // Skoro to same jako $traffic, akorat bez rozmeru pro casove intervaly.
28
    private $trafficOneDay;
29
    
30 6806f46f horkym
    // Objekt pro logovani do souboru cron.txt ve slozce log.
31
    private $logs;
32
    
33
    public function __construct($logs) {
34 56cb34de horkym
        $this->name = "DOPR_D_";
35
        $this->path = "http://doprava.plzensky-kraj.cz/opendata/doprava/den/".$this->name;
36 a257bb07 horkym
        
37
        // Pro lokace se data predzpracovavat nemusi.
38
        $this->locations = array();
39
        
40
        // Naopak u zaznamu je prilis zbytecnych informaci - k predzpracovani dojit musi.
41
        $this->intervalMilli = (int) (24 * 3600000 / $this->HOW_MANY_INTERVALS);
42
        $this->traffic = array();
43 e1140d8a horkym
        $this->trafficOneDay = array();
44 6806f46f horkym
        
45
        $this->logs = $logs;
46 56cb34de horkym
    }
47
    
48
    public function doWork($date) {
49 6806f46f horkym
        $this->logs->log(Logging::INFO, "ZACATEK PROCEDURY pro den ".DateTime::createFromFormat("Ymd", $date)->format("d.m.Y").".");
50
        
51 56cb34de horkym
        $zipUrl = $this->path.$date.".zip";
52 a0baad16 horkym
        $dir = "download/$date/";
53 56cb34de horkym
        $downloaded = $dir."downloaded.zip";
54
        
55
        $result = $this->download($date, $zipUrl, $dir, $downloaded);
56
        if ($result == -1 || $result == 0 || $result == 1) {
57
            
58
            $ok = -1;
59
            if ($result == 0 && $this->extract($dir, $downloaded) == 0) {
60
                unlink($downloaded);
61
                $ok = 0;
62
            }
63
            
64
            if ($ok == 0 || $result == 1) {
65 6806f46f horkym
                $this->logs->log(Logging::INFO, "Zpracovavani zaznamu o doprave.");
66 a257bb07 horkym
                $this->parse($dir.$this->name.$date.".csv", TRUE);
67 6806f46f horkym
                
68
                $this->logs->log(Logging::INFO, "Zpracovavani zaznamu o lokacich.");
69 a257bb07 horkym
                $this->parse($dir."Locations.csv", FALSE);
70 a0baad16 horkym
                // return; odkomentovat v pripade, ze extrahovana data nemaji byt odstranena.
71 56cb34de horkym
            }
72
            
73 6806f46f horkym
            $this->logs->log(Logging::INFO, "Odstranovani slozky s extrahovanymi daty.");
74 56cb34de horkym
            $this->deleteDir($dir);
75
            
76
        }
77 6806f46f horkym
        
78
        $this->logs->log(Logging::INFO, "KONEC PROCEDURY.");
79 56cb34de horkym
    }
80
    
81 a257bb07 horkym
    private function parse($fileName, $traffic) {
82
        if (($file = fopen($fileName, "r"))) {
83
            while (($row = fgetcsv($file, 1000, "|"))) {
84
                if ($traffic) {
85
                    $this->saveVehicleInfo(new Traffic($row));
86
                } else {
87
                    $this->locations[] = new Location($row);
88
                }
89
            }
90
            fclose($file);
91
        }
92
    }
93
    
94
    private function saveVehicleInfo($t) {
95
        // Kontrola, jestli je pro dane zarizeni vytvorene pole casu.
96
        if (!isSet($this->traffic[$t->device])) {
97 e1140d8a horkym
            // Vytvorit prvni dva rozmery pole pro dopravni data s rozdelenim na casove intervaly.
98 a257bb07 horkym
            $this->traffic[$t->device] = array();
99
            for ($i = 0; $i < $this->HOW_MANY_INTERVALS; $i++) {
100
                $this->traffic[$t->device][$i] = NULL;
101
            }
102 e1140d8a horkym
            
103
            // U pole s prumery za cely den rovnou vytvorit vsechny rozmery.
104
            $this->trafficOneDay[$t->device] = array();
105
            for ($i = 0; $i < 2; $i++) {
106
                $this->trafficOneDay[$t->device][$i] = array();
107
                for ($j = 0; $j < 11; $j++) {
108 41dd5f26 horkym
                    $this->trafficOneDay[$t->device][$i][$j] = array(0, 0, 0); // Pocet danych vozidel, suma jejich rychlosti a pocet vozidel u kterych nesla stanovit rychlost.
109 e1140d8a horkym
                }
110
            }
111
            
112 a257bb07 horkym
        }
113
        
114
        // Zjisteni, do jakeho casoveho intervalu patri zaznam.
115
        list($date, $time) = explode(" ", $t->dateTime->format("Y-m-d H:i:s.u"), 2);
116
        list($hours, $minutes, $seconds) = explode(":", $time, 3);
117
        $interval = (int) (($hours * 3600000 + $minutes * 60000 + $seconds * 1000) / $this->intervalMilli);
118
        
119
        // Kontrola, jestli je pro dany casovy interval vytvorene pole pro smery.
120
        if ($this->traffic[$t->device][$interval] == NULL) {
121
            $this->traffic[$t->device][$interval] = array();
122
            for ($i = 0; $i < 2; $i++) {
123
                $this->traffic[$t->device][$interval][$i] = array();
124
                for ($j = 0; $j < 11; $j++) {
125 41dd5f26 horkym
                    $this->traffic[$t->device][$interval][$i][$j] = array(0, 0, 0); // Pocet danych vozidel, suma jejich rychlosti a pocet vozidel u kterych nesla stanovit rychlost.
126 a257bb07 horkym
                }
127
            }
128
        }
129
        
130 41dd5f26 horkym
        // Ulozeni dulezitych informaci o danem zaznamu do pole s casovymi intervaly a i do pole se zaznamy za cely den.
131
        if ($t->speed < 1) {
132
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][2]++;
133
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][2]++;
134
        } else {
135
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][0]++;
136
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][1] += $t->speed;
137
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][0]++;
138
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][1] += $t->speed;
139
        }
140 a257bb07 horkym
    }
141
    
142 56cb34de horkym
    private function download($date, $zipUrl, $dir, $downloaded) {
143
        if (strpos(get_headers($zipUrl, 1)[0], "404") === FALSE) {
144
            if (!file_exists($dir)) {
145
                if (mkdir($dir)) {
146
                    if (copy($zipUrl, $downloaded)) {
147
                        // Stazeni probehlo v poradku.
148 6806f46f horkym
                        $this->logs->log(Logging::INFO, "Stazeni archivu probehlo v poradku.");
149 56cb34de horkym
                        return 0;
150
                    } else {
151
                        // Nepovedlo se stazeni zip souboru.
152 6806f46f horkym
                        $this->logs->log(Logging::ERROR, "Nepovedlo se stazeni archivu.");
153 56cb34de horkym
                        return -1;
154
                    }
155
                } else {
156
                    // Nepodarilo se vytvorit slozku pro data.
157 6806f46f horkym
                    $this->logs->log(Logging::ERROR, "Nepodarilo se vytvorit slozku pro data.");
158 56cb34de horkym
                    return -2;
159
                }
160
            } else {
161
                // Data k vybranemu dni jiz byla stazena.
162 6806f46f horkym
                $this->logs->log(Logging::INFO, "Data k vybranemu dni jiz byla stazena.");
163 56cb34de horkym
                return 1;
164
            }
165
        } else {
166
            // Pro dany datum neexistuji data.
167 6806f46f horkym
            $this->logs->log(Logging::WARNING, "Pro dany datum neexistuji data.");
168 56cb34de horkym
            return -3;
169
        }
170
    }
171
    
172
    private function extract($dir, $downloaded) {
173
        $zip = new ZipArchive();
174
        if ($zip->open($downloaded, ZIPARCHIVE::CREATE) === TRUE) {
175
            $zip->extractTo($dir);
176
            $zip->close();
177
            // Extrahovani v poradku dokonceno.
178 6806f46f horkym
            $this->logs->log(Logging::INFO, "Extrahovani archivu v poradku dokonceno.");
179 56cb34de horkym
            return 0;
180
        } else {
181
            // Nepovedlo se extrahovani obsahu zipu.
182 6806f46f horkym
            $this->logs->log(Logging::ERROR, "Pri extrahovani archivu doslo k chybe.");
183 56cb34de horkym
            return -1;
184
        }
185
    }
186
    
187
    private function deleteDir($path) {
188
        if (is_dir($path)) {
189
            $files = scandir($path);
190
            foreach ($files as $file) {
191
                if ($file != "." && $file != "..") {
192
                    $path_ = $path."/".$file;
193
                    if (filetype($path_) == "dir") {
194
                        $this->deleteDir($path_);
195
                    } else {
196
                        unlink($path_);
197
                    }
198
                }
199
            }
200
            reset($files);
201
            rmdir($path);
202
        }
203
    }
204
    
205 a257bb07 horkym
    public function getTraffic() {
206
        return $this->traffic;
207
    }
208
    
209 e1140d8a horkym
    public function getTrafficOneDay() {
210
        return $this->trafficOneDay;
211
    }
212
    
213 a257bb07 horkym
    public function getLocations() {
214
        return $this->locations;
215
    }
216
    
217 56cb34de horkym
}
218
219
?>