Вверх ↑
Этот топик читают: Гость
Ответов: 578
Рейтинг: 14
#1: 2018-08-06 12:58:42 ЛС | профиль | цитата
Добрый день

Есть база MySQL, в ней таблица points содержащая столбцы lat, lon, desc..... Подскажите пожалуйста как получить из базы точки находящиеся в радиусе 100км от заданных координат
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8888
Рейтинг: 823
#2: 2018-08-06 14:07:29 ЛС | профиль | цитата
GanjaKyp, если иметь ввиду, что lat -- по-русски "широта", а lon -- "долгота", то к заданной широте +-1.111111 градус, а к долготе +-1.111111/cos(широты) градус и получите координаты четырёхугольника (не круга) размером 200х200 км с центром в заданной точке.
Для круга радиусом 100 км формулы чуть сложнее.
карма: 19

0
Ответов: 578
Рейтинг: 14
#3: 2018-08-06 14:36:03 ЛС | профиль | цитата
В принципе сойдет и четырехугольник, дальше уже можно считать расстояние между координатами. А чтобы получить четырехугольник 500х500 км сколько в градусах надо прибавить и убавить?
карма: 0

0
Ответов: 8888
Рейтинг: 823
#4: 2018-08-06 16:24:42 ЛС | профиль | цитата
GanjaKyp, окружность Земли по меридиану 40000 км, принимая за шар (хотя в принципе эллипс) получаем 40000/360 = 111.111 км/градус, а 500 км соответственно 500/111.111 = 4.5 градуса по широте, по долготе -- тот же ~COS, хотя для 500 км формула более сложная.
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#5: 2018-08-06 16:52:43 ЛС | профиль | цитата
Леонид, ключевое слово Есть база MySQL.
GanjaKyp, в поисковике Google вбиваешь : MySQL и вхождение точек в радиус.
Ответ поисковика : Результатов: примерно 8 140
( В Яндексе Нашлось 44 млн результатов)
Выбираешь подходящий.

Редактировалось 3 раз(а), последний 2018-08-06 16:58:01
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 578
Рейтинг: 14
#6: 2018-08-06 18:06:24 ЛС | профиль | цитата

SELECT * FROM `points` WHERE ((`lat` BETWEEN " & (MyLat-4.5) & " AND " & (MyLat+4.5) & ") AND (`lon` BETWEEN " & ((MyLon-4.5)/Cos(MyLat)) & " AND " & ((MyLon+4.5)/Cos(MyLat)) & "))


SELECT * FROM `points` WHERE ((lat - " & (MyLat) & ")*(lat - " & (MyLat) & ")) + ((lon - " & (MyLon) & ")*(lon - " & (MyLon) & ")) <= 10

Почему то оба этих запроса выдают крайние точки примерно 500км по высоте, но всего 350 по ширине

--- Добавлено в 2018-08-06 18:30:51

Tad писал(а):
Леонид, ключевое слово Есть база MySQL.
GanjaKyp, в поисковике Google вбиваешь : MySQL и вхождение точек в радиус.
Ответ поисковика : Результатов: примерно 8 140
( В Яндексе Нашлось 44 млн результатов)
Выбираешь подходящий.

Я уже десяток способов попробовал, ни один не дает окружность правильной формы

Редактировалось 1 раз(а), последний 2018-08-06 18:30:51
карма: 0

0
Ответов: 8888
Рейтинг: 823
#7: 2018-08-06 20:14:10 ЛС | профиль | цитата
GanjaKyp, вы задали
"((MyLon-4.5)/Cos(MyLat)) & " AND " & ((MyLon+4.5)/Cos(MyLat))",
а надо:
"(MyLon-4.5/Cos(MyLat)) & " AND " & (MyLon+4.5/Cos(MyLat))"

--- Добавлено в 2018-08-06 20:20:23

Для правильной окружности надо вычислять расстояние между заданной точкой и всеми точками базы данных и отбирать меньше/равно или сначала отобрать по предыдущей формуле и из них уже по расстоянию.

Редактировалось 1 раз(а), последний 2018-08-06 20:20:23
карма: 19

0
Ответов: 8888
Рейтинг: 823
#8: 2018-08-06 23:56:46 ЛС | профиль | цитата
GanjaKyp, ну и до кучи: УГОЛ (φ) между двумя единичными векторами (радиусами от центра до поверхности шара) в полярной системе координат (Ш - широта, Д - долгота):
φ = arccos(cos(Ш1)*sin(Д1)*cos(Ш2)*sin(Д2) + cos(Ш1)*cos(Д1)*cos(Ш2)*cos(Д2) + sin(Ш1)*sin(Ш2))
Длина дуги между точками L = φ*R = 6371.8 *φ [км]
А вот и пример расчёта:
Москва_Рязань.jpg
карма: 19

0
Ответов: 578
Рейтинг: 14
#9: 2018-08-07 06:16:38 ЛС | профиль | цитата
Леонид, все равно как то неправильно получается. по картинке видно что слева и справа точки на меньшем расстоянии от центра чем сверху и снизу

SELECT * FROM `points` WHERE ((`lat` BETWEEN " & (MyLat-4.5) & " AND " & (MyLat+4.5) & ") AND (`lon` BETWEEN " & (MyLon-4.5/Cos(MyLat)) & " AND " & (MyLon+4.5/Cos(MyLat)) & ")) AND (" & group.SubString(3) & ")"

картинка

Редактировалось 3 раз(а), последний 2018-08-07 06:17:13
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#10: 2018-08-07 08:49:57 ЛС | профиль | цитата
GanjaKyp_1.jpg
Объясни, что делает синее.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 578
Рейтинг: 14
#11: 2018-08-07 08:55:46 ЛС | профиль | цитата
это просто отбор точек по категории
карма: 0

0
Ответов: 8888
Рейтинг: 823
#12: 2018-08-07 12:28:24 ЛС | профиль | цитата
GanjaKyp, ваша БД не выполняет функцию деления на Cos(MyLat):
BETWEEN " & (MyLon-4.5/Cos(MyLat)) & " AND " & (MyLon+4.5/Cos(MyLat))
Почему можно спросить у Tad-а, может надо функцию косинуса в верхнем регистре обозначать COS
карма: 19

0
Ответов: 578
Рейтинг: 14
#13: 2018-08-07 12:34:44 ЛС | профиль | цитата
Cos(MyLat) выполняется в самой программе, нужно чтобы выполнялось в sql?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#14: 2018-08-07 13:22:54 ЛС | профиль | цитата
Функция MySQL COS возвращает косинус числа.

Синтаксис
Синтаксис функции COS в MySQL: COS( number )
Параметры или аргументы
number — значение, используемое для вычисления косинуса. Выражается в радианах.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 578
Рейтинг: 14
#15: 2018-08-08 08:54:11 ЛС | профиль | цитата
Изменил чтобы COS выполнялось в базе, но ситуация все равно осталась прежней, сверху и снизу около 500км, а слева и справа только 350. В чем может быть проблема?
Мне хотя бы квадрат 500х500 получить чтобы уменьшить трафик к серверу, а дальше я уже буду проверять расстояние в самой программе на вхождение в точный радиус
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)