百度地图API详解之公交导航

原文地址:http://blog.csdn.net/sup_heaven/article/details/8461593

只是作为备忘!!!

一次调试百度地图多marker事件监听的问题,不知如何解决,后来看了原作者jz1108才知道要用闭包。觉得原作者jz1108关于百度地图的文章写的不错,所以转载到了CSDN,为了尊重原作者jz1108,特此说明。

前面我们介绍过驾车导航了,今天来说说公交导航。

什么是公交导航

公交导航功能是告诉使用者从A到B的公交出行方案,而不是某条具体的公交线路信息,这一点需要广大开发者注意。

公交导航功能通过类TransitRoute来实现,这里需要说说为啥不是BusRoute,而是TransitRoute。百度提供的是公共交通导航,公共交通不仅仅涉及bus,可能还会有地铁、渡轮甚至以后的飞机火车,所以这里使用的是public transit中的transit进行描述。

一个简单的例子

我们还是从一个简单的例子开始:

var transit = new BMap.TransitRoute(‘北京‘, {
    renderOptions: {
        map: map,
        panel: ‘panel‘
    }
});
transit.search(‘西单‘, ‘颐和园‘);

代码通过renderOptions设置渲染的地图实例和侧栏面板容器的id,其中map是已经实例化好的地图,panel为已经准备好的div元素的id。我们会看到如下结果:

地图上显示了一个方案,在面板中列出了所有方案的描述,点击不同的方案地图会予以展示。

除了使用字符串类型以外,还可以提供坐标进行查询,这样可以得到更精确的结果。比如从“麦当劳”到“肯德基”这样的路线查询就不会得到结果,因为API不知道是从哪个麦当劳到哪个肯德基。下面的示例使用了坐标进行搜索。

transit.search(new BMap.Point(116.315157,39.987946),
               new BMap.Point(116.371499,39.880394));

下面是使用坐标作为参数进行查询得到的结果:

注意,由于提供的是坐标,所以起点和终点没有具体的地点描述。

和驾车导航类似,起点和终点也可以是LocalResultPoi类型,我们还是用上面的坐标进行查询,不过是封装在一个LocalResultPoi类型当中的:

transit.search({title: ‘我这里‘, point: new BMap.Point(116.315157,39.987946)},
               {title: ‘你这里‘, point: new BMap.Point(116.371499,39.880394)});

这样API在展示结果时就可以显示起点和终点的描述了。

自定义覆盖物展示

如果你不满意API提供的默认线路的颜色和标注的样式,你也可以选择通过通过数据接口自行创建。注意,自己创建覆盖物时,点击列表中的方案将不会更新地图区域,因为此时地图区域的元素都是由开发者自行创建的。在使用数据接口之前,先通过一个结构图来了解一个完整的公交方案的各个组成部分,以方便理解:

一个不需要换乘的公交方案是由:起点、起点到上车站的步行线路、上车站到下车站的公交线路以及下车站到终点的步行线路构成。当然有可能起点和上车站是重合的,或者终点和下车站是重合的,此时步行线路长度就为0(起点或终点本身就为公交站的时候)。如果有换乘,那么每次换乘中的下车站到上车站也有步行线路(如上图的第二个方案所示)。

所以不论公交方案具体是什么样,在数据上的表示都是一致的:

  • 直达方案:2条步行线路 + 1条公交线路
  • 换乘一次方案:3条步行线路 + 2条公交线路
  • 换乘两次方案:4条步行线路 + 3条公交线路

以此类推。

API中通过TransitRouteResult来描述公交导航结果,通过TransitRoutePlan来描述一条公交方案。那么怎么获取公交导航结果和具体的方案的信息呢?请看下面的示例:

var transit = new BMap.TransitRoute(‘北京‘, {
    onSearchComplete: function(result) {
        if (transit.getStatus() == BMAP_STATUS_SUCCESS) {
            // 从结果对象中获取起点和终点信息
            var start = result.getStart();
            var end = result.getEnd();
            addStart(start.point, start.title);
            addEnd(end.point, end.title);
            // 直接获取第一个方案
            var plan = result.getPlan(0);
            // 遍历所有步行线路
            for (var i = 0; i < plan.getNumRoutes(); i++) {
                if (plan.getRoute(i).getDistance(false) > 0) {
                    // 判断只有大于0的步行线路才会绘制
                    addWalkRoute(plan.getRoute(i).getPath());
                }
            }
            // 遍历所有公交线路
            var allLinePath = [];
            for (i = 0; i < plan.getNumLines(); i++) {
                allLinePath = allLinePath.concat(plan.getLine(i).getPath());
                addLine(plan.getLine(i).getPath());
            }
            // 最后根据公交线路的点设置地图视野
            map.setViewport(allLinePath);
        }
    }
});

