powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычисление дистанции по координатам GPS
12 сообщений из 12, страница 1 из 1
Вычисление дистанции по координатам GPS
    #40132071
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть СУБД MariaDB 10.0.38.
Функции st_distance_sphere в ней нет (она появилась в 10.2.38).
Но есть st_distance.
Можно ли с ее помощью вычислить дистанцию между двумя точками?
Расстояния невелики (менее сотни километров), сферическими искажениями можно пренебречь.
То есть результат SELECT ST_Distance(POINT(1,1),POINT(2,2)) меня вполне устраивает.
Вопрос только в том, как перевести широту и долготу в километровую сетку.

Пробовал просто умножить на 111 и 111*cos(широта), но видимо что-то не то, потому что погрешность получается чудовищная (вместо 175 метров получилось 132).
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132099
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

отчаиваться не надо, гуглопоиск часто врет (111 вообще непричем) результат уже в МЕТРАХ
-- ОСЛО 59.871615914096544, 10.732875010123138
-- Стокгольм 59.28192441905507, 18.082728206254334

418.7 км по гугл карте
проверяем
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=502b166cd89538410451b8ba3fdf295b
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- широта-долгота в гугл кординтатах
-- ОСЛО 59.871615914096544, 10.732875010123138
-- стокгольм 59.28192441905507, 18.082728206254334
-- аргумент Долгота-Широта а не наоборот
-- Только MariaDB функция ST_GeomFromText (без ЗПТ)
set @oslo   = ST_GeomFromText('POINT(10.732875010123138 59.871615914096544)');
set @stok = ST_GeomFromText('POINT(18.082728206254334 59.28192441905507)');
SELECT ST_Distance_Sphere(@oslo, @stok) AS dist_Meter, 
ST_Distance_Sphere(@oslo, @stok) / 1000 AS dist_KM;
-- MySQL 
SELECT ST_Distance_Sphere(POINT(10.732875010123138, 59.871615914096544 )
, POINT(18.082728206254334, 59.28192441905507)) AS dist_Meter;

...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132101
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
отчаиваться не надо, гуглопоиск часто врет

Надо, надо. Официальная документация не врёт.
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132107
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

совсем не обратил внимания
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132108
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на Хабре статья для 5.х https://habr.com/ru/post/179157/

-------
я подумал что у ТС беда с тем что долгота-широта перевернута
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132115
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на Хабре статья для 5.х https://habr.com/ru/post/179157/
отлично работает, спасибо автору
https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=5d9d0f8647005ce1b26cf8db1e543a1d [SRC sql ]CREATE FUNCTION geodist_sphere (
src_lat DECIMAL(9,6), src_lon DECIMAL(9,6),
dst_lat DECIMAL(9,6), dst_lon DECIMAL(9,6)
) RETURNS DECIMAL(6,2) DETERMINISTIC
BEGIN
SET @dist := 6371 * 2 * ASIN(SQRT(
POWER(SIN((src_lat - ABS(dst_lat)) * PI()/180 / 2), 2) +
COS(src_lat * PI()/180) *
COS(ABS(dst_lat) * PI()/180) *
POWER(SIN((src_lon - dst_lon) * PI()/180 / 2), 2)
));
RETURN @dist;
END;
-- широта-долгота в гугл кординтатах
-- ОСЛО 59.871615914096544, 10.732875010123138
-- стокгольм 59.28192441905507, 18.082728206254334
select Geodist_sphere(59.871615914096544, 10.732875010123138,
59.28192441905507, 18.082728206254334)as IsOsloVstolgolm;
-- 418 km[/SRC]
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132117
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одном градусе широты примерно 111 километров, поэтому и пробовал просто умножить градусы на масштаб.
Но что-то не то, результаты слишком неточные.

Вычисление гаверсинусов на PHP у меня есть, на клиенте расстояния считаются правильно.
Но я хотел получить расстояния сразу в результатах запроса.
На небольших расстояниях st_distance по идее должен работать. Но почему-то неправильно работает.
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132118
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую добавить функцию в БД.
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132158
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
В одном градусе широты примерно 111 километров
Это только на экваторе.
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132168
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Alibek B.
В одном градусе широты примерно 111 километров
Это только на экваторе.

Ты с долготой попутал
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132185
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
порассуждаем
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=1be5bcd16c5820bda264a91c42b48717
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/* по широте 1 градус */
-- "точки" (50,120)(51,120)
-- аргумент перевернем Долгота-Широта
SELECT ST_Distance_Sphere(POINT(120, 50 ), POINT(120, 51)) AS LON_Meter;
LON_Meter
111194.68229846291

/* по долготе 1 градус */
-- "точки" (50,121)(51,120)
-- аргумент перевернем Долгота-Широта
SELECT ST_Distance_Sphere(POINT(121, 50 ), POINT(120, 50)) AS LAT_Meter;
LAT_Meter
71474.03168200726


широта 0-90 от экватора к полюсам
долгота 0-180 от гринвича на восток-запад

получаем не квадрат а прямоугольник 111 км на 143 км (?)
...
Рейтинг: 0 / 0
Вычисление дистанции по координатам GPS
    #40132217
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ради хохмы
можно применить коэф. для некритичных измерений. +Погрешность 1,94%
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=fb95d857bc52ad6deddbcfd6175324fe

подогнали ST_Distance() к ST_Distance_Sphere()
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- ОСЛО 
set @x1 = 59.871615914096544; -- широта
set @y1 = 10.732875010123138; -- долгота
-- Стокгольм 
set @x2 = 59.28192441905507; -- широта
set @y2 = 18.082728206254334; -- долгота
-- distance + Koef + 1.94%
SELECT ST_Distance(POINT(@y1*111194/2, @x1*71474), 
POINT(@y2*111194/2, @x2*71474))**1.0194 AS Dist_Meter;
/* Dist_Meter
418767.14368619554 */
-- distance_sphere
SELECT ST_Distance_Sphere(POINT(@y1, @x1), POINT(@y2, @x2)) AS Sphere_Meter;
/* Sphere_Meter
418785.6180850169 */

подогнали ST_Distance() к ST_Distance_Sphere()
так сдаются большие проекты
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычисление дистанции по координатам GPS
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (5), Yandex Bot, Google Bot 1 мин., Bing Bot 1 мин.
x
x
Закрыть


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