百度地图API实现定位与目的地导航

百度地图API实现定位与目的地导航

 

 

前几天百度举办了百度世界大会,可惜没去参加,之前参加了百度的开发者大会,在会上也了解了百度的产品,百度现在朝着平台化的方向在发展,感觉很不错,也试用了百度的产品,现在就用着百度的网盘,今天看了下百度地图的开放API,然后做了个Demo,这里分享出来。如果应用主要针对国内市场的话,用百度地图还是一个比较不错的选择。另外,百度还有一个PCS(Personal cloud storage)个人云存储,我比较感兴趣,之后也会继续研究,然后做个Demo分享给大家。今天就先看看这个利用百度地图定位并实现目的地导航的Demo。首先看实现效果:

                                              

进入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、步行线路,在代码中都有详细注释。另外,在控制台还输出了线路上每一个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。如下图:

                      

 

接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料百度地图API,然后就是为需要加入地图的应用注册APP
KEY,注册完后,下载百度地图jar文件,新建工程,并导入即可,下面看实现具体代码,在代码中有详细注释:

[cpp] view
plain
copy

  1. public class NavigationDemoActivity extends MapActivity {  
  2.     private String mMapKey = "注册自己的key";  
  3.     private EditText destinationEditText = null;  
  4.     private Button startNaviButton = null;  
  5.     private MapView mapView = null;  
  6.     private BMapManager mMapManager = null;  
  7.     private MyLocationOverlay myLocationOverlay = null;  
  8.     //onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的  
  9.     private LocationListener locationListener;  
  10.     private MKSearch searchModel;  
  11.     GeoPoint pt;  
  12.       
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  17.         setContentView(R.layout.main);  
  18.         destinationEditText = (EditText) this.findViewById(R.id.et_destination);  
  19.         startNaviButton = (Button) this.findViewById(R.id.btn_navi);  
  20.           
  21.         mMapManager = new BMapManager(getApplication());  
  22.         mMapManager.init(mMapKey, new MyGeneralListener());  
  23.         super.initMapActivity(mMapManager);  
  24.           
  25.         mapView = (MapView) this.findViewById(R.id.bmapsView);  
  26.         //设置启用内置的缩放控件  
  27.         mapView.setBuiltInZoomControls(true);    
  28.         //设置在缩放动画过程中也显示overlay,默认为不绘制  
  29. //        mapView.setDrawOverlayWhenZooming(true);  
  30.         //获取当前位置层  
  31.         myLocationOverlay = new MyLocationOverlay(this, mapView);  
  32.         //将当前位置的层添加到地图底层中  
  33.         mapView.getOverlays().add(myLocationOverlay);  
  34.           
  35.         // 注册定位事件  
  36.         locationListener = new LocationListener(){  
  37.   
  38.             @Override  
  39.             public void onLocationChanged(Location location) {  
  40.                 if (location != null){  
  41.                     //生成GEO类型坐标并在地图上定位到该坐标标示的地点  
  42.                      pt = new GeoPoint((int)(location.getLatitude()*1e6),  
  43.                             (int)(location.getLongitude()*1e6));  
  44. //                  System.out.println("---"+location.getLatitude() +":"+location.getLongitude());  
  45.                     mapView.getController().animateTo(pt);  
  46.                 }  
  47.             }  
  48.         };  
  49.           
  50.         //初始化搜索模块  
  51.         searchModel = new MKSearch();  
  52.         //设置路线策略为最短距离  
  53.         searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);  
  54.         searchModel.init(mMapManager, new MKSearchListener() {  
  55.             //获取驾车路线回调方法  
  56.             @Override  
  57.             public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {  
  58.                 // 错误号可参考MKEvent中的定义  
  59.                 if (error != 0 || res == null) {  
  60.                     Toast.makeText(NavigationDemoActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();  
  61.                     return;  
  62.                 }  
  63.                 RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView);  
  64.                   
  65.                 // 此处仅展示一个方案作为示例  
  66.                 MKRoute route = res.getPlan(0).getRoute(0);  
  67.                 int distanceM = route.getDistance();  
  68.                 String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000);  
  69.                 System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps());  
  70.                 for (int i = 0; i < route.getNumSteps(); i++) {  
  71.                     MKStep step = route.getStep(i);  
  72.                     System.out.println("节点信息:"+step.getContent());  
  73.                 }  
  74.                 routeOverlay.setData(route);  
  75.                 mapView.getOverlays().clear();  
  76.                 mapView.getOverlays().add(routeOverlay);  
  77.                 mapView.invalidate();  
  78.                 mapView.getController().animateTo(res.getStart().pt);  
  79.             }  
  80.               
  81.             //以下两种方式和上面的驾车方案实现方法一样  
  82.             @Override  
  83.             public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) {  
  84.                 //获取步行路线  
  85.             }  
  86.               
  87.             @Override  
  88.             public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {  
  89.                 //获取公交线路  
  90.             }  
  91.               
  92.             @Override  
  93.             public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
  94.             }  
  95.             @Override  
  96.             public void onGetAddrResult(MKAddrInfo arg0, int arg1) {  
  97.             }  
  98.             @Override  
  99.             public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
  100.             }  
  101.             @Override  
  102.             public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {  
  103.             }  
  104.         });  
  105.           
  106.         startNaviButton.setOnClickListener(new OnClickListener() {  
  107.               
  108.             @Override  
  109.             public void onClick(View v) {  
  110.                 String destination = destinationEditText.getText().toString();  
  111.                   
  112.                 //设置起始地(当前位置)  
  113.                 MKPlanNode startNode = new MKPlanNode();  
  114.                 startNode.pt = pt;  
  115.                 //设置目的地  
  116.                 MKPlanNode endNode = new MKPlanNode();   
  117.                 endNode.name = destination;  
  118.                   
  119.                 //展开搜索的城市  
  120.                 String city = getResources().getString(R.string.beijing);  
  121. //              System.out.println("----"+city+"---"+destination+"---"+pt);  
  122.                 searchModel.drivingSearch(city, startNode, city, endNode);  
  123.                 //步行路线  
  124. //              searchModel.walkingSearch(city, startNode, city, endNode);  
  125.                 //公交路线  
  126. //              searchModel.transitSearch(city, startNode, endNode);  
  127.             }  
  128.         });  
  129.           
  130.     }  
  131.       
  132.     @Override  
  133.     protected void onResume() {  
  134.         mMapManager.getLocationManager().requestLocationUpdates(locationListener);  
  135.         myLocationOverlay.enableMyLocation();  
  136.         myLocationOverlay.enableCompass(); // 打开指南针  
  137.         mMapManager.start();  
  138.         super.onResume();  
  139.     }  
  140.       
  141.     @Override  
  142.     protected void onPause() {  
  143.         mMapManager.getLocationManager().removeUpdates(locationListener);  
  144.         myLocationOverlay.disableMyLocation();//显示当前位置  
  145.         myLocationOverlay.disableCompass(); // 关闭指南针  
  146.         mMapManager.stop();  
  147.         super.onPause();  
  148.     }  
  149.   
  150.     @Override  
  151.     protected boolean isRouteDisplayed() {  
  152.         // TODO Auto-generated method stub  
  153.         return false;  
  154.     }  
  155.       
  156.     // 常用事件监听,用来处理通常的网络错误,授权验证错误等  
  157.     class MyGeneralListener implements MKGeneralListener {  
  158.             @Override  
  159.             public void onGetNetworkState(int iError) {  
  160.                 Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError);  
  161.                 Toast.makeText(NavigationDemoActivity.this, "您的网络出错啦!",  
  162.                         Toast.LENGTH_LONG).show();  
  163.             }  
  164.   
  165.             @Override  
  166.             public void onGetPermissionState(int iError) {  
  167.                 Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError);  
  168.                 if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {  
  169.                     // 授权Key错误:  
  170.                     Toast.makeText(NavigationDemoActivity.this,   
  171.                             "请在BMapApiDemoApp.java文件输入正确的授权Key!",  
  172.                             Toast.LENGTH_LONG).show();  
  173.                 }  
  174.             }  
  175.         }  
  176. }  

 

