Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用

转载请注明出处http://blog.csdn.net/u012324136/article/details/50826147

本人主要介绍安卓开发使用百度地图实现导航功能,用户可以输入当前位置和目的地,实现导航。

首先,我们需要当用户输入具体接到地址后将具体街道的地址转化为经度和纬度,然后实现定位,因此,首先来讲解一下地址解析,百度地图API提供Geocode类进行地址解析,我们可以通过Geocoder.getPoint()方法将一段地址描述转化为一个坐标(经度和纬度)具体代码如下

/**
		 * 一下代码通过具体地址获取经度纬度
		 * 起点地址获得经度纬度
		 * 暂时这样写,具体应用时在封装整理
		 */
		Geocoder gc = new Geocoder(RouteGuideDemo.this,Locale.CHINA);
	      List
addressList = null; try { addressList = gc.getFromLocationName(star_add, 1); if (!addressList.isEmpty()) { Address address_temp = addressList.get(0); //计算经纬度 double Latitude=address_temp.getLatitude(); //获得纬度 double Longitude=address_temp.getLongitude(); //获得经度 Star_Latitude=Latitude; Star_Longitude=Longitude; } }catch (IOException e) { e.printStackTrace(); }


当然大家在写代码的时候记得导入相应的包,使用eclipse开发的话,直接Ctrl+Shift+O组合快捷键自动导入当前页面所需要的所有包名,也删除所有不需要的包名,非常方便。还有一点,记得在libs文件下导入百度地图的SDK,去官网下载,这里不详细介绍了

上一步我们可以获得输入地址的经度纬度了,接下来我们直接使用如下代码实现调用

BaiduNaviManager.getInstance().launchNavigator(this,
				40.05087, 116.30142,"百度大厦", //起点纬度、经度、中文地址
		        39.90882, 116.39750,"北京天安门",//终点纬度、经度、中文地址
				NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, 		 //算路方式
				true, 									   		 //真实导航
				BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略
				new OnStartNavigationListener() {				 //跳转监听
					
					@Override
					public void onJumpToNavigator(Bundle configParams) {
						Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class);
						intent.putExtras(configParams);
				        startActivity(intent);
					}
					
					@Override
					public void onJumpToDownloader() {
					}
				});

核心代码就这两步就可以实现导航功能了,接下展示一个Demo,具体来看看完整的实现过程

首先布局文件:



    
    
    

    
        
        
     
        
        

具体实现功能代码

package com.baidu.navi.sdkdemo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.baidu.mapapi.search.MKSearch;
import com.baidu.navisdk.BNaviPoint;
import com.baidu.navisdk.BaiduNaviManager;
import com.baidu.navisdk.BaiduNaviManager.OnStartNavigationListener;
import com.baidu.navisdk.comapi.routeplan.RoutePlanParams.NE_RoutePlan_Mode;


/**
 * GPS导航Demo
 */
public class RouteGuideDemo extends Activity{
//    private BNaviPoint mStartPoint = new BNaviPoint(116.30142, 40.05087,
//            "百度大厦", BNaviPoint.CoordinateType.GCJ02);
    private BNaviPoint mStartPoint = new BNaviPoint(117.150419, 39.111972,
            "电子科技中心", BNaviPoint.CoordinateType.GCJ02);
    private BNaviPoint mEndPoint = new BNaviPoint(116.39750, 39.90882,
            "北京天安门", BNaviPoint.CoordinateType.GCJ02);
    private List mViaPoints = new ArrayList();
    private Button mBtnAddViaPoint;
    
    
    
    //初始化参数,默认起点为小蜜蜂公司,终点为北京天安门
    private double Star_Latitude=39.111972; //起点纬度
    private double Star_Longitude=117.150419;	//起点经度
    
    private double end_Latitude=39.90882; //终点纬度
    private double end_Longitude=116.39750;	//终点经度
    
    private MKSearch mMKSearch;     //定义搜索服务类
    
    private EditText star_cityEditText;
    private EditText star_keyWordEditText;
    private EditText end_cityEditText;
    private EditText end_keyWordEditText;
    
    
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_routeguide);
		Button btnStartNavigation = (Button)findViewById(R.id.button_navigation);

		//实例化输入框
		star_cityEditText=(EditText)findViewById(R.id.edt_star_city);
		star_keyWordEditText=(EditText)findViewById(R.id.edt_star_keyWord);
		end_cityEditText=(EditText)findViewById(R.id.edt_end_city);
		end_keyWordEditText=(EditText)findViewById(R.id.edt_end_keyWord);

		btnStartNavigation.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
			    if (mViaPoints.size() == 0) {
			        launchNavigator();
			    } else {
			        launchNavigatorViaPoints();
			    }
			}
		});
		
		findViewById(R.id.start_nav2_btn).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (mViaPoints.size() == 0) {
                    launchNavigator2();
                } else {
                    launchNavigatorViaPoints();
                }
            }
        });
		
		mBtnAddViaPoint = (Button) findViewById(R.id.add_via_btn); 
		mBtnAddViaPoint.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    addViaPoint();
                }
            });
	}

    private void addViaPoint() {
        EditText viaXEditText = (EditText) findViewById(R.id.et_via_x);
        EditText viaYEditText = (EditText) findViewById(R.id.et_via_y);
        double latitude = 0, longitude = 0;
        try {
            latitude = Integer.parseInt(viaXEditText.getText().toString());
            longitude = Integer.parseInt(viaYEditText.getText().toString());
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        // 默认坐标系为GCJ
        BNaviPoint viaPoint = new BNaviPoint(longitude/1e5, latitude/1e5,
                "途经点" + (mViaPoints.size()+1));
        mViaPoints.add(viaPoint);
        Toast.makeText(this, "已添加途经点:" + viaPoint.getName(),
                Toast.LENGTH_SHORT).show();
        if (mViaPoints.size() >= 3) {
            mBtnAddViaPoint.setEnabled(false);
        }
    }

	/**
	 * 启动GPS导航. 前置条件:导航引擎初始化成功
	 */
	private void launchNavigator(){
		//起点
		String star_add=star_cityEditText.getText().toString().trim();
		star_add=star_add+star_keyWordEditText.getText().toString().trim();
		//终点
		String end_add=end_cityEditText.getText().toString().trim();
		end_add=end_add+end_keyWordEditText.getText().toString().trim();

		/**
		 * 一下代码通过具体地址获取经度纬度
		 * 起点地址获得经度纬度
		 * 暂时这样写,具体应用时在封装整理
		 */
		Geocoder gc = new Geocoder(RouteGuideDemo.this,Locale.CHINA);
	      List
addressList = null; try { addressList = gc.getFromLocationName(star_add, 1); if (!addressList.isEmpty()) { Address address_temp = addressList.get(0); //计算经纬度 double Latitude=address_temp.getLatitude(); //获得纬度 double Longitude=address_temp.getLongitude(); //获得经度 Star_Latitude=Latitude; Star_Longitude=Longitude; } }catch (IOException e) { e.printStackTrace(); } /** * 一下代码通过具体地址获取经度纬度 * 终点地址获得经度纬度 * 暂时这样写,具体应用时在封装整理 * */ Geocoder gc2 = new Geocoder(RouteGuideDemo.this,Locale.CHINA); List
addressList2 = null; try { addressList2 = gc.getFromLocationName(end_add, 1); if (!addressList2.isEmpty()) { Address address_temp2 = addressList2.get(0); //计算经纬度 double Latitude=address_temp2.getLatitude(); //获得纬度 double Longitude=address_temp2.getLongitude(); //获得经度 end_Latitude=Latitude; end_Longitude=Longitude; } }catch (IOException e) { e.printStackTrace(); } BaiduNaviManager.getInstance().launchNavigator(this, // 40.05087, 116.30142,"百度大厦", // 39.111972,117.150419, "天津电子科技中心", Star_Latitude,Star_Longitude,star_add, //起点纬度、经度、中文地址 end_Latitude,end_Longitude,end_add, //终点纬度、经度、中文地址 // 39.90882, 116.39750,"北京天安门", NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式 true, //真实导航 BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略 new OnStartNavigationListener() { //跳转监听 @Override public void onJumpToNavigator(Bundle configParams) { Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class); intent.putExtras(configParams); startActivity(intent); } @Override public void onJumpToDownloader() { } }); } /** * 指定导航起终点启动GPS导航.起终点可为多种类型坐标系的地理坐标。 * 前置条件:导航引擎初始化成功 */ private void launchNavigator2(){ //这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标 BNaviPoint startPoint = new BNaviPoint(116.307854,40.055878, "百度大厦", BNaviPoint.CoordinateType.BD09_MC); BNaviPoint endPoint = new BNaviPoint(116.403875,39.915168, "北京天安门", BNaviPoint.CoordinateType.BD09_MC); BaiduNaviManager.getInstance().launchNavigator(this, startPoint, //起点(可指定坐标系) endPoint, //终点(可指定坐标系) NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式 true, //真实导航 BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略 new OnStartNavigationListener() { //跳转监听 @Override public void onJumpToNavigator(Bundle configParams) { Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class); intent.putExtras(configParams); startActivity(intent); } @Override public void onJumpToDownloader() { } }); } /** * 增加一个或多个途经点,启动GPS导航. * 前置条件:导航引擎初始化成功 */ private void launchNavigatorViaPoints(){ //这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标 // BNaviPoint startPoint = new BNaviPoint(113.97348, 22.53951, "白石洲"); // BNaviPoint endPoint = new BNaviPoint(113.92576, 22.48876, "蛇口"); // BNaviPoint viaPoint1 = new BNaviPoint(113.94104, 22.54343, "国人通信大厦"); // BNaviPoint viaPoint2 = new BNaviPoint(113.94863, 22.53873, "中国银行科技园支行"); List points = new ArrayList(); points.add(mStartPoint); points.addAll(mViaPoints); points.add(mEndPoint); BaiduNaviManager.getInstance().launchNavigator(this, points, //路线点列表 NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式 true, //真实导航 BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略 new OnStartNavigationListener() { //跳转监听 @Override public void onJumpToNavigator(Bundle configParams) { Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class); intent.putExtras(configParams); startActivity(intent); } @Override public void onJumpToDownloader() { } }); } }


接下来看看效果图了

首页:GPS导航和路线规划

Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第1张图片   Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第2张图片

                                    首页                                                                                                             导航页面



Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第3张图片Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第4张图片Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第5张图片


模拟器上运行效果如上,还自带语音播报导航功能。真实手机上效果会好很多,和百度地图客户端没什么区别



好了,实现之后再看看百度地图的定位原理吧

定位原理

使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第6张图片



定位精度

Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用_第7张图片



在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:点击下载相关库文件,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下


参考文档:http://blog.csdn.net/xiaanming/article/details/11380619

最后附上源码下载链接:http://download.csdn.net/detail/u012324136/9455501


你可能感兴趣的:(移动安卓开发)