BaiduMap开发,获取公交站点信息。

可能有些人会出现无法导入overlayutil的错误,这是因为BaiduMap里面的包把这部分删除掉了,并且官方没有给出说明,这个地方以前也是让我折腾了很久。

不知道现在有没有说明这个问题,如果需要这个包,可以下载官方demo,把这个包复制下载粘贴到自己项目里面。

功能如下:

  • 在地图中显示公交路线。
  • 在log中打印公交路线及其信息。
  • 在地图中添加站点点击显示相应信息。(这里使用百度提供的包,在里面的类直接修改)

1.这里是需要把公交的uid检索出来,遍历所有poi,找到类型为公交线路的poi。在公交信息里面需要使用UID

 /**
     * 创建POI检索结果监听器 poiSearch
     */
    OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            if (poiResult == null
                    || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
                Toast.makeText(MainActivity.this, "未找到结果",
                        Toast.LENGTH_LONG).show();
                return;
            }

            if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
                // 遍历所有poi,找到类型为公交线路的poi
                buslineIdList.clear();
                for (PoiInfo poi : poiResult.getAllPoi()) {
                    if (poi.type == PoiInfo.POITYPE.BUS_LINE
                            || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                        buslineIdList.add(poi.uid);
                    }
                }
                searchBusline();
            }
        }

2.这里会根据上面的UID来检索公交信息。具体为公交“检索入口”部分

private void searchBusline() {
        //公交的站点大于,该路线的长度。
        if (buslineIndex >= buslineIdList.size()) {
            buslineIndex = 0;
        }
        //公交站点 小于这个路线的长度
        if (buslineIndex >= 0 && buslineIndex < buslineIdList.size()
                && buslineIdList.size() > 0) {
            //定义并设置公交信息结果监听者(与POI类似),并发起公交详情检索;
            //如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
            //参数city和这个keyword路线的UID
           // 公交检索入口
            boolean flag = busLineSearch
                    .searchBusLine((new BusLineSearchOption().city(city)
                            .uid(buslineIdList.get(buslineIndex))));
            //是否成功检索
            if (flag) {
                //把布局隐藏
                linearLayout.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "检索成功~", Toast.LENGTH_LONG)
                        .show();
            } else {
                Toast.makeText(MainActivity.this, "检索失败~", Toast.LENGTH_LONG)
                        .show();
            }
            buslineIndex++;
        }
    }

 

3.这里是公交信息的监听器,里面有回调函数。

  BusLineOverlay overlay = new BusLineOverlay(mBaiduMap);

 BusLineOverlay是overlayuti 里面的一个类,下文会讲解。

buslineOverlay.setData(busLineResult,MainActivity.this);
要注意这两个信息。setData()方法也是该BusLineOverlay类的一个方法。

/**
     * 公交信息查询结果监听器, busLineSearch
     */
    OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
       /* 公交信息查询结果回调函数
        * 参数:
        *result - 公交信息查询结果
        */
        @Override
        public void onGetBusLineResult(BusLineResult busLineResult) {
            if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(MainActivity.this, "未找到结果",
                        Toast.LENGTH_SHORT).show();
            } else {
                mBaiduMap.clear();
                // 用于显示一条公交详情结果的Overlay
                BusLineOverlay overlay = new BusLineOverlay(mBaiduMap);
                overlay.setData(busLineResult,MainActivity.this);//设置公交线数据
                overlay.addToMap();// 将overlay添加到地图上
                overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内
                mBaiduMap.setOnMarkerClickListener(overlay);
                //传递参数到MyBuslineOverlay,该方法继承自 BusLineOverlay
                buslineOverlay.setData(busLineResult,MainActivity.this);
                // 公交线路名称
                Toast.makeText(MainActivity.this,
                        busLineResult.getBusLineName(), Toast.LENGTH_SHORT);
                Log.d("hello", "名字" + busLineResult.getBusLineName());
                Log.d("hello", "首班车" + busLineResult.getStartTime());
                Log.d("hello", "末班车" + busLineResult.getEndTime());
                Log.d("hello", "分段信息" + busLineResult.getSteps());
              //  java.util.List<BusLineResult.BusStation>    getStations()
              //  获取所有公交站点信息
                for(int i = 0; i< busLineResult.getStations().size();i++){
                    Log.d("hello", "公交信息"+ busLineResult.getStations().get(i).getTitle());
                }
            }
        }
    };

busLineResult就是查询结果,通过这个对象可以获取公交的所有信息。如下:

05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 名字32路(海事学院-万平口)
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 首班车Thu Jan 01 06:30:00 GMT+08:00 1970
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 末班车Thu Jan 01 18:00:00 GMT+08:00 1970
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 分段信息[com.baidu.mapapi.search.busline.BusLineResult$BusStep@30ee528]
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息海事学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息外国语职业学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息职业技术学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息济宁医学院西门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息济宁医学院
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息公交三公司
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息外国语学校
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息大学科技园管委
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息曲师大
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息山体
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息山体南门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息市气象局
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息市交通局
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息都市花园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息四季圣园北区
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息四季圣园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息太阳广场
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息淄博路东口
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息植物园西门
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息植物园
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息城市规划展览馆
05-25 23:47:51.599 16308-16308/com.example.hang.myapplication D/hello: 公交信息万平口

这部分代码也会在地图中显示路线信息:如下

4.可是现在没法点击地图中的站点信息显示啊。。。上面说导入的overlayutil包里面有一个

class BusLineOverlay extends OverlayManager 

我们只需要修改里面的一份方法就可以了。该方法里面还有一个 onBusStationClick()方法,站点点击操作只需要在这里面修改。

/**
     * 覆写此方法以改变默认点击行为
     * 
     * @param index
     *            被点击的站点在
     *            {@link com.baidu.mapapi.search.busline.BusLineResult#getStations()}
     *            中的索引
     * @return 是否处理了该点击事件
     */
    public boolean onBusStationClick(int index) {
        if (mBusLineResult.getStations() != null
                && mBusLineResult.getStations().get(index) != null) {
            // 获取 站点位置坐标
            //newLatLng(LatLng latLng)设置地图新中心点
            MainActivity.mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(mBusLineResult
                    .getStations().get(index).getLocation()));

             Toast.makeText(context, mBusLineResult.getStations()
                               .get(index).getTitle(),Toast.LENGTH_SHORT).show();

        }
        return false;
    }

5.该类还有一个setData()方法,因为我需要context参数用于Toast信息,所以修改了该类的方法,只不过增加了一个参数的传递。

/**
     * 设置公交线数据
     * 
     * @param result
     *            公交线路结果数据
     */
    public void setData(BusLineResult result,Context context) {
        this.mBusLineResult = result;
        this.context =context;

    }

这样,点击地图中的站点就会Toast该站点相关信息,并且把点击的站点设置为地图中心。

 

posted @ 2016-05-26 00:16  夜の魅  阅读(1539)  评论(0编辑  收藏  举报