用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);

三、测试

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

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