我正在使用此SQL查询来获取最接近GPS坐标的数据。
SELECT geo_latitude, geo_longitude, geo_name, geo_country_code AS country,
(DEGREES(
ACOS(
SIN(RADIANS(47.470779)) * SIN(RADIANS(geo_latitude)) +
COS(RADIANS(47.470779)) * COS(RADIANS(geo_latitude)) *
COS(RADIANS(-87.890699 - geo_longitude))
)
) * 60 * 1.1515)
AS distance FROM `MyDatabase`.`allCountries` ORDER BY distance ASC LIMIT 20 ;
此查询将检索所有数据,而与距离无关。我希望它只在10英里半径范围内显示数据。我怎样才能做到这一点?
答案 0 :(得分:2)
我找到了两种方法。一种方法是在'where'部分中使用大量数学运算进行直接SQL查询,就像您为SQL的AS distance
部分标记的一样。基本上 - 概念上 - '距离< 10'
然而,我发现这减慢了我的请求...所以我所做的另外就是从数据库中取出方形而不是圆形。简单地说:弄清楚“十英里西/北/东/南”坐标,然后放入WHERE geo_latitude < X1 AND geo_latitude > x2 AND geo_longitude < x3 AND geo_longitude > x4
对我得到的东西施加严格的限制。然后,如果你真的需要这么精确,只需显示if( result.distance < 10 ){
或换句话说:
x1 = Coords + 10 miles north
x2 = Coords + 10 miles south
x3 = Coords + 10 miles east
x4 = Coords + 10 miles west
用你用来指示“向北10英里”的任何方式,然后用它从中心点向北,向南,向西和向东拉出一个10英里的“正方形”。只要您的geo_latitude
和geo_longitude
列被编入索引,就应该是一个快速的数据库调用。