mysql — выбирает записи с близкого расстояния друг от друга

У меня есть таблица MySQL, содержащая местоположения, например:

ID  latitude  longitude  value
1   11.11111  22.22222   1
2   33.33333  44.44444   2
3   11.11112  22.22223   5

Я хочу выбрать записи, которые расположены рядом друг с другом (в приведенном выше примере строки 1 и 3), чтобы я мог вставить их в новую таблицу как одну запись. Говоря рядом, скажем, 100 метров. Я хотел бы, чтобы новая таблица была:

ID  latitude  longitude  value
1   11.11111  22.22222   3
2   33.33333  44.44444   2

Как видите, я хотел бы сохранить координаты первой записи и вставить среднее значение для двух записей в столбец «значение».

Формула, которую я использую для расстояния, следующая:

R*SQRT(((lon2*c-lon1*c)*cos(0.5*(lat2*c+lat1*c)))^2 + (lat2*c-lat1*c)^2)

где

[lat1, lon1] the coordinates of the first location,
[lat2, lon2] the coordinates of the second location,
[R] the average radius of Earth in meters,
[c] a number to convert degrees to radians.

Формула хорошо работает на короткие расстояния.

Итак, моя проблема не в преобразовании lat, lon в расстояния, а в мой SQL. Я знаю, как выбирать записи, которые имеют максимальное расстояние в 100 метров от определенных широтных координат, но я не знаю, как выбирать записи с максимальным расстоянием друг от друга.

Один из способов, которым я это сделал — и это работает — состоит в том, чтобы зацикливать записи по одной в PHP и для каждого, делая запрос SQL для выбора записей, которые находятся рядом. Но, таким образом, я выполняю SQL-запрос в цикле, и, насколько я знаю, это плохая практика, особенно если записей будет тысячи.

Надеюсь, мне было ясно. Если нет, я был бы рад предоставить вам дополнительную информацию.

Спасибо за помощь.

2

Решение

Вот SQL, чтобы получить все места в диапазоне:

SELECT
ID,
latitude,
longitude,
(6371 * acos (cos( radians(origin.latitude)) * cos( radians( destination.latitude ))
* cos( radians(destination.longitude) - radians(origin.longitude)) + sin(radians(origin.latitude))
* sin( radians(destination.latitude)))) AS distance
FROM myTable as destination, myTable as origin
WHERE destination.id = myId
HAVING distance < 100 --some value in kilometers

6371 это константа для километров.
3959 это постоянная для миль.

Эта тема имеет больше ответов: MySQL Great Circle Distance (формула Хаверсайна)

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector