I use PHP to continue the latitude / longitude points to generate JS and display the points on the OSM map. I would like to make a new track on the map when I have a pause of 10 minutes or more on the recording.
My dataset currently contains about 30,000 records on about 10 different tracks (some tracks have about 300 points, others have thousands).
I ran into a performance issue with PHP. When a cycle combines several hundred points, the data is processed at a good speed, but if the track has thousands of points, performance drops sharply.
Here is the time it takes to go through each point for each track
+-----------------+------------------------------+ | Points On Track | Time To Proceed 10000 Points | +-----------------+------------------------------+ | 21 | 0.75 | | 18865 | 14.52 | | 539 | 0.79 | | 395 | 0.71 | | 827 | 0.79 | | 400 | 0.74 | | 674 | 0.78 | | 2060 | 1.01 | | 2056 | 0.99 | | 477 | 0.73 | | 628 | 0.77 | | 472 | 0.73 | +-----------------+------------------------------+
We see that when I have a lot of points on the track, the performances fall dramatically. In this particular case, processing all the points takes about 30 seconds. If I limit the number of points for each track to 500 points, the performances are pretty good (about 2.5 seconds to continue my data set).
I use my Synology DS415play as a web server.
Here is my code:
$dataTab = array(); if ($result = $mysqli->query($sql)) { $count = 0; $row = $result->fetch_array(); $data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ; $date = new DateTime($row['time']); while($row = $result->fetch_array()) { $count++; $newDate = new DateTime($row['time']); if(($newDate->getTimestamp() - $date->getTimestamp()) > 600) { array_push($dataTab, $data); $data= ""; $count = 0; } $data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ; $date = $newDate; } array_push($dataTab, $data); }
If I limit each track to 500 points, the performance is pretty good
$dataTab = array(); if ($result = $mysqli->query($sql)) { $count = 0; $row = $result->fetch_array(); $data = $dataTab[$tabPrt] . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ; $date = new DateTime($row['time']); while($row = $result->fetch_array()) { $count++; $newDate = new DateTime($row['time']); if(($newDate->getTimestamp() - $date->getTimestamp()) > 600 || $count > 500) { array_push($dataTab, $data); $data= ""; $count = 0; } $data = $data . "[" . $row['latitude'] . "," . $row['longitude'] . "]," ; $date = $newDate; } array_push($dataTab, $data); }
thanks
EDIT: here I provide sample data: http://109.190.92.126/tracker/gpsData.sql Slow script: http://109.190.92.126/tracker/map.php Normal speed of execution, dividing each track (maximum 500 points): http://109.190.92.126/tracker/map_split.php
thanks