在10公里半径内选择具有纬度-经度值的行?

3

我有一个展示某个城市帖子的网站。我在考虑将它从城市更改为围绕用户位置的半径(在这种情况下为10公里)。

我不知道如何使用半径进行查询。我只能想到使用两个条件进行查询并获得一个正方形。例如:

SELECT fields
FROM points
WHERE lat BETWEEN LAT1 AND LAT2
AND lon BETWEEN LON1 AND LON2

是否有可能从某个位置选择X公里/英里半径内的行?


这个问题可能对你有价值 - 不是关于MySQL,但是思路仍然适用。 - Marvin Pinto
你有计算两点之间距离的公式吗?这将有助于确定是否可以在SQL中完成。 - Scott Hunter
我认为每个纬度或经度点大约是111公里。因此,使用勾股定理,函数将是 (lat*111)^2+(lon*111)^2=distance^2。不过我不确定如何 CREATE FUNCTION - lisovaccaro
2个回答

2

通常情况下,您可以在任何条件上使用WHERE查询。因此,假设您有一个函数distance(),可以计算两个地理点之间的距离,则可以执行以下操作:

SELECT fields
FROM points
WHERE distance(lat, lon, city_lat, city_lon) <= 10

city_latcity_lon 是城市中心的位置。

PostgreSQL 包含一个叫做 earthdistance() 的插件函数可以帮助解决问题。


听起来可行。只是一个关于函数的问题。我只需像普通的PHP函数一样在查询上面编写它,就可以了吗?还是我需要做些不同的事情才能使它与查询一起运行?我一分钟内接受。 - lisovaccaro
不,该函数需要被您的数据库访问(PHP脚本中的函数不行),这意味着您需要使用CREATE FUNCTION来编写自己的函数。 - Greg Hewgill

0
$users = DB::table('users')
        ->select('id','name','phone','latitude','longitude')
        ->SQRT("POW(69.1 * (latitude - 24.900110), 2) +
        POW(69.1 * (67.099760 - longitude) * COS(latitude / 57.3), 2)) AS distance")
        ->having("distance < 25")
        ->orderBy("distance")
        ->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接