Как я могу найти расстояние между строками, используя столбцы долготы и широты, используя MySQL?

У меня есть база данных со столбцами lng и lat для каждой строки. Как я могу сделать SQL-запрос, который вернет строки в порядке расстояния? Я сравню широту и долготу с внешними значениями. Я отправлю SQL-запрос с PyMySQL, используя Python. Если это невозможно, у меня есть формула гаверсинуса, написанная на Python, и я могу рассчитать расстояния таким образом, но я не хочу тратить время на перебор всех записей в базе данных, которая очень велика.

Образец таблицы:

   long ============ lat
============================
1. -74 ============= 84
2. -87 ============= 75

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


person CompuGenuis Programs    schedule 13.03.2019    source источник
comment
в порядке удаленности от чего? пожалуйста, покажите пример кода, чтобы люди могли соответственно помочь   -  person gold_cy    schedule 13.03.2019
comment
Было бы здорово, если бы вы могли предоставить нам некоторые образцы данных и ожидаемые результаты.   -  person Paolo    schedule 13.03.2019
comment
Может быть интересно прочитать: mysqlserverteam.com/geography-in-mysql-8-0   -  person Klaus D.    schedule 13.03.2019
comment
@Паоло Сделал это.   -  person CompuGenuis Programs    schedule 13.03.2019


Ответы (2)


Ваш запрос должен включать столбец вычисляемого поля для расстояния. Ваш ORDER BY будет использовать вычисляемое поле.

person Hopper    schedule 13.03.2019
comment
Не обязательно. Расстояние можно вычислить на лету. - person The Impaler; 13.03.2019
comment
@TheImpaler Я планировал это. Я добавлю первые 5 строк по порядку в список расстояний. - person CompuGenuis Programs; 13.03.2019
comment
Ваш комментарий означает, что вы могли бы сделать топ-5 на основе расчета. Ваш первоначальный пост заставил меня подумать, что вам нужны все рассчитанные расстояния. - person Hopper; 14.03.2019
comment
@Hopper Оба верны. Мне нужны все расстояния, но в Python я добавлю пять лучших в список. Другие расстояния я также буду использовать. - person CompuGenuis Programs; 15.03.2019

Во-первых, я бы реализовал функцию Haversine как функцию MySQL, например:

create function haversine_distance (
  float long1, 
  float lat1,
  float long2,
  float lat2)
returns float deterministic
return ... -- formula here

Как только вы это сделаете, запрос станет очень простым. Например, для долготы 10.21 / широты -50.45 запрос будет выглядеть так:

select *
from my_table
order by haversine_distance(long, lat, 10.21, -50.45) asc
person The Impaler    schedule 13.03.2019
comment
Я плохо разбираюсь в MySQL, и в данный момент я не собираюсь учиться. Я буду запускать SQL-запрос с помощью PyMySQL или phpmyadmin. Есть ли способ, которым вы могли бы объяснить некоторые необычные коды? - person CompuGenuis Programs; 13.03.2019
comment
Что ж, первая часть — это определение формулы (упомянутой вами формулы Хаверсина) в движке MySQL (страница руководства dev.mysql.com/doc/refman/8.0/en/create-procedure.html). Вторая часть представляет собой простой SQL, который извлекает строки, отсортированные по расстоянию до определенной точки, которую вы используете в качестве параметров (длина + широта). - person The Impaler; 13.03.2019
comment
Если у вас нет времени изучать основы функций в MySQL, то вам лучше сделать это на Python или любом другом клиентском языке. Однако решение MySQL имеет гораздо более высокую производительность. Это может быть полезно в долгосрочной перспективе. - person The Impaler; 13.03.2019
comment
Этот код не работает в PhpMyAmin - person CompuGenuis Programs; 13.03.2019