最近在项目中遇到要根据用户的经纬度查看附近的人,由于其他用户的经纬度都在本地数据库中存放,所以一时间在高德地图的API中没有找到合适的。
我们知道在地球的经纬度线上每条经线理论上是相等的,所以在经线上平均1纬度对应的距离大约是111公里。而每条纬度线则是不一样的,在纬度线上平均1经度对应的距离是111公里乘以用户所在地球纬度的余弦值。
由此我们可以通过下述方法大致计算出在以用户经纬度为圆心的最大经纬度和最小经纬度。源码如下:
- public function getcoordinate($lnglat,$raidus){
- //传入用户的经纬度,经度在前,纬度在后,可参考高德经纬度。$distance是半径距离,单位:公里
- $arr = explode(",",$lnglat);
- $lng = $arr[0];
- $lat = $arr[1];
- $raidusLng = round($raidus/(111*cos($lat)),6);
- $raidusLat = round($raidus/111,6);
- $maxLng = $lng + $raidusLng;
- $minLng = $lng - $raidusLng;
- $maxLat = $lat + $raidusLat;
- $minLat = $lat - $raidusLat;
- $data = array(
- 'maxLng'=>$maxLng,
- 'minLng'=>$minLng,
- 'maxLat'=>$maxLat,
- 'minLat'=>$minLat
- );
- return $data;
- }
上面这个方法是我个人写的,下面这个方法是百度搜索中一网友分享的,也贴出来。
- public function getAround($lat,$lon,$raidus){
- $PI = 3.14159265;
- $latitude = $lat;
- $longitude = $lon;
- $degree = (24901*1609)/360.0;
- $raidusMile = $raidus;
- $dpmLat = 1/$degree;
- $radiusLat = $dpmLat*$raidusMile;
- $minLat = $latitude - $radiusLat;
- $maxLat = $latitude + $radiusLat;
- $mpdLng = $degree*cos($latitude * ($PI/180));
- $dpmLng = 1 / $mpdLng;
- $radiusLng = $dpmLng*$raidusMile;
- $minLng = $longitude - $radiusLng;
- $maxLng = $longitude + $radiusLng;
- $data = array('minlat'=>$minLat,'maxlat'=>$maxLat,'minlng'=>$minLng,'maxlng'=>$maxLng);
- return $data;
- }
上述两种方法都是根据用户的经纬度计算最大经纬度和最小经纬度的,当然大家也可以以用户为中心画圆,判断其他用户是否在圆内,来达到获取附近人的效果。参考网址:http://www.jb51.net/article/56967.htm。