通过我当前的位置(纬度,经度)查找100米范围内的所有用户ID和数据库距离?

时间:2013-07-15 15:53:29

标签: sql google-maps distance latitude-longitude

我有以下数据:

  1. 当前位置 一个。纬度 湾经度
  2. 用户ID
  3. 在我的数据库中,我拥有所有用户的纬度和经度

    我想找出离我当前位置100米范围内的所有用户。

    我已经使用了一些例子,但他们显示的纬度和经度相同纬度和经度最多为6位小数位的距离为9米。

    我使用了以下代码

    SELECT * , ((((acos( sin( ($lat * pi() /180 )) * sin((纬度* pi() /180) ) + cos( ( $lat * pi() /180 )) * cos((纬度* pi() /180)) * cos((( $lon -经度) * pi() /180 )))) *180 / pi()) *60 * 1.1515)*1.60934) AS距离FROM tablename where radar_status<>'0'且distance<'0.100 'ORDER BY distance ASC限制1,10 三江源

2 个答案:

答案 0 :(得分:3)

请检查结果或查看链接

http://forums.asp.net/t/1325947.aspx/1

http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#PolesAnd180thMeridian

如果您传递当前用户的纬度,经度和您想要查找的距离,则以下查询将执行这些操作。

SELECT * FROM(SELECT *,(((acos(sin((@latitude*pi()/180)) * sin((Latitude*pi()/180))+cos((@latitude*pi()/180)) * cos((Latitude*pi()/180)) * cos(((@longitude - Longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM Distances ) t  WHERE distance <= @distance

请同时查看

$distance = 10;
$latitude = 37.295092;
$longitude = -121.896490;
$sql = "SELECT loc.*, (((acos(sin(($latitude*pi()/180)) * sin((`latitude`*pi()/180))+cos(($latitude*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($longitude - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM table_with_lonlat_ref loc HAVING distance < $distance"

答案 1 :(得分:0)

这样做的公式很少,看起来你正在使用余弦的球面定律。你似乎正在转换为极好的弧度,看起来你正在从地球半径转换为公里罚款 - 但请看下面的内容:

1)我假设您的SQL设置默认为弧度? sin(pi / 2)= 1等。

2)我认为你在查询中使用额外的pi / 180转换为弧度。试试这个作为查询的内容。

试试这个:

ACOS(SIN($ lat1 * pi()/ 180)* SIN(纬度* pi()/ 180)+ COS($ lat * pi()/ 180)* COS(纬度* pi()/ 180) * COS(($ lon-longitude)* pi()/ 180))* 63.71

找出括号可能会变得棘手但是

ACOS( SIN(lat1)*sin(lat2) + COS(lat1)*cos(lat2)*cos(lon1-lon2) ) * RadiusEarth

以弧度为单位的所有角度。半径地球与查询过滤器的单位相同,即过滤时的km <0.100

你的* 60 * 1.51与其他地方的1.60可能会给你一个虚假的结果 - 这些比例因素是否给你一些除了地球半径以外的东西?

...尼克