У меня есть таблица 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-запрос в цикле, и, насколько я знаю, это плохая практика, особенно если записей будет тысячи.
Надеюсь, мне было ясно. Если нет, я был бы рад предоставить вам дополнительную информацию.
Спасибо за помощь.
Вот 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 (формула Хаверсайна)
Других решений пока нет …