Страница 1 из 2
Оптимизация логов GPS
Добавлено: Пт окт 23, 2015 3:56 pm
Amarok
Захотелось сделать оптимизацию логов GPS, что б из базы удалялись одинаковые значение. Сергей поделился вот таким кодом:
Код: Выделить всё
set_time_limit(6000);
$records=SQLSelect("SELECT gpslog.ID, gpslog.DEVICEID, gpslog.LOCATION_ID, gpsdevices.ID as GPS_DEVICE_ID FROM gpslog LEFT JOIN gpsdevices ON gpslog.DEVICE_ID=gpsdevices.ID ORDER BY gpslog.DEVICEID, gpslog.ADDED DESC");
$total=count($records);
$to_delete=array();
for($i=1;$i<$total-1;$i++) {
if (!$records[$i]['GPS_DEVICE_ID']) {
SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
continue;
}
if (!$records[$i]['LOCATION_ID']) continue;
if ($records[$i]['LOCATION_ID']==$records[$i+1]['LOCATION_ID'] && $records[$i]['LOCATION_ID']==$records[$i-1]['LOCATION_ID']) {
SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
}
if ($i%200==0) {
echo ".";
echo str_repeat(' ', 1024);
flush();
flush();
}
}
После выполнения сценария база становится чище, но всё равно остаются подобные записи:

- Screenshot_1.png (29.43 КБ) 6856 просмотров
Надо, наверное, "загрубить" точность оптимизации, но как? Обрабатывать, к примеру не 4 знака после запятой, а два-три? и как это сделать?
Re: Оптимизация логов GPS
Добавлено: Пт окт 23, 2015 11:02 pm
xor
Может быть, в третьем if'e все сравниваемые координаты округлить, предварительно локейешен_айди разделив на широту и долготу?
$n=explode(',',$records[$i]['LOCATION_ID']);
$n1=explode(',',$records[$i+1]['LOCATION_ID']);
...
round($n[0],3) - округленная первая часть коорд LOCATION_ID
round($n[1],3) - округленная вторая часть коорд LOCATION_ID
round($n1[0],3) - округленная первая часть коорд LOCATION_ID c $i+1
и тд
?
Re: Оптимизация логов GPS
Добавлено: Пт окт 23, 2015 11:22 pm
xor
А как бы еще фильтровать до записи в базу (наверное, в gps.php) приходящие сообщения о местоположении с плохой точностью больше там 600 м?
У меня бывает в метро точность неск. км((
Re: Оптимизация логов GPS
Добавлено: Сб окт 24, 2015 7:24 am
Amarok
xor писал(а):Может быть, в третьем if'e все сравниваемые координаты округлить, предварительно локейешен_айди разделив на широту и долготу?
$n=explode(',',$records[$i]['LOCATION_ID']);
$n1=explode(',',$records[$i+1]['LOCATION_ID']);
...
round($n[0],3) - округленная первая часть коорд LOCATION_ID
round($n[1],3) - округленная вторая часть коорд LOCATION_ID
round($n1[0],3) - округленная первая часть коорд LOCATION_ID c $i+1
и тд
?
Не понимаю(
Re: Оптимизация логов GPS
Добавлено: Сб окт 24, 2015 4:07 pm
xor
упс, скрипт оптимизирует вообще не координаты, а местонахождение.
gpslog.LOCATION_ID - это цифровое представление колонки Местоположение в логе.
В таблице gpslog уже есть поля Lat & Lon - широта и долгота.
Вам надо так переписать скрипт, чтобы оптимизация шла по этим полям с округлением.
Re: Оптимизация логов GPS
Добавлено: Сб окт 24, 2015 6:39 pm
xor
Amarok, PHP для меня неродной язык, поэтому советую отнестись к моему предложению с осторожностью.
Вот, переделал скрипт.
Отличия:
оптимизирует только неизвестные локации в отличие от исходного.
Сейчас в нем все операции удаления из базы закомментированы, он только выводит сообщения о предполагаемом удалении.
Выводится ID записи для удаления "to delete ID"
ID записи видно из запроса
SELECT gpslog.ID, gpslog.LAT, gpslog.LON, gpslog.DEVICEID, gpslog.LOCATION_ID, gpsdevices.ID AS GPS_DEVICE_ID FROM gpslog LEFT JOIN gpsdevices ON gpslog.DEVICE_ID = gpsdevices.ID WHERE gpslog.LOCATION_ID =0 ORDER BY gpslog.DEVICEID, gpslog.ADDED DESC
Если устроит результат, снимите комментарии в строках //SQLExec("DELETE
На своих данных при округлении до 3 проверить не получается
Код: Выделить всё
set_time_limit(6000);
$records=SQLSelect("SELECT gpslog.ID, gpslog.LAT, gpslog.LON, gpslog.DEVICEID, gpslog.LOCATION_ID, gpsdevices.ID AS GPS_DEVICE_ID FROM gpslog LEFT JOIN gpsdevices ON gpslog.DEVICE_ID = gpsdevices.ID WHERE gpslog.LOCATION_ID =0 ORDER BY gpslog.DEVICEID, gpslog.ADDED DESC");
$total=count($records);
echo " total=".$total." <br />";
echo "-------------------- <br />";
$to_delete=array();
for($i=1;$i<$total-1;$i++) {
if (!$records[$i]['GPS_DEVICE_ID']) {
//SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
echo "delete records with unknown DEVICE_ID ID=".$records[$i]['ID']." <br />";
continue;
}
echo "-------------------- <br />";
echo "ID=".$records[$i]['ID']." GPS_DEVICE_ID=".$records[$i]['GPS_DEVICE_ID']." <br />";
echo "LON round i=".round($records[$i]['LON'],3)." i+1=".round($records[$i+1]['LON'],3)." i-1=".round($records[$i-1]['LON'],3)." <br />";
echo "LAT round i=".round($records[$i]['LAT'],3)." i+1=".round($records[$i+1]['LAT'],3)." i-1=".round($records[$i-1]['LAT'],3)." <br />";
if (round($records[$i]['LON'],3)==round($records[$i+1]['LON'],3) && round($records[$i]['LON'],3)==round($records[$i-1]['LON'],3) && round($records[$i]['LAT'],3)==round($records[$i+1]['LAT'],3) && round($records[$i]['LAT'],3)==round($records[$i-1]['LAT'],3))
{
//SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
echo "to delete ID=".$records[$i]['ID']." <br />";
}
if ($i%200==0) {
//echo ".";
//echo str_repeat(' ', 1024);
flush();
flush();
}
}
Re: Оптимизация логов GPS
Добавлено: Вс окт 25, 2015 7:51 am
Amarok
Работает. Благодарю!
А как удалять подобные записи:

- Screenshot_2.png (9.45 КБ) 6768 просмотров
Хотелось бы записи с точностью более, к примеру, 500 - в топку
Re: Оптимизация логов GPS
Добавлено: Вс окт 25, 2015 11:56 am
Amarok
А, нет, не работает:

- Screenshot_4.png (41.84 КБ) 6760 просмотров
Re: Оптимизация логов GPS
Добавлено: Вс окт 25, 2015 2:29 pm
xor
Amarok, пришлите мне страницу-другую вывода из скрипта и сам скрипт, который запускался. У меня, как говорил, нету своих достаточных данных.
А по поводу удаления записей с большим радиусом - я в скрипт Сергея первой строкой вставил
SQLExec("DELETE FROM gpslog WHERE ACCURACY>600");
Но хотелось бы фильтровать такие записи на входе.
Re: Оптимизация логов GPS
Добавлено: Вс окт 25, 2015 2:57 pm
Amarok