Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Определение пройденного расстояния по GPS координатам  [new]
MaNuNa
Member

Откуда:
Сообщений: 32
Доброго времени суток, уважаемые форумчане! )
У меня вот такая задачка, не могу сообразить как применить формулу Гаверсинуса или Винсента в MySQL 5.0.12.
Мне нужно по списку координат (поля `Latitude` , `Longitude` хранятся в типе Float) вычислить общее пройденное расстояние желательно в км, или метрах за заданный отрезок времени..
Записи координат происходят каждые 30 секунд.
Иногда бывают ошибки в определении приемником, и немного улетают по широте, бывает и по долготе)
Было бы идеально с каким то фильтром или проверкой.

SELECT SUM (Тут я так понимаю нужно вставить перевод Широты и Долготы в км или метры )
FROM `data`
WHERE `ID_Dev` = 1 and
`DateTime` BETWEEN '2021-05-04 08:00:00' AND '2021-05-04 20:00:00'

Прошу помощи) Может кто помочь сформировать MySQL и вставить в ней формулу, по итогу чтобы запрос обработал координаты и выдал общее суммарное расстояние в км или метрах?
Буду премного благодарна!)
4 май 21, 21:06    [22318492]     Ответить | Цитировать Сообщить модератору
 Re: Определение пройденного расстояния по GPS координатам  [new]
MaNuNa
Member

Откуда:
Сообщений: 32
Может кому пригодится, удалось реализовать мою задачу через функцию:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `FN_GET_DISTANCE`(
lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE
) RETURNS double
BEGIN
    DECLARE radlat1 DOUBLE;
    DECLARE radlat2 DOUBLE;
    DECLARE theta DOUBLE;
    DECLARE radtheta DOUBLE;
    DECLARE dist DOUBLE;
    SET radlat1 = PI() * lat1 / 180;
    SET radlat2 = PI() * lat2 / 180;
    SET theta = lng1 - lng2;
    SET radtheta = PI() * theta / 180;
    SET dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta);
    SET dist = acos(dist);
    SET dist = dist * 180 / PI();
    SET dist = dist * 60 * 1.1515;
    SET dist = dist * 1.609344;
RETURN dist;
END$$
DELIMITER ;


Далее вызываем эту функцию и делаем суммирование пройденного пути:
SELECT (SUM(CASE WHEN (FN_GET_DISTANCE(FIRST.Latitude,FIRST.Longitude,second.Latitude,second.Longitude))BETWEEN 0.01 AND 2 THEN FN_GET_DISTANCE(FIRST.Latitude,FIRST.Longitude,second.Latitude,second.Longitude) ELSE 0 END))  AS distance 
FROM `data` AS first 
JOIN `data` AS second 
WHERE first.id +1 = second.id 
and 
first.ID_Dev = 1 
and
first.DateTime BETWEEN '2021-05-23 08:00:00' AND '2021-05-23 20:00:00' 
ORDER BY first.id ASC


Или второй вариант, мне больше подошел:
SELECT SUM(t.distance) as Distance FROM 
(SELECT (CASE WHEN (FN_GET_DISTANCE(Latitude,Longitude,@OLDLatitude,@OLDLongitude)) BETWEEN 0.01 AND 2 THEN 
FN_GET_DISTANCE(Latitude,Longitude,@OLDLatitude,@OLDLongitude) ELSE 0 END)  AS distance,
IF(@OLDLatitude IS NOT NULL, @OLDLatitude := Latitude, 0),
IF(@OLDLongitude IS NOT NULL, @OLDLongitude := Longitude, 0)
FROM `data` , (SELECT @OLDLatitude := 0) var0, (SELECT @OLDLongitude := 0) var1
WHERE ID_Dev = 1 
AND DateTime BETWEEN '2021-05-23 08:00:00' AND '2021-05-23 20:00:00'  
ORDER BY ID DESC) t;


Сообщение было отредактировано: 23 май 21, 12:19
23 май 21, 12:21    [22325842]     Ответить | Цитировать Сообщить модератору
 Re: Определение пройденного расстояния по GPS координатам  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21200
Вообще-то у MySQL есть встроенная ST_Distance и её вариации. Но если очень хочется, можно считать и вручную...

Сообщение было отредактировано: 23 май 21, 17:16
23 май 21, 17:25    [22325897]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить