Php 限制MySQL查询中GPS位置的数量

Php 限制MySQL查询中GPS位置的数量,php,mysql,gps,Php,Mysql,Gps,我使用下面的查询来获取下一个使用其位置的本地事件。我的数据库在增长,我收到了来自欧洲各地的活动。因此,基本上,查询计算了两个不同国家(如西班牙和德国)的赛事距离,这实际上没有用,因为我正在寻找20公里内的下一个赛事 # latitude & longitude are the fields in DB # 43.57 & 3.85 are given values representing the local test point SELECT ( 6366 * ACOS( CO

我使用下面的查询来获取下一个使用其位置的本地事件。我的数据库在增长,我收到了来自欧洲各地的活动。因此,基本上,查询计算了两个不同国家(如西班牙和德国)的赛事距离,这实际上没有用,因为我正在寻找20公里内的下一个赛事

# latitude & longitude are the fields in DB
# 43.57 & 3.85 are given values representing the local test point
SELECT ( 6366 * ACOS( COS( RADIANS( 43.57 ) ) * COS( RADIANS( latitude ) ) * COS( RADIANS( longitude ) - RADIANS( 3.85 ) ) + SIN( RADIANS( 43.57 ) ) * SIN( RADIANS( latitude ) ) ) ) dist
FROM events
HAVING dist >0 AND dist <=20
ORDER BY event_time ASC 
LIMIT 0 , 5
所以基本上,这个查询将在能够使用HAVING之前获得所有事件的所有距离


有更好的办法吗

计算包围测试点周围半径的长方体四个点的经度和纬度。在几公里的距离内,由于地球的曲率,你可以忽略误差

我们可以使用一个粗略的近似值来限制初始搜索,然后在以后进行细化。 巴黎北纬50度左右,南北纬度约为111.229公里。东西方向的经度大约是71.695公里,我从这里得到这些数字,20公里大约是10.8秒的纬度,16.74秒的经度。通过从测试点的纬度和经度中加减这些数字来计算边界框

使用经度和纬度查询该框中的位置

如果您担心边界框太大,或者框角处的事件超出半径,请为已识别的点计算准确距离,并过滤掉不需要的几个点


这些数字大约为北纬50度。当你向北移动时,经度km的值会变得太长,而向南移动时,经度km的值会变得太短。您可以使用一个小的查找值表,或者计算到纬度的实际距离,或者简单地增加经度方向上的初始边界框。长方体只是一个近似值,因此只要它比目标区域大,它的确切大小就不太重要。

@OllieJones您所链接的问题的公认答案正是OP已经在使用的内容。“这个问题是在寻求改进。”霍博萨皮恩斯,没错,但我对这个问题的回答,而不是公认的答案,正好回答了他的问题。我不想再打字了。写在这里。我搜索了“四点”框,似乎找到了一个PHP库,可以实现这一点。调用boundingCoordinates后,我应该能够使用纬度和经度边界,因此查询速度要快得多@AlainZelink我添加了一个基于经验数据的近似方法,但我看到你已经找到了一个库。祝你好运