mysql 经纬度函数_mysql函数-根据经纬度坐标计算距离 | 学步园

在实际的Web开发中,越来越多的碰到一些特定领域的专业通常的两种计算:1。要算的距离是椭球面的距离设第一点A的经纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三角推导,可以得到计算两点距离的如下公式:C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)Distance = R*Arccos(C)*Pi/180这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是:C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)Distance = R*Arccos(C)*Pi/1802。google地图提供的方法(PHP版本)

Php代码  567855b19ab60a5ba1cc410cf37b0af8.png

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;

}

}

第一种方法计算繁琐,我们通常采用的还是第二种方法。但是,无论是第一种还是第二种如果直接用

一个优化的方法就是采用SQL函数,具体的Mysql Function请参见附件,注意其中的括号,默认单位是公里,如果要转换成英里,请参考本文中PHP Code注释部分自行修改。

转至:http://lesorb.iteye.com/blog/1945755

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值