Добрый день
Есть база MySQL, в ней таблица points содержащая столбцы lat, lon, desc..... Подскажите пожалуйста как получить из базы точки находящиеся в радиусе 100км от заданных координат
Этот топик читают: Гость
Ответов: 578
Рейтинг: 14
|
|||
карма: 0 |
|
Ответов: 8923
Рейтинг: 823
|
|||
GanjaKyp, если иметь ввиду, что lat -- по-русски "широта", а lon -- "долгота", то к заданной широте +-1.111111 градус, а к долготе +-1.111111/cos(широты) градус и получите координаты четырёхугольника (не круга) размером 200х200 км с центром в заданной точке.
Для круга радиусом 100 км формулы чуть сложнее. |
|||
карма: 19 |
|
Ответов: 578
Рейтинг: 14
|
|||
В принципе сойдет и четырехугольник, дальше уже можно считать расстояние между координатами. А чтобы получить четырехугольник 500х500 км сколько в градусах надо прибавить и убавить?
|
|||
карма: 0 |
|
Ответов: 8923
Рейтинг: 823
|
|||
GanjaKyp, окружность Земли по меридиану 40000 км, принимая за шар (хотя в принципе эллипс) получаем 40000/360 = 111.111 км/градус, а 500 км соответственно 500/111.111 = 4.5 градуса по широте, по долготе -- тот же ~COS, хотя для 500 км формула более сложная.
|
|||
карма: 19 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Леонид, ключевое слово Есть база MySQL.
GanjaKyp, в поисковике Google вбиваешь : MySQL и вхождение точек в радиус. Ответ поисковика : Результатов: примерно 8 140 ( В Яндексе Нашлось 44 млн результатов) Выбираешь подходящий. Редактировалось 3 раз(а), последний 2018-08-06 16:58:01 |
|||
карма: 25 |
|
Ответов: 578
Рейтинг: 14
|
|||
Почему то оба этих запроса выдают крайние точки примерно 500км по высоте, но всего 350 по ширине --- Добавлено в 2018-08-06 18:30:51 Tad писал(а): Леонид, ключевое слово Есть база MySQL.
GanjaKyp, в поисковике Google вбиваешь : MySQL и вхождение точек в радиус. Ответ поисковика : Результатов: примерно 8 140 ( В Яндексе Нашлось 44 млн результатов) Выбираешь подходящий. Я уже десяток способов попробовал, ни один не дает окружность правильной формы Редактировалось 1 раз(а), последний 2018-08-06 18:30:51 |
|||
карма: 0 |
|
Ответов: 8923
Рейтинг: 823
|
|||
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 |
|
Ответов: 8923
Рейтинг: 823
|
|||
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 |
|
Ответов: 578
Рейтинг: 14
|
|||
Леонид, все равно как то неправильно получается. по картинке видно что слева и справа точки на меньшем расстоянии от центра чем сверху и снизу
картинка Редактировалось 3 раз(а), последний 2018-08-07 06:17:13 |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
GanjaKyp_1.jpg |
|||
карма: 25 |
|
Ответов: 578
Рейтинг: 14
|
|||
это просто отбор точек по категории
|
|||
карма: 0 |
|
Ответов: 8923
Рейтинг: 823
|
|||
GanjaKyp, ваша БД не выполняет функцию деления на Cos(MyLat):
BETWEEN " & (MyLon-4.5/Cos(MyLat)) & " AND " & (MyLon+4.5/Cos(MyLat)) Почему можно спросить у Tad-а, может надо функцию косинуса в верхнем регистре обозначать COS |
|||
карма: 19 |
|
Ответов: 578
Рейтинг: 14
|
|||
Cos(MyLat) выполняется в самой программе, нужно чтобы выполнялось в sql?
|
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Функция MySQL COS возвращает косинус числа.
Синтаксис Синтаксис функции COS в MySQL: COS( number ) Параметры или аргументы number — значение, используемое для вычисления косинуса. Выражается в радианах. |
|||
карма: 25 |
|
Ответов: 578
Рейтинг: 14
|
|||
Изменил чтобы COS выполнялось в базе, но ситуация все равно осталась прежней, сверху и снизу около 500км, а слева и справа только 350. В чем может быть проблема?
Мне хотя бы квадрат 500х500 получить чтобы уменьшить трафик к серверу, а дальше я уже буду проверять расстояние в самой программе на вхождение в точный радиус |
|||
карма: 0 |
|