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

我有一个目前约有1万行的数据库。它们都基于邮政编码的中心具有经度/纬度。我发现了一个我正在尝试扩展的查询,但是总的来说它在某种程度上运行良好。但是,在下面的示例中,我试图找到半径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"

回答:

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

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是用户传递的点,其中latlong是存储在数据库中的点。

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

借助joshhendo的解决方案,可以将3959(从地球中心到地面的距离,以英里为单位)更改为6371(将3959英里转换为公里),从而将代码更改为以千米为单位。

以上是 mySQL经度和纬度查询x英里半径内的其他行 的全部内容, 来源链接: utcz.com/qa/398103.html

回到顶部