zoukankan      html  css  js  c++  java
  • 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该站点相关信息,并且把点击的站点设置为地图中心。

  • 相关阅读:
    angular读书笔记(三)
    angular读书笔记(二)
    angularjs读书笔记(一)
    angular和web前端的一些细节
    angular的service
    angular学习之directive
    最近学的twig
    最近学的grunt
    今天学的angularJS
    android即时通讯开发笔记(一)绪论~实现用户登录,自动登录,注销功能
  • 原文地址:https://www.cnblogs.com/yuhanghzsd/p/5529259.html
Copyright © 2011-2022 走看看