百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能

之前我们讲了怎么在百度地图上设置Marker(如A点。。) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de)漂(chou)亮,我们自定义了放大缩小的控件,本篇我们将制作类似百度地图API制作类似百度地图的公交/驾车/行走/查询界面并实现简单的路线规划功能。

先来张截图:

 

这个界面的实现其实是使用的SlidingUpPanelLayout 开源库从而使得可以跟随手指下拉上划:

其实布局也没什么好讲的,自己到百度地图的APK包里扒拉扒拉图片就都有了,哈哈

<?xml version="1.0" encoding="utf-8"?>
<com.jsbtclient.cusViews.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:sothree="http://schemas.android.com/apk/res-auto"
    android:id="@+id/map_sliding_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    sothree:umanoPanelHeight="60dp"
    sothree:umanoShadowHeight="4dp" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.baidu.mapapi.map.MapView
            android:id="@+id/map_mapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:apiKey="vNQtC8sQSODsLGBk01HYaBQt"
            android:clickable="true" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true" >

            <com.jsbtclient.cusViews.ZoomControlView
                android:id="@+id/map_zoomcontrol"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:layout_marginBottom="20dp"
                android:layout_marginRight="15dp" >
            </com.jsbtclient.cusViews.ZoomControlView>

            <ImageView
                android:id="@+id/map_relocation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|top"
                android:layout_marginLeft="15dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/map_relocation_bg"
                android:src="@drawable/baidu_map_relocation" />
        </FrameLayout>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/map_slidePanel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp" >

        <LinearLayout
            android:id="@+id/slidingdrawer_menu"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10dp" >

            <ImageView
                android:id="@+id/map_route_bus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:src="@drawable/map_route_bus_selector" />

            <ImageView
                android:id="@+id/map_route_car"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:src="@drawable/map_route_car_selector" />

            <ImageView
                android:id="@+id/map_route_walk"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:src="@drawable/map_route_walk_selector" />

            <TextView
                android:id="@+id/map_route_search"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:text="@string/map_route_search"
                android:textColor="@color/call_fragment_bg_color"
                android:textSize="16sp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="0.1dp"
            android:background="@color/lightgray" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/white_shadow_bg"
            android:orientation="horizontal"
            android:padding="10dp" >

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_gravity="center_vertical"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:src="@drawable/map_route_start" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:src="@drawable/map_route_end" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="8"
                android:orientation="vertical"
                android:padding="10dp" >

                <EditText
                    android:id="@+id/map_my_address"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@null"
                    android:text="@string/map_my_address"
                    android:textColor="@color/lightgrey"
                    android:textSize="16sp" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="0.1dp"
                    android:layout_marginBottom="20dp"
                    android:layout_marginTop="20dp"
                    android:background="@color/lightgray" />

                <EditText
                    android:id="@+id/map_target_address"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@null"
                    android:text="@string/map_company_address"
                    android:textColor="@color/call_fragment_bg_color"
                    android:textSize="16sp" />
            </LinearLayout>

            <ImageView
                android:id="@+id/map_route_exchange"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:src="@drawable/route_exchange" />
        </LinearLayout>
    </LinearLayout>

</com.jsbtclient.cusViews.SlidingUpPanelLayout>

UI上的事就不重点说了,功能实现才是重点:

我们来理一下思路用户当前的位置是使用百度地图定位获取的,而目标位置则应该是用户自己输入的,我这里的实现比较简单,目的地或者出发地点是固定的就是公司地址,

但是原理是相同的只不过少一次网络请求而已。 现在假设用户目的地是指定地点(已知经纬度),那么我们需要查询的就是用户当前的位置,所以首先要定位用户当前位置。

	/**
	 * 开启定位,回调接口为MyLocationListener类 /接口
	 */
	private void StartLocation()
	{
		LocationClientOption option = new LocationClientOption();

		option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式

		option.setCoorType("gcj02");//返回的定位结果是百度经纬度

		option.setScanSpan(1000);//设置发起定位请求的间隔时间为1000ms

		option.setIsNeedAddress(true); //是否需要返回地址

		mLocationClient.setLocOption(option);

		mLocationClient.start();//发起定位请求
	}

