百度地图的js提供根据两点经纬度计算距离的方法,点击查看官方示例:
<script type="text/javascript">
// 百度地图API功能
var map = new BMap.Map("allmap");
map.centerAndZoom("重庆",12); //初始化地图,设置城市和地图级别。
var pointA = new BMap.Point(106.486654,29.490295); // 创建点坐标A--大渡口区
var pointB = new BMap.Point(106.581515,29.615467); // 创建点坐标B--江北区
alert('从大渡口区到江北区的距离是:'+(map.getDistance(pointA,pointB)).toFixed(2)+' 米。'); //获取两点距离,保留小数点后两位
var polyline = new BMap.Polyline([pointA,pointB], {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}); //定义折线
map.addOverlay(polyline); //添加折线到地图上
</script>
但是,在服务器端的SDK中,似乎并没有提供相应的办法来获取距离的方法。下面,给出查看js源码而写出的php实现方式。
一、分析js
js的中的getDistanct方法就在 http://api.map.baidu.com/getscript?v=2.0&ak=您的密钥 中。但是js被压缩过的,可以使用在线小工具解压一下,得到解压后的文件,这里附上一个解压后版本。根据解压后的js,然后一个方法一个方法的慢慢分析。其中,百度地图api定义的地球半径是6370996.81在3369行。
//这段代码在1097行
getDistance: function(a, b) {
if (a && b) {
if (a.nb(b)) return 0;
var c = 0,
c = R.To(a, b);
if (c === p || c === j) c = 0;
return c
}
},
//R.To在3397行定义的
To: function(a, b) {
if (!a || !b) return 0;
a.lng = this.ND(a.lng, -180, 180);
a.lat = this.RD(a.lat, -74, 74);
b.lng = this.ND(b.lng, -180, 180);
b.lat = this.RD(b.lat, -74, 74);
return this.Re(this.Sk(a.lng), this.Sk(b.lng), this.Sk(a.lat), this.Sk(b.lat))
},
//ND,RD之类的大概在3457行定义的
二、php实现
class Point{
/**
* @param $lng 精度
* @param $lat 纬度
*/
public function __construct($lng,$lat){
$this->lng = $lng;
$this->lat = $lat;
}
}
class Map{
private $iP = 6370996.81;
/**
* @param Point $a
* @param Point $b
*/
public function getDistance(Point $a,Point $b){
$a->lng = $this->PD($a->lng, -180, 180);
$a->lat = $this->TD($a->lat, -74, 74);
$b->lng = $this->PD($b->lng, -180, 180);
$b->lat = $this->TD($b->lat, -74, 74);
return $this->Pe($this->TK($a->lng),$this->TK($b->lng),$this->TK($a->lat),$this->TK($b->lat));
}
public function Pe($a, $b, $c, $d) {
return $this->iP * acos(sin($c) * sin($d) + cos($c) * cos($d) * cos($b - $a));
}
public function TK($a) {
return M_PI * $a / 180;
}
public function PD($a,$b,$c){
for (; $a > $c;) $a -= $c - $b;
for (; $a < $b;) $a += $c - $b;
return $a;
}
public function TD($a,$b,$c){
$p = null;
$b != $p && ($a = max($a, $b));
$c != $p && ($a = min($a, $c));
return $a;
}
}
$pointA = new Point(106.486654,29.490295);
$pointB = new Point(106.581515,29.615467);
$map = new Map();
echo number_format($map->getDistance($pointA,$pointB),2);
三、测试
测试的时候,如果想更换自己想要的坐标,可以去百度地图拾取坐标系统获得自己喜欢地点的经纬度。