您好,欢迎光临! 推荐您使用Chrome浏览器访问本站。

PHP mysql 计算两个经纬度坐标距离

mysql版

SELECT 2 * 6378.137 * ASIN( SQRT( POW( SIN( PI( ) * ( 114.09576416015625 - 114.1798 ) /360 ) , 2 ) + COS( PI( ) * 114.09576416015625 /180 ) * COS( 114.1798 * PI( ) /180 ) * POW( SIN( PI( ) * ( 22.3932534047735 - 114.1798 ) /360 ) , 2 ) ) ) AS a
FROM dual

php版

function rad($d)
{
return $d * 3.1415926535898 / 180.0;
}
function GetDistance($lat1, $lng1, $lat2, $lng2)
{
$EARTH_RADIUS = 6378.137;   //公里
$radLat1 = rad($lat1);
$radLat2 = rad($lat2);
$a = $radLat1 – $radLat2;
$b = rad($lng1) – rad($lng2);
$s = 2 * asin(sqrt(pow(sin($a/2),2) +
cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
$s = $s *$EARTH_RADIUS;
$s = round($s * 10000) / 10000;
return $
mysql版

CREATE DEFINER=`root`@`localhost` FUNCTION `distance`(lat1 float,lng1 float,lat2 float,lng2 float) RETURNS float
BEGIN

set @num=
2 * 6378.137* ASIN(SQRT(POW(SIN(PI() * (lat1 – lat2) / 360), 2) + COS(PI() * lat1 / 180)
* COS(lat2* PI() / 180) * POW(SIN(PI() * (lng1 – lng2) / 360), 2)));
RETURN @num;
END

google地图提供的方法(PHP版本)

class Distance{
const EARTH_RADIUS = 6378.137; // earth radius (const) kilometer

  /**
   *
   *	Example:
   *		$precision = 49;
   *		ini_set("precision", $precision);
   *		echo pi(); //will output 3.141592653589793115997963468544185161590576171875
   *
   *		1 kilometer = 0.621371192 mile
   *
   *	@param double d
   *	@return double data
   */
  private function rad( $d )
  {
    return $d * M_PI / 180.0;
  }

  /**
   *
   *	Example : get_distance(44.2112,-88.4175,34.5082,-82.6498)
   *	Get Distance between two point : longitude,latitude(lat1,lng1 => lat2,lng2 )
   *
   *	@param double d
   *	@return double data
   *
   */
  public function get_distance( $lat1, $lng1, $lat2, $lng2, $base = 1000 )
  {
    $radLat1 = floatval( $this->rad($lat1) );
    $radLat2 = floatval( $this->rad($lat2) );
    $a = $radLat1 - $radLat2;
    $b = $this->rad($lng1) - $this->rad($lng2);

    $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));

    $s = $s * self::EARTH_RADIUS;
    $s = round($s * 10000) / 10000;

    return $s;
  }
}

参看:
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
http://blog.csdn.net/aggrelxf/article/details/12054513
http://blog.sina.com.cn/s/blog_7bbfd5fd01017d1e.html
http://lesorb.iteye.com/blog/1945755
http://digdeeply.org/archives/06152067.html

您可能也喜欢