/**
* 坐标计算
* 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);
}
}