一点坐标发散后得到范围, map寻找




/**

* 坐标计算

* date :Nove 11,2011--- 光棍节

* author:snuser

*/



/**

示例:

$lat = 0.1;

$lng = 116.085239;

$lat2 = 0.2;

$lng2 = 116.085239;

$data = Coordinate::getDisCoord($lng, $lat, 1000);

$distance = Coordinate::getDistance($lng, $lat, $lng2, $lat2);

*/

class Coordinate{

/**

* 地球半径 单位(m)

* 常量

*/

const EARTH_RADIUS = 6378137.0;

/**

* 得到某坐标发散后的距离的坐标

* @lng 经度 floor (11,7)

* @lat 纬度 floor (11,7)

* @distance 单位(m)

* return array

*/

static function getDisCoord($lng,$lat,$distance){

//纬度偏移

$dlat = 2*asin(sin($distance/(2*self::EARTH_RADIUS))/cos($lat));

$dlat = rad2deg(abs($dlat));

//经度偏移

$dlng = $distance/self::EARTH_RADIUS ;

$dlng = rad2deg( abs( $dlng ) );

return array(

'lat1'=>sprintf('%.7f', ($lat+$dlat)),

'lat2'=>sprintf('%.7f', ($lat-$dlat)),

'lng1'=>sprintf('%.7f', ($lng+$dlng)),

'lng2'=>sprintf('%.7f', ($lng-$dlng)),

);

}

/**

* 计算两点之间的球面距离

* return floot

*/

static function getDistance($lng0, $lat0, $lng1, $lat1){

$x = ($lng1-$lng0)*M_PI*self::EARTH_RADIUS*cos(($lat0+$lat1)/2*M_PI/180)/180;

$y = ($lat1-$lat0)*M_PI*self::EARTH_RADIUS/180;

$distance = self::hav($x, $y);

return $distance;

}

/**

* 开平方

* 根号下(x2+y2)

* @param unknown_type $x

* @param unknown_type $y

* @return unknown

*/

static function hav($x, $y){

return sqrt($x*$x+$y*$y);

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值