Оптимизация логов GPS

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Оптимизация логов GPS

Сообщение Amarok » Пт окт 23, 2015 3:56 pm

Захотелось сделать оптимизацию логов 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
Screenshot_1.png (29.43 КБ) 6855 просмотров
Надо, наверное, "загрубить" точность оптимизации, но как? Обрабатывать, к примеру не 4 знака после запятой, а два-три? и как это сделать?
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Оптимизация логов GPS

Сообщение xor » Пт окт 23, 2015 11:02 pm

Может быть, в третьем 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
и тд
?
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Оптимизация логов GPS

Сообщение xor » Пт окт 23, 2015 11:22 pm

А как бы еще фильтровать до записи в базу (наверное, в gps.php) приходящие сообщения о местоположении с плохой точностью больше там 600 м?
У меня бывает в метро точность неск. км((
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Оптимизация логов GPS

Сообщение Amarok » Сб окт 24, 2015 7:24 am

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
и тд
?
Не понимаю(
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Оптимизация логов GPS

Сообщение xor » Сб окт 24, 2015 4:07 pm

упс, скрипт оптимизирует вообще не координаты, а местонахождение.
gpslog.LOCATION_ID - это цифровое представление колонки Местоположение в логе.
В таблице gpslog уже есть поля Lat & Lon - широта и долгота.
Вам надо так переписать скрипт, чтобы оптимизация шла по этим полям с округлением.
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Оптимизация логов GPS

Сообщение xor » Сб окт 24, 2015 6:39 pm

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 проверить не получается
Script Test_GPS_optimПоказать

Код: Выделить всё

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();
   }
  } 
За это сообщение автора xor поблагодарил:
Amarok (Вс окт 25, 2015 7:47 am)
Рейтинг: 1.16%
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Оптимизация логов GPS

Сообщение Amarok » Вс окт 25, 2015 7:51 am

Работает. Благодарю!
А как удалять подобные записи:
Screenshot_2.png
Screenshot_2.png (9.45 КБ) 6767 просмотров
Хотелось бы записи с точностью более, к примеру, 500 - в топку
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Оптимизация логов GPS

Сообщение Amarok » Вс окт 25, 2015 11:56 am

А, нет, не работает:
Screenshot_4.png
Screenshot_4.png (41.84 КБ) 6759 просмотров
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Оптимизация логов GPS

Сообщение xor » Вс окт 25, 2015 2:29 pm

Amarok, пришлите мне страницу-другую вывода из скрипта и сам скрипт, который запускался. У меня, как говорил, нету своих достаточных данных.

А по поводу удаления записей с большим радиусом - я в скрипт Сергея первой строкой вставил

SQLExec("DELETE FROM gpslog WHERE ACCURACY>600");

Но хотелось бы фильтровать такие записи на входе.
За это сообщение автора xor поблагодарил:
mirsum (Вс окт 25, 2015 5:14 pm)
Рейтинг: 1.16%
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Оптимизация логов GPS

Сообщение Amarok » Вс окт 25, 2015 2:57 pm

СпойлерПоказать
Моя Алиска живёт на Proxmox в Debian 12
Ответить