transit.search(‘北京大学‘, ‘北京交通大学‘);

// 添加起点覆盖物
function addStart(point, title){
    map.addOverlay(new BMap.Marker(point, {
        title: title,
        icon: new BMap.Icon(‘http://images.cnblogs.com/cnblogs_com/jz1108/329471/o_blue.png‘, new BMap.Size(38, 41), {
            anchor: new BMap.Size(4, 36)
        })}));
}

// 添加终点覆盖物
function addEnd(point, title){
    map.addOverlay(new BMap.Marker(point, {
        title: title,
        icon: new BMap.Icon(‘http://images.cnblogs.com/cnblogs_com/jz1108/329471/o_red.png‘, new BMap.Size(38, 41), {
            anchor: new BMap.Size(4, 36)
        })}));
}

// 添加路线
function addWalkRoute(path){
    map.addOverlay(new BMap.Polyline(path, {
        strokeColor: ‘black‘,
        strokeOpacity: 0.7,
        strokeWeight: 4,
        strokeStyle: ‘dashed‘,
        enableClicking: false
    }));
}

function addLine(path){
    map.addOverlay(new BMap.Polyline(path, {
        strokeColor: ‘blue‘,
        strokeOpacity: 0.6,
        strokeWeight: 5,
        enableClicking: false
    }));
}

在上面的代码中,通过TransitRouteOptions的onSearchComplete属性设置了回调函数,一旦检索完成这个回调函数就会被调用。在回调函数开始我们先判断检索是否成功,如果成功表示至少有一条公交方案返回,这里我们先通过结果对象获取起点和终点,接着直接获取第一条方案,遍历方案中所有步行线路和公交线路并绘制在地图上,最后我们根据公交线路的点来设置一个合适的地图视野。

你会在浏览器中得到如下效果:

在获取结果对象时,除了通过回调函数参数获取以外,还可以通过TransitRoute的getResults方法获得,需要注意的是,由于搜索过程是异步的,以下代码的写法将不会得到结果:

transit.search(‘西单‘, ‘颐和园‘);
var res = transit.getResults();  // undefined

因为search方法调用结束后搜索结果并没有立即返回。开发者可以在回调函数中调用此方法立即获得结果,也可以等回调函数执行完若干时间后再想获取结果数据时调用。

自定义方案描述

通过TransitRoutePlan的getDescription可以获得完整的方案描述,但是如果开发者想自行定义描述的形式则可通过数据接口进行。例如:

var transit = new BMap.TransitRoute(‘北京‘, {
    onSearchComplete: function(result) {
        if (transit.getStatus() == BMAP_STATUS_SUCCESS) {
            // 从结果对象中获取起点和终点信息
            var start = result.getStart().title;
            var end = result.getEnd().title;

            // 直接获取第一个方案
            var plan = result.getPlan(0);
            // 获取步行线路与公交线路个数总和,用于遍历
            var total = plan.getNumRoutes() + plan.getNumLines();

            var description = [‘从‘ + start];
            var addEndTitle = true;
            for (var i = 0; i < total; i++) {
                if (i % 2 == 0) {
                    // i为偶数
                    // 处理第一个步行描述逻辑
                    if (i / 2 == 0) {
                        if (plan.getRoute(i / 2).getDistance(false) == 0) {
                            description = [‘从‘];
                        }
                    }
                    // 处理最后一个步行描述逻辑
                    if (i / 2 == plan.getNumRoutes() - 1) {
                        if (plan.getRoute(i / 2).getDistance(false) == 0) {
                            addEndTitle = false;
                        }
                    }
                    if (plan.getRoute(i / 2).getDistance(false) > 0) {
                        description.push(‘步行约‘ + plan.getRoute(i / 2).getDistance(true) + ‘至‘);
                    }
                } else {
                    // i为奇数
                    var line = plan.getLine((i - 1) / 2);
                    if (i == 0) {
                        description.push(line.getGetOnStop().title + ‘, ‘);
                    }
                    if (i > 0) {
                        if (plan.getRoute((i - 1) / 2).getDistance(false) > 0) {
                            description.push(line.getGetOnStop().title + ‘, ‘);
                        }
                    }
                    description.push(‘乘坐‘ + line.title + ‘, ‘);
                    description.push(‘经过‘ + line.getNumViaStops() + ‘站‘);
                    description.push(‘在‘ + line.getGetOffStop().title + ‘站下车,‘);
                }
            }
            if (addEndTitle) {
                description.push(end + ‘。‘);
            }
            // 替换可能出现的末尾位置的逗号
            var descriptionStr = description.join(‘‘).replace(/\uff0c$/, ‘。‘);
        }
    }
});

