用php移植百度地图js的getDistance

百度地图的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);

三、测试

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序: 很多新接触GIS的人员对地图投影以及坐标系统很难理解,甚至做GIS开发做了好几年的人也有这方面的疑惑,地...
    三维GIS那点事_王跃军阅读 17,548评论 3 43
  • 众所周知地球是一个不规则椭圆体,GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及...
    亮仔菲个阅读 14,051评论 1 8
  • 一.百度地图的使用 (一)显示百度地图的步骤有下面几步: 下载SDK 加入lib中,依赖jar,并且依赖so文件 ...
    于加泽阅读 4,469评论 1 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,387评论 25 708
  • 从夜开始的 花盛开的地方 从黑深处的红 看一眼 忘一眼 只留最早的怅惘 褪去过去的方式 我想过 是在一万条河流里洗...
    李榆阅读 372评论 6 10