我使用PHP处理纬度/经度点,以便生成JS并在OSM地图上显示点。当我在录音中停留au 10分钟或更长时间时,我想在地图上制作一条新曲目。
我的数据集目前在大约10条不同的轨道上记录了大约30000条记录(一些轨道大约有300点,另一些轨道有数千点)。
我遇到PHP的性能问题。当循环聚集数百个点时,数据将以良好的速度进行处理,但是如果轨道具有数千个点,则性能会急剧下降。
这是进行每个曲目的每个点所需的时间
+-----------------+------------------------------+
| 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 |
+-----------------+------------------------------+
我们可以看到,当我在赛道上有很多要点时,表演会急剧下降。在这种特殊情况下,处理所有点大约需要30秒。如果我将每个音轨的点数限制为500点,那么性能会非常好(大约需要2.5秒来进行数据设置)。
我将Synology DS415play用作网络服务器。
这是我的代码:
$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);
}
如果我将每个曲目限制在500点之内,那么性能会非常好
$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);
}
谢谢
编辑:我在这里提供数据示例:http : //109.190.92.126/tracker/gpsData.sql慢速脚本:http : //109.190.92.126/tracker/map.php通过分割每个轨道,正常执行速度(最大500 pts ):http://109.190.92.126/tracker/map_split.php
谢谢
这是最终产品(在Heroku上,因此请等待dyno启动)http://sove.herokuapp.com/gps/
解决方案背后的思想是在服务器端计算时间戳的差异,并处理数组中的数据。
该脚本在我的MBP上以0.278s完成,占用了15.75MB的内存,最终输出$ts
是一组路由(我总共得到7条路由)。
有很多优化,包括跳过相同的坐标点。缩放范围在地图上不正确,但您会弄清楚。我真的应该为此工作赏金。如果您喜欢结果,请告诉我,我可以共享代码库。
资料来源:https : //gist.github.com/jpaljasma/04f54e0d2fa3a632071e
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句