Я хочу искать ближайшие местоположения из координат (широта / долгота) в базе данных mysql, я использую сферический закон косинусов для поиска в этих местах:
SELECT onlycoord.id, locations.name, locations.ascii,
locations.latitude, locations.longitude,
locations.country, locations.elevation,
locations.gtopo30, locations.timezone,
(6371 * ACOS(
COS( RADIANS( 48.48 ) ) *
COS( RADIANS( onlycoord.latitude ) ) *
COS(
RADIANS( onlycoord.longitude ) -
RADIANS( 2.20 )
) +
SIN( RADIANS( 48.48 ) ) *
SIN( RADIANS( onlycoord.latitude ) )
)) AS distance
FROM onlycoord USE INDEX (coordinate)
LEFT JOIN locations USE INDEX (id)
ON (onlycoord.id = locations.id)
WHERE onlycoord.latitude BETWEEN (
48.48 - ( 5 / 111 )
) AND (
48.48 + ( 5 / 111 )
) AND onlycoord.longitude BETWEEN (
2.20 - ( 5 / ABS( COS(
RADIANS( 48.48 )
) * 111 ) )
) AND (
2.20 + ( 5 / ABS( COS(
RADIANS( 48.48 )
) * 111 ) )
)
ORDER BY distance ASC
LIMIT 0, 20
Где 6371 - радиус Земли (км), 111(км) - 1 ° широты, cos (широта) * 111 (км) - 1 ° долготы, а 5 (км) - радиус поиска.
Проблема: я хочу найти как минимум 8 городов, ноРадиус 5 км является небольшим, но быстрым для сжатой зоны (во многих городах), поэтому, если я использую search radius
слишком большой для сжатой зоны, запрос будет медленным (много результатов: упорядочить по), но для неконденсированной - search radius
слишком мал, чтобы найти хотя бы 8 городов ...
Как я могу сделать рекурсивный запрос, который автоматически увеличивает search radius
(x2), если количество найденных городов <8 (используется только mysql)? </p>
Спасибо