找到一个好东西,分享一下:PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询 [ 2.0 版本 ]
define(EARTH_RADIUS, 6371);//地球半径,平均半径为6371km
/**
*计算某个经纬度的周围某段距离的正方形的四个点
*
*@param lng float 经度
*@param lat float 纬度
*@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
*@return array 正方形的四个点的经纬度坐标
*/
function returnSquarePoint($lng, $lat,$distance = 0.5){
$dlng = 2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/EARTH_RADIUS;
$dlat = rad2deg($dlat);
return array(
'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
);
}
//使用此函数计算得到结果后,带入sql查询。
$squares = returnSquarePoint($lng, $lat);
$info_sql = "select id,locateinfo,lat,lng from `lbs_info` where lat<>0 and lat>{$squares['right-bottom']['lat']} and lat<{$squares['left-top']['lat']} and lng>{$squares['left-top']['lng']} and lng<{$squares['right-bottom']['lng']} ";
wuyu
注册时间:2015-07-01
最后登录:2018-09-06
在线时长:29小时42分
最后登录:2018-09-06
在线时长:29小时42分
- 粉丝12
- 金钱3125
- 威望10
- 积分3515
共 14 条评论
收藏了,可能以后会用到
听上去好强大,收藏了
今天刚好要用,所以就分享一下
请问做查询的时候为什么要设置经度不等于0呢?0度经线是本初子午线呀,难道这个系统在格林尼治天文台附近不能用?
还有就是保存进数据库的数据分南北纬和东西经吗?
存进数据库,就是一个正负数的问题
虽然没看懂,但是先收藏了
以后可能画线用 先收藏了
赶紧get感觉好强大,以后可能用到!!
此贴会火,露个脸
表示mysql压力好大
先mark一下
已经测试过了,可以用
感觉会不错!
怎么原理我看不懂呢,求教
补充,如果要求两个经纬度的直线距离的话,
addSelect(['(POWER(MOD(ABS(user.lng - '.$lng.'),360),2) + POWER(ABS(user.lat - '.$lat.'),2)) AS distance'])
我就像问问怎么攒点