Я действительно написал короткое сообщение в блоге некоторое время назад именно для этой цели.По сути, мой запрос:
SELECT
Name,
Address,
City,
State,
Latitude,
Longitude,
(
ACOS(
COS(@center_latitude * (PI()/180)) *
COS(@center_longitude * (PI()/180)) *
COS(Latitude * (PI()/180)) *
COS(Longitude * (PI()/180)) +
COS(@center_latitude * (PI()/180)) *
SIN(@center_longitude * (PI()/180)) *
COS(Latitude * (PI()/180)) *
SIN(Longitude * (PI()/180)) +
SIN(@center_latitude * (PI()/180)) *
SIN(Latitude * (PI()/180))
) *
(
(@equatorial_radius * @polar_radius) /
(
SQRT(
(@equatorial_radius * @equatorial_radius) -
(
(
(@equatorial_radius * @equatorial_radius) -
(@polar_radius * @polar_radius)
) *
(
COS(@center_latitude) *
COS(@center_latitude)
)
)
)
)
)
) AS Miles
FROM
Places
WHERE
Miles <= @search_radius
Дайте ему центральную широту, центральную долготу и радиус поиска, и вы должны быть хорошими.(Параметры для экваториального и полярного радиусов Земли, естественно, могут быть жестко запрограммированы.)
Вся эта математика должна учитывать кривизну Земли, выпуклость на экваторе и т. Д.