Вот фото того, чего я в основном хочу достичь:
Итак, как следует из названия, я хочу объединить точки долготы/широты, радиус которых (например, 25 км) касается внутри ограничивающей рамки точек долготы/широты.
Вот моя очень простая структура БД:
+-------+-------------+------------+
| id | long | lat |
+-------+-------------+------------+
| 1 | -90.27137 | 50.00702 |
| 2 | -92.27137 | 52.00702 |
| 3 | -87.27137 | 48.00702 |
| 4 | -91.27137 | 51.00702 |
+-------+-------------+------------+
Вот мой запрос до сих пор:
set @bottom_lat = -100.27137;
set @bottom_lon = 40.00702;
set @top_lat = -80.27137 ;
set @top_lon = 60.00702 ;
;
SELECT AVG(latitude), AVG(longitude)
FROM destination
WHERE latitude > @bottom_lat AND longitude > @bottom_lon AND latitude < @top_lat AND longitude < @top_lon
Итак, мой запрос просто объединяет все точки внутри воображаемой ограничивающей рамки без учета радиуса.
Я знаю, что мне, вероятно, придется работать с формулой Хаверсина, но я плохо разбираюсь в математике и MySQL, что немного усложняет задачу. Действительно, я мог бы в конечном итоге объединить точки, если бы у меня был только один радиус, но каждая точка имеет свой собственный радиус, и я борюсь.
Это для студенческого проекта, и любая помощь будет очень признательна.
Использованная литература:
-Мой запрос на SQL Fiddle: http://sqlfiddle.com/#!2/3a42b/2 (содержит пример SQL Fiddle для формулы Haversine в комментарии)
- Формула Haversine в запросе MySQL: (работает для проверки всех точек внутри заданного радиуса)
SELECT*, ( 6371* acos( cos( radians(
@my_lat) ) * cos( radians(
destination.latitude ) ) * cos( radians(
destination.longitude ) - radians(
@my_lon) ) + sin( radians(
@my_lat) ) * sin( radians(
destination.latitude ) ) ) ) AS distance
FROM destination
ORDER BY distance limit 1
;