1

我正在使用这个 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 英里半径内的数据。我怎样才能做到这一点?

4

1 回答 1

2

我找到了两种方法。一种方法是在“where”部分使用大量数学进行直接 SQL 查询,就像您为AS distanceSQL 部分标记的一样。本质上 - 概念上 - '距离 < 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_latitudegeo_longitude列被索引,这应该是一个快速的数据库调用。

于 2013-03-27T12:54:02.073 回答