Выборка точек в радиусе 3 км. от координат в MySQL

Есть таблица:

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| lat   | double  | NO   |     | NULL    |                |
| lon   | double  | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+

Помогите сделать выборку данных, в радиусе 3км. от определенных координат.


Ответы (1 шт):

Автор решения: Zhihar

поскольку расстояние не очень велико по сравнению с радиусом Земли, то можно использовать упрощённую формулу (вам же не с точностью до миллиметра?):

R = 6371
x = (lon2 - lon1) * cos((lat2 + lat1) / 2)
y = (lat2 - lat1)
d = R * sqrt(x * x + y * y)

http://www.movable-type.co.uk/scripts/latlong.html

сравнивать точнее квадраты, чем корни, поэтому

d^2 = R^2 * (x * x + y * y)

значит нужна такая формула для выборки

40589641 * ((lon_s - lon) * cos((lat_s + lat) / 2) * (lon_s - lon) * cos((lat_s + lat) / 2) + (lat_s - lat) * (lat_s - lat)) < 9

т.е. запрос будет типа такого:

SELECT
    * 
FROM 
    table
where
    40589641 * ((@lon_s - lon) * COS((@lat_s + lat) / 2) * (@lon_s - lon) * COS((@lat_s + lat) / 2) + (lat_s - lat) * (lat_s - lat)) < 9
→ Ссылка