Android百度地图例子

由于项目里用到了百度地图,路线规划的标题(比如“M235/362”)在百度地图API里面没有给出来,网上各种搜索都找不到别人发出来的方案,然后就只能自己组织标题了,相信很多人也遇到和我一样的问题,所以这里我把我的方案拿出来分享一下。先看一下效果图。

1,效果预览

 
地图的UI参考了美团的。

2,代码分析

地图API已经给出的方法我就不多做分析了,网上也有很多例子分析百度地图API的,我主要分析一下网上比较难找到的一些方案。
如上图,每个路线的数据存放在RouteLine的子类里面,而RouteLine的title值都是空值,所以每条路线的名字在RouteLine里面是找不到的。公交、驾车、步行路线的数据是存放在RouteLine子类里面,比如公交的数据存放在TransitRouteLine里,TransitRouteLine给出了每条路线的详细行驶步骤。
 
上图打印了公交和驾车的每个步骤,有没有发现一些规律,我们可以从这些规律中组织标题,当然百度地图API开发人员如果改了那些步骤的语言组织方法的话,我们也得重新组织标题了。
公交的规律:每量公交前面都有“乘坐”两个字,所以可以判断字符串里有乘坐两字的就有公交换乘,公交名字后面都有一个逗号,然后是不是可以从乘坐后面截取字符串到逗号为止呢。如果有多辆车可以换乘的话API是这样返回公交的“m324(或m435,362)”,公交名字之间也有逗号,所以以逗号结束不可以,但可以以",经过"公交名字为结束符。
    private List<TransitRouteLine> addBusLinesTitle(List<TransitRouteLine> busLines){
        for(int i=0 ; i<busLines.size() ; i++){
            TransitRouteLine busLine = busLines.get(i);
            List<TransitRouteLine.TransitStep> steps = busLine.getAllStep();
            String title = "";
            for(int j=0 ; j<steps.size() ; j++){
                TransitRouteLine.TransitStep step = steps.get(j);
                String instructions = step.getInstructions();
                if(instructions != null && instructions.contains("乘坐")){
                    if(title.length() > 0){
                        title += ("→"+instructions.substring(2,instructions.indexOf(",经过")));
                        //下面被屏蔽的一行也可以使用
//                        title += ( "→"+instructions.split(",经过")[0].substring(2) );
                    }else {
//                        title = instructions.split(",经过")[0].substring(2);
                        title = instructions.substring(2,instructions.indexOf(",经过"));
                    }
                }
            }
            busLine.setTitle(title);
        }
        return busLines;
    }
上面的代码就是获取公交路线名字的方法,每个步骤的字符串用getInstructions()方法来获取。如果有很多个字符串有“乘坐”两字,代表要换乘多辆公交,然后把公交用连接符"→"连起来。
instructions.substring(2,instructions.indexOf(",经过"))这个方法时从2的下标截取到第一个",经过"的下标。
instructions.split(",经过")[0].substring(2)这个方法将字符串用",经过"分割成字符串数组,然后取第一个字符串,再从2的个下标截取到末尾。
标题组织好了后再放回RouteLine的title参数里面。
 
驾车和步行路线我只取了第一条显示出来,下面给出的是驾车、步行、自行车的标题组织方法。
    /**
     * 组织路线的名字,(格式:途径xxx和xxx),xxx取最近的两条路
     * @param steps
     * @param <T>
     * @return
     */
    private<T extends RouteStep> String getRouteTitle(List<T> steps){
        if(steps == null || steps.size()==0)
            return "";
        String title = "";
        Method method = null;
        try {
            method = steps.get(0).getClass().getDeclaredMethod("getInstructions");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        for(T step:steps){
            try {
                String ss = (String) method.invoke(step);
                if(ss.contains("进入")){
                    if(title.contains("途径")){
                        title += (" 和 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                        break;
                    }else {
                        title += ("途径 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                    }
                }
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
        return title;
    }
上面的用法是反射加泛型的方法。因为每个步骤的名字只能在RouteStep的子类才能获取,而且都是从每个子类的getInstructions()方法来获取步骤名字,所以不用反射的话只能驾车步行骑行都单独去写一个。路线名字只取了最近经过的两条路显示。
下面是一些需要用到的参数:
routeLine.getDistance() :起点终点的距离,单位(米)
routeLine.getDuration()  :起点到终点的时间,单位(秒)
 

3,部分源码

百度地图基类:
/**
 * 定位、显示多个商家地址
 * Created by HuangYuGuang on 2016/7/11.
 */
public abstract class MapBaseFragment extends ABaseFragment {
    //地图相关
    private MapView mMapView = null;
    protected BaiduMap mBaiduMap;

    //定位相关
    private BitmapDescriptor mIconMaker;
    private LocationService locService;
    protected BDLocation myLocation = MapApplication.bdLocation;

    @Override
    protected int inflateContentView() {
        return R.layout.comm_lay_base_map;
    }

    @Override
    protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
        super.layoutInit(inflater, savedInstanceSate);
        mMapView = (MapView) findViewById(R.id.bmapView);
        //隐藏缩放按键
        mMapView.showZoomControls(false);
        mBaiduMap = mMapView.getMap();
        mIconMaker = BitmapDescriptorFactory.fromResource(R.drawable.btu_gps_map);
        //地图显示的比例范围
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15.0f));
        mBaiduMap.setOnMapLoadedCallback(new BaiduM
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值