我有以下数据:
在我的数据库中,我拥有所有用户的纬度和经度
我想找出离我当前位置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
三江源
答案 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可能会给你一个虚假的结果 - 这些比例因素是否给你一些除了地球半径以外的东西?
...尼克