transit.search(‘北京大学‘, ‘北京交通大学‘);

变量descriptionStr的内容为:“从北京大学步行约60米至北京大学西门, 乘坐运通106(中央党校北门-田村北路), 经过6站在中国农业科学院站下车,乘坐26(二里庄-西便门), 经过4站在北京交通大学站下车。”。

回调函数详解

前面的几个例子我们使用了onSearchComplete回调函数,在API中还提供了如下几个回调函数,它们的含义和触发时机如下:

    • onMarkersSet:如果设置了渲染的地图,则API自动添加标注后会触发此函数。
    • onPolylinesSet:如果设置了渲染的地图,则API自动添加线路覆盖物后会触发此函数。
    • onInfoHtmlSet:如果设置了渲染地图,当用户点击标注弹出信息窗口时会触发此函数。
    • onResultsHtmlSet:如果设置了渲染侧栏,则API填充完HTML后会触发此函数。
时间: 2024-10-16 15:01:37

百度地图API详解之公交导航的相关文章

百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和DOM编程里的事件模型一样,百度地图API也提供了类似的事件机制.本文介绍了事件监听的添加和移除方法,this指针和事件参数的使用以及绑定事件监听函数中涉及的闭包问题,最后分享了一个用来增强地图API事件机制的开源项目. 事件添加和移除 我们最简单的事件开始,下面的代码示例给map对象添加了click事件的监听

[转]百度地图API详解之地图坐标系统

博客原文地址:http://www.jiazhengblog.com/blog/2011/07/02/289/ 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection).在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系. 在百度地图API中,你需要了解如下坐标系: 经纬度:通过经度(longitude)和纬度(latitu

百度地图API详解之地图标注(一)

博客原文地址:http://www.jiazhengblog.com/blog/2011/09/15/400/ 本文将向大家介绍百度地图API的标注(Marker)的使用方法和一些实现细节. 标注概述 标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息.比如你在西单商场位置添加了一个标注,不论地图移动.缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置. 从上面的图可以看出,不论地图如何变化标注始终指向"西单商场"的位置. 如何知道某个点的坐标? 上例

百度地图API详解之自定义地图类型

http://blog.csdn.net/sup_heaven/article/details/8461586 今天的文章主要介绍如何利用地图API实现自定义地图. 百度地图API目前默认支持两种地图类型(map type):普通图和三维图,它们分别通过常量BMAP_NORMAL_MAP和BMAP_PERSPECTIVE_MAP来表示,在1.2版本中这两个常量实际上是MapType对象的实例.当然开发者也可以自己实例化一个MapType从而实现一个自定义的地图. 切图工具的使用 我们先从切图工具

百度地图Api详解之地图标注

标注概述 标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息.比如你在西单商场位置添加了一个标注,不论地图移动.缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置. 从上面的图可以看出,不论地图如何变化标注始终指向“西单商场”的位置. 如何知道某个点的坐标? 上例中我们在西单商场位置添加了一个标注,那么我是如何知道它的坐标点呢?可以通过API的事件机制来获取: map.addEventListener('click', function(e){ console.

iOS 百度地图使用详解

最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的demo,看不到效果.纠结了好久,结合别人的总结和从百度官网上下载的demo,详细记录一下百度地图的使用过程,分享一下,也便于以后查阅使用. 百度地图的使用和苹果一样,相对于高德地图来说规范了好多.直接将程序的bundle Identity和appkey值绑定,虽然刚开始用感觉有点

百度地图API自动定位和3种导航

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type

百度地图API和高德地图API资料集锦

[高德地图API]从零开始学高德JS API(五)路线规划--驾车|公交|步行 [高德地图API]从零开始学高德JS API(四)搜索服务--POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 [高德地图API]从零开始学高德JS API(三)覆盖物--标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 [高德地图API]从零开始学高德JS API(二)地图控件与插件--测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 [高德地图API]从零开始学高德JS API

Android 百度地图API 定位 导航

看看这个利用百度地图定位并实现目的地导航的Demo.首先看实现效果:                          进 入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路. 步行线路,在代码中都有详细注释.另外,在控制台还输出了线路上每一个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息.如下 图: 接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料