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

Limiting the number of GPS locations in MySQL query

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

# 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 度(大致相当于巴黎),纬度 (North/South) 大约为 111.229 公里。经度(East/West)大约是71.695km(我从this page得到这些数字从这20Km大约是纬度10.8秒,经度16.74秒。通过加减计算边界框这些数字来自您测试点的经纬度。

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

如果您担心边界框可能太大,或者边界框一角的事件超出半径,请计算您已经识别的那些点的准确距离并过滤掉很少有你不想要的。

备注 这些数字近似于北纬 50 度。当您向北移动时,您的经度公里值将变得太长,而向南移动则太短。您可以使用一个小 table 的查找值,或者计算与纬度的实际距离,或者简单地增加经度方向的初始边界框。这个盒子只是一个初步的近似值,所以只要它比目标区域大,它的确切大小就无关紧要了。