然后是布局文件:

 

[html] view
plain
copy

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:orientation="horizontal" >  
  11.   
  12.         <TextView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:textSize="18sp"  
  16.             android:text="Destination:" />  
  17.   
  18.         <EditText  
  19.             android:id="@+id/et_destination"  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="wrap_content" />  
  22.     </LinearLayout>  
  23.       
  24.     <Button   
  25.         android:id="@+id/btn_navi"  
  26.         android:layout_width="fill_parent"  
  27.            android:layout_height="wrap_content"  
  28.            android:text="Start navigate"/>  
  29.   
  30.     <com.baidu.mapapi.MapView  
  31.         android:id="@+id/bmapsView"  
  32.         android:layout_width="fill_parent"  
  33.         android:layout_height="fill_parent"  
  34.         android:clickable="true" />  
  35.   
  36. </LinearLayout>  


AndroidMainifest.xml

 

 

[html] view
plain
copy

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.ericssonlabs"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
  10.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>  
  11.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  12.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  
  13.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    
  14.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>   
  15.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
  16.       
  17.     <supports-screens android:largeScreens="true"  
  18.         android:normalScreens="true" android:smallScreens="true"  
  19.         android:resizeable="true" android:anyDensity="true"/>  
  20.     <uses-sdk android:minSdkVersion="3"></uses-sdk>  
  21.   
  22.     <application  
  23.         android:icon="@drawable/ic_launcher"  
  24.         android:label="@string/app_name" >  
  25.         <activity  
  26.             android:name=".NavigationDemoActivity"  
  27.             android:label="@string/app_name" >  
  28.             <intent-filter>  
  29.                 <action android:name="android.intent.action.MAIN" />  
  30.   
  31.                 <category android:name="android.intent.category.LAUNCHER" />  
  32.             </intent-filter>  
  33.         </activity>  
  34.     </application>  
  35.   
  36. </manifest>  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值