目前在做一个交友项目,需要知道两个用户之间的距离。百度了一下,操作如下:
我们最容易获取到用户地理位置的信息就是ip。
我们通过百度api获取用户经纬度,用ip获取经纬度api:

前些日子在做手机网站开发的时候碰到这样一个需求,用某度地图的定位功能查看自己现在所在的位置,同时要显示出以自己为圆心,周围x米以内的商家。
功能很简单,拿到自己的经纬度,算出四个点的经纬度坐标,从数据库里拿出相对应的商家,显示在地图上即可,关键就是需要这么一个好用函数。
还好找到了一个不错的,分享给大家,估计大家做到这一块的时候应该也会用到。

/**

/**
 * 计算某个经纬度的周围某段距离的正方形的四个点
 * 地球半径,平均半径为6371km
 * @param lng float 经度
 * @param lat float 纬度
 * @param distance float
该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
 * @return array 正方形的四个点的经纬度坐标
 */
function returnSquarePoint($lng, $lat,$distance = 0.5){

* 中国正常GCJ02坐标—->百度地图BD09坐标

得到经纬两个用户经纬度之后就可以计算两用户之间的距离了。计算如下:

    $dlng =  2 * asin(sin($distance / (2 * 6371)) /
cos(deg2rad($lat)));
    $dlng = rad2deg($dlng);

* 腾讯地图用的也是GCJ02坐标

 代码如下

    $dlat = $distance/6371;
    $dlat = rad2deg($dlat);

* @param double $lat 纬度

/**
* @desc 根据两点间的经纬度计算距离
* @param float $lat 纬度值
* @param float $lng 经度值
*/
function getDistance($lat1, $lng1, $lat2, $lng2)
{
$earthRadius = 6367000; //approximate radius of earth in meters 
  
 
$lat1 = ($lat1 * pi() ) / 180;
$lng1 = ($lng1 * pi() ) / 180;
 
$lat2 = ($lat2 * pi() ) / 180;
$lng2 = ($lng2 * pi() ) / 180;
 
 
$calcLongitude = $lng2 – $lng1;
$calcLatitude = $lat2 – $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) *
pow(sin($calcLongitude / 2), 2);
$stepTwo = 2 * asin(min(1, sqrt($stepOne)));
$calculatedDistance = $earthRadius * $stepTwo;
 
return round($calculatedDistance);
}

    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

* @param double $lng 经度

代码未经测试。测试后再更新本篇文章告知结果。

  • $dlng)
        );

*/

   
开发还会用到一个很有用的函数,就是通过两点之间的经纬度,计算出两点之间的距离.
    /**
     * @desc 根据两点间的经纬度计算距离
     * @param float $lat 纬度值
     * @param float $lng 经度值
     */
    function getDistance($lat1, $lng1, $lat2, $lng2){

function Convert_GCJ02_To_BD09($lat,$lng){

        $earthRadius = 6367000;

$x_pi = 3.14159265358979324 * 3000.0 / 180.0;

        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;

$x = $lng;

        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;

$y = $lat;

        $calcLongitude = $lng2 – $lng1;
        $calcLatitude = $lat2 – $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) *
cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;

$z =sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);

        return round($calculatedDistance);
    }

$theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);

    出自:

$lng = $z * cos($theta) + 0.0065;

$lat = $z * sin($theta) + 0.006;

return array(‘lng’=>$lng,’lat’=>$lat);

}

/**

* 百度地图BD09坐标—->中国正常GCJ02坐标

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注