powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Определение пройденного расстояния по GPS координатам
3 сообщений из 3, страница 1 из 1
Определение пройденного расстояния по GPS координатам
    #40068419
MaNuNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые форумчане! )
У меня вот такая задачка, не могу сообразить как применить формулу Гаверсинуса или Винсента в 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 и вставить в ней формулу, по итогу чтобы запрос обработал координаты и выдал общее суммарное расстояние в км или метрах?
Буду премного благодарна!)
...
Рейтинг: 0 / 0
Определение пройденного расстояния по GPS координатам
    #40072275
MaNuNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кому пригодится, удалось реализовать мою задачу через функцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 ;



Далее вызываем эту функцию и делаем суммирование пройденного пути:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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



Или второй вариант, мне больше подошел:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
Определение пройденного расстояния по GPS координатам
    #40072296
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то у MySQL есть встроенная ST_Distance и её вариации. Но если очень хочется, можно считать и вручную...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Определение пройденного расстояния по GPS координатам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]