接着看回调接口:

	/**
	 * 定位回调监听
	 *
	 */
	public class MyLocationListener implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location)
		{
			//回调返回对象对象里包含多个属性,这里我们只需要经纬度
			userLatLng = new LatLng(location.getLatitude(), location.getLongitude());

			//这句代码可以忽略,我不知道定位可以拿到具体的地址,所以使用了  详细地址与经纬度转化的接口
			//其实location.getAddrStr();就可以拿到地址

			if(userLatLng != null){
				mGeoCoder.reverseGeoCode(new ReverseGeoCodeOption()
				.location(userLatLng));
			}
			mLocationClient.stop();

		}
	}

接着看将经纬度转化为具体详细地址的回调接口:

@Override
	public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
			Host.showToast(R.string.map_result_error);
			return;
		}
		baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
				.icon(BitmapDescriptorFactory
						.fromResource(R.drawable.baidu_map_marka)));
		baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
				.getLocation()));

		mPosition = result.getAddress().toString();//以上代码忽略,这里的mPosition就是具体的地址

		PlanNode stNode = null, enNode = null;  //声明两个节点,stNote 起始节点, enNode目的地节点

		if(!IsExchanged)  //这里的if else 可忽略,是为了实现目标地址与当前地址互换效果而做的
		{
			myAddress.setText(mPosition);
			stNode = PlanNode.withLocation(userLatLng);//将经纬度对象传入
			enNode = PlanNode.withLocation(latLng);

		}else
		{
			targetAddress.setText(mPosition);
			enNode = PlanNode.withLocation(userLatLng);
			stNode = PlanNode.withLocation(latLng);
		}

		StartRouteSearch(stNode, enNode);  //开始搜索
	}
	/**
	 * 发起路线规划请求,获取路线
	 * 回调接口为onGetTransitRouteResult/onGetWalkingRouteResult/onGetDrivingRouteResult
	 * @param stNode
	 * @param enNode
	 */
	private void StartRouteSearch(PlanNode stNode, PlanNode enNode) {
		route = null;
		baiduMap.clear();  //每次重新搜索都清空地图上的所有标记以及路线

		if (searchType == SearchType.BUS) {
			mSearch.drivingSearch((new DrivingRoutePlanOption()).from(stNode).to(enNode)); //搜索驾车路线
		} else if (searchType == SearchType.CAR) {
			mSearch.transitSearch((new TransitRoutePlanOption()).from(stNode).city("无锡").to(enNode));//搜索公交路线
		} else if (searchType == SearchType.WALK) {
			mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode).to(enNode));//搜索行走路线
		}
	}

这里的三钟搜索方式对应三个不同的回调接口,分别是:

@Override
	public void onGetDrivingRouteResult(DrivingRouteResult dRouteResult) {
		if (dRouteResult == null || dRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
			Host.showToast(R.string.map_result_error);
		}
		if (dRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
			// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
			// result.getSuggestAddrInfo()
			return;
		}
		if (dRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
			// nodeIndex = -1;
			route = dRouteResult.getRouteLines().get(0); //获取路线
			DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);
			routeOverlay = overlay;
			baiduMap.setOnMarkerClickListener(overlay);
			overlay.setData(dRouteResult.getRouteLines().get(0));//overLay 为在地图上的路径 ,这里为它设置数据
			overlay.addToMap();  //添加到地图
			overlay.zoomToSpan();
		}

	}

	@Override
	public void onGetWalkingRouteResult(WalkingRouteResult result) {
		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
			Host.showToast(R.string.map_result_error);
		}
		if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
			// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
			// result.getSuggestAddrInfo()
			return;
		}
		if (result.error == SearchResult.ERRORNO.NO_ERROR) {  //同上
			route = result.getRouteLines().get(0);
			WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
			baiduMap.setOnMarkerClickListener(overlay);
			routeOverlay = overlay;
			overlay.setData(result.getRouteLines().get(0));
			overlay.addToMap();
			overlay.zoomToSpan();
		}

	}

	@Override
	public void onGetTransitRouteResult(TransitRouteResult result) {

		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
			Host.showToast(R.string.map_result_error);
		}
		if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
			// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
			// result.getSuggestAddrInfo()
			return;
		}
		if (result.error == SearchResult.ERRORNO.NO_ERROR) { //同上
			route = result.getRouteLines().get(0);
			TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
			baiduMap.setOnMarkerClickListener(overlay);
			routeOverlay = overlay;
			overlay.setData(result.getRouteLines().get(0));
			overlay.addToMap();
			overlay.zoomToSpan();
		}
	}

