用php移植百度地图js的getDistance

百度地图的js提供根据两点经纬度计算距离的方法,点击查看官方示例:


但是,在服务器端的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);

三、测试

测试的时候,如果想更换自己想要的坐标,可以去百度地图拾取坐标系统获得自己喜欢地点的经纬度。

你可能感兴趣的:(用php移植百度地图js的getDistance)