mySQL经度和纬度查询x英里半径内的其他行

chr*_*ris 35 mysql latitude-longitude

我目前有一个大约有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"
Run Code Online (Sandbox Code Playgroud)

Gor*_*man 97

这是我在我使用的商店定位器上使用的查询:

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
Run Code Online (Sandbox Code Playgroud)

:lat并且:long是用户传递的点,其中latlong是存储在数据库中的点.

:距离以英里为单位,在代码的工作版本中测量:距离实际上是从10-50英里的下拉范围内拉出的

改变代码以使用千米可以通过改变3959(从地球中心到其表面的距离,以英里为单位)到6371(3959英里转换为公里)来实现,这要归功于该解决方案的joshhendo.

  • 为了完整起见,请访问https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql (4认同)
  • 戈登弗里曼,你能告诉我"<25"代表什么吗?是25英里还是公里?如果您不介意与我进行快速聊天,我还有另一个问题吗? (3认同)
  • 在观察之后,3959是以英里为单位的地球半径,所以要转换为KM,我希望你唯一需要做的就是将其改为6371(KM中的地球半径) (3认同)
  • "HAVING"是关键.它允许您以"WHERE"没有的方式使用"距离"别名. (2认同)