这样一个基本的百度地图路径搜索就完成了.

时间: 2024-11-08 22:02:00

百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能的相关文章

百度地图API —— 制作多途经点的线路导航

[百度地图API]如何制作多途经点的线路导航--驾车篇 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ------------------------------------------------------------------------------------------------------------------------ 一.创建地图 首先要告诉大家的是,API1.2版本取消密钥,取消服务设置,

借助百度地图API制作企业百度地图

做网站需要插入地图,可以借助百度地图API,具体步骤如下: 1.打开百度地图API的网址:   http://api.map.baidu.com/lbsapi/creatmap/ 2.设置中心点 3.添加标注 4.点击下面的获取代码,复制出代码即可 5.复制的代码图标地址有问题,可以用这个地址的图标 http://map.baidu.com/image/us_mk_icon.png 6.自己测试源代码可供参考 <!DOCTYPE html> <html lang="en&quo

使用百度地图API制作线路轨迹播放

1.使用百度地图API制作轨迹播放: 可应用于车辆跟踪.行驶线路回放.跑步行程的记录等地图应用场景, 1.1绘制静态轨迹图 获取多个轨迹点point(必须包含经度.纬度) 使用polyline对象依次连接相邻的2个点(注意polyline的个数比point的少1) 1.2绘制动态轨迹图(固定间隔时间) 每隔500毫秒读取一个轨迹点,实现a,b两个功能 a增加一条polyline b将marker从先前的point移到当前点 主方法使用setTimeout方法迭代来实现动态循环 Polyline在

【百度地图API】如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据

原文:[百度地图API]如何利用地图API制作汽车沿道路行驶的动画?--如何获得道路层数据 有几个做汽车导航的朋友问我说,他们想在地图上制作一辆车沿着道路行驶的动画.可是,百度地图的道路数据并没有公开.所以,应该怎么办呢? 一. 我们先来学习如何把百度地图“弄”出来.把下面这段代码保存为htm格式,用浏览器打开,就能看到百度地图了. <html><head><meta http-equiv="Content-Type" content="text

自备百度地图API密钥 解决Cooply“地图API未授权”问题

自备百度地图API密钥 解决Cooply"地图API未授权"问题 ? ? ? ? ? 有时候,当我们时,会看到提示百度未授权使用地图API,这是因为coolpy的开发者是使用的自己的百度开放平台密钥做的测试,而我们把coolpy下载来后直接使用了人家的百度地图api访问权限,这就是导致问题的原因. 所以,我们在下载来coolpy准备使用的时候,应该先提前将API key换成自己的.这样你使用的时候才不会时不时出问题 ? ? 首先登陆百度账号,注册成为开发者 http://develop

百度地图API:使用百度定位

准备工作: 1.申请百度地图API 2.下载百度地图的SDK 3.将SDK包中的BaiduLBS_Android.jar文件放到,项目里的app/libs里面 4.在src/main目录下创建一个名为jniLibs的目录,然后将SDK包中的其他所有目录放在里面. 5.同步一下项目. 首先修改布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------------------------------------------------------------------------------------------------------- 哇,好久没有上来了.主要是因为最近工作繁忙,加上休息时间被各种排练.社团活动占满,导致木有更新此博客.

【百度地图API】多家地图API文件大小对比

原文:[百度地图API]多家地图API文件大小对比 于2011.6.9日更新百度地图API文件大小.同时更新图片. 任务描述: 明天就是元宵佳节啦~这是一个团团圆圆的节日,于是,再次想把各家API聚在一起“开大会”.哈哈.这次主要是统计一下API的JS大小. 如何实现: 本文调研了目前主流JS地图API初始加载的JS文件大小.也就是在API完全可用(这里的可用是指可以进行编程开发,但是不保证地图展现全部完成)时所必需的那些JS文件大小.它们会阻塞浏览器渲染页面其他元素,由于API通常都会展示在第

【百度地图API】多家地图API内存消耗对比测验(带源码)

原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫做“双林寺”.双林寺的精致.纯木质结构.保存完好等特点,让我不由得为之一振.这让我想到了,万事万物都需要对比,“取其精华,去其糟粕”. 双林寺如是,API也如是.这不,上班第一天,我就迫不及待地做起了API性能测试. 如何实现: 使用不同家的API,分别以随机新增覆盖物为测试用例,观察内存消耗变化.