我的数据库当前填充了大约10k行。所有这些都具有基于邮政编码中心的经度/纬度。我发现了一个我正在尝试扩展的查询,但总而言之,它在某一点上运行良好。但是,在我下面的例子中,我试图找到半径25英里范围内的东西,这在大多数情况下似乎都有效。我的大多数结果确实在25英里的标准范围内产生,但是我得到了一些从86英里到800英里以外的任何东西。
实施例: 这是我的中心纬度/经度:37.2790669,-121.874722 =加利福尼亚州圣何塞 我得到的结果如:33.016928,-116.846046 =加利福尼亚州圣地亚哥,离圣何塞约355英里。
我当前的查询如下:
SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180))
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515)
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC"
答案 0 :(得分:93)
以下是我在我使用的商店定位器上使用的查询:
SELECT
`id`,
(
6371 *
acos(
cos( radians( :lat ) ) *
cos( radians( `lat` ) ) *
cos(
radians( `long` ) - radians( :long )
) +
sin(radians(:lat)) *
sin(radians(`lat`))
)
) `distance`
FROM
`location`
HAVING
`distance` < :distance
ORDER BY
`distance`
LIMIT
25
:lat
和:long
是用户传递的点,lat
和long
是数据库中存储的点。
距离是以英里为单位测量的,在代码的工作版本中:距离实际上是从10-50英里范围内拉下来的
更改代码以使用千米可以通过将3959(从地球中心到地面的距离,以英里为单位)更改为6371(3959英里转换为公里数)来实现,这要归功于该解决方案的joshhendo。