Android百度地圖附加搜索和公交路線方案搜索

合肥程序員羣:49313181。    合肥實名程序員羣:128131462 (不肯透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

綜述:android

今天公司讓我作一個APP下百度地圖,顯示當前用戶位置和附近加油站,同時能夠搜索公交車方案。剛開始據說這樣的需求我有點糾結,由於這個加油站的數據去哪弄,公交搜索我知道確定容易。因此開始找資料……。後來發現百度地圖的搜附近能夠解決這個問題。因此廢話很少說開始Code,工做時間快速記錄。不浪費時間git

一.準備:程序員

首先下載百度地圖 Android SDK,和定位SDK。百度新的API中將定位部分獨立出來了。本別下載下來配置到本身的項目中。api

 

配置好lib就開始,新建兩個類,一個是位置監聽和顯示,用於監聽位置變化。還有一個就是查詢監聽,用於處理查詢返回的結果。MyLocationListener類用於監聽位置變化,實現BDLocationListener網絡

 

  1 import android.util.Log;
  2 
  3 import com.baidu.location.BDLocation;
  4 import com.baidu.location.BDLocationListener;
  5 import com.baidu.mapapi.map.LocationData;
  6 import com.baidu.mapapi.map.MapView;
  7 import com.baidu.mapapi.map.MyLocationOverlay;
  8 import com.baidu.platform.comapi.basestruct.GeoPoint;
  9 
 10 /**
 11  * 位置監聽處理
 12  * @author egojit
 13  *
 14  */
 15 public class MyLocationListener implements BDLocationListener {
 16 
 17     private static String LOG_TAG = "MyLocationListener";
 18     private MapView mMapView;
 19     private Context MyContext;
 20 
 21     public MyLocationListener(MapView view, Context context) {
 22         this.mMapView = view;
 23         this.MyContext = context;
 24     }
 25 
 26     @Override
 27     public void onReceiveLocation(BDLocation location) {
 28         if (location == null)
 29             return;
 30 
 31         MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
 32                 this.mMapView);
 33 
 34         LocationData locData = new LocationData();
 35         // 手動將位置源置爲天安門,在實際應用中,請使用百度定位SDK獲取位置信息,要在SDK中顯示一個位置,須要使用百度經緯度座標(bd09ll)
 36         locData.latitude = location.getLatitude();
 37         locData.longitude = location.getLongitude();
 38         locData.direction = 2.0f;
 39         myLocationOverlay.setData(locData);
 40         if (mMapView != null && mMapView.getOverlays() != null) {
 41             mMapView.getOverlays().add(myLocationOverlay);
 42             mMapView.refresh();
 43             mMapView.getController().animateTo(
 44                     new GeoPoint((int) (locData.latitude * 1e6),
 45                             (int) (locData.longitude * 1e6)));
 46             mMapView.getController().setZoom(16);
 47             MainActivity activity = (MainActivity) MyContext;
 48 
 49             activity.jd = locData.longitude;
 50             activity.wd = locData.latitude;
 51         }
 52 
 53         StringBuffer sb = new StringBuffer(256);
 54         sb.append("time : ");
 55         sb.append(location.getTime());
 56         sb.append("\nerror code : ");
 57         sb.append(location.getLocType());
 58         sb.append("\nlatitude : ");
 59         sb.append(location.getLatitude());
 60         sb.append("\nlontitude : ");
 61         sb.append(location.getLongitude());
 62         sb.append("\nradius : ");
 63         sb.append(location.getRadius());
 64         if (location.getLocType() == BDLocation.TypeGpsLocation) {
 65             sb.append("\nspeed : ");
 66             sb.append(location.getSpeed());
 67             sb.append("\nsatellite : ");
 68             logMsg("GPS定位");
 69             sb.append(location.getSatelliteNumber());
 70         } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
 71             sb.append("\naddr : ");
 72             logMsg("winfi定位");
 73             sb.append(location.getAddrStr());
 74         }
 75 
 76         logMsg(sb.toString());
 77     }
 78 
 79     public void onReceivePoi(BDLocation poiLocation) {
 80         if (poiLocation == null) {
 81             return;
 82         }
 83         StringBuffer sb = new StringBuffer(256);
 84         sb.append("Poi time : ");
 85         sb.append(poiLocation.getTime());
 86         sb.append("\nerror code : ");
 87         sb.append(poiLocation.getLocType());
 88         sb.append("\nlatitude : ");
 89         sb.append(poiLocation.getLatitude());
 90         sb.append("\nlontitude : ");
 91         sb.append(poiLocation.getLongitude());
 92         sb.append("\nradius : ");
 93         sb.append(poiLocation.getRadius());
 94         if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
 95             sb.append("\naddr : ");
 96             sb.append(poiLocation.getAddrStr());
 97         }
 98         if (poiLocation.hasPoi()) {
 99             sb.append("\nPoi:");
100             sb.append(poiLocation.getPoi());
101         } else {
102             sb.append("noPoi information");
103         }
104         logMsg(sb.toString());
105     }
106 
107     /**
108      * 打日誌
109      * 
110      * @param s
111      */
112     private static void logMsg(String s) {
113         Log.i(LOG_TAG, s);
114     }
115 }

 

MySearchListener查詢監聽類實現了MKSearchListener接口app

  1 package com.egojit.dcdemo;
  2 
  3 import android.app.Activity;
  4 import android.app.AlertDialog;
  5 import android.app.Dialog;
  6 import android.content.Context;
  7 import android.widget.Toast;
  8 
  9 import com.baidu.mapapi.map.MKEvent;
 10 import com.baidu.mapapi.map.MapView;
 11 import com.baidu.mapapi.map.PoiOverlay;
 12 import com.baidu.mapapi.search.MKAddrInfo;
 13 import com.baidu.mapapi.search.MKBusLineResult;
 14 import com.baidu.mapapi.search.MKDrivingRouteResult;
 15 import com.baidu.mapapi.search.MKPoiInfo;
 16 import com.baidu.mapapi.search.MKPoiResult;
 17 import com.baidu.mapapi.search.MKSearchListener;
 18 import com.baidu.mapapi.search.MKShareUrlResult;
 19 import com.baidu.mapapi.search.MKSuggestionResult;
 20 import com.baidu.mapapi.search.MKTransitRouteResult;
 21 import com.baidu.mapapi.search.MKWalkingRouteResult;
 22 
 23 /**
 24  * 查詢監聽
 25  * @author egojit
 26  *
 27  */
 28 public class MySearchListener implements MKSearchListener {
 29 
 30     private Context contxt;
 31     private MapView mMapView;
 32 
 33     public MySearchListener(Context context, MapView mMapView) {
 34         this.contxt = context;
 35         this.mMapView = mMapView;
 36     }
 37 
 38     @Override
 39     public void onGetAddrResult(MKAddrInfo result, int iError) {
 40         // 返回地址信息搜索結果
 41     }
 42 
 43     @Override
 44     public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
 45         // 返回駕乘路線搜索結果
 46     }
 47 
 48     @Override
 49     public void onGetPoiResult(MKPoiResult result, int type, int iError) {
 50         // 返回poi搜索結果
 51 
 52         if (iError == MKEvent.ERROR_RESULT_NOT_FOUND) {
 53             Toast.makeText(contxt, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
 54         } else if (iError != 0 || result == null) {
 55             Toast.makeText(contxt, "搜索出錯啦..", Toast.LENGTH_LONG).show();
 56         }
 57 
 58         PoiOverlay poiOverlay = new PoiOverlay((Activity) contxt, mMapView);
 59         poiOverlay.setData(result.getAllPoi());
 60         mMapView.getOverlays().clear();
 61         mMapView.getOverlays().add(poiOverlay);
 62         mMapView.refresh();
 63         for (MKPoiInfo info : result.getAllPoi()) {
 64             if (info.pt != null) {
 65                 mMapView.getController().animateTo(info.pt);
 66                 break;
 67             }
 68         }
 69 
 70     }
 71 
 72     @Override
 73     public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
 74         // 返回公交搜索結果
 75         String plan = "目前公交方案有:\n";
 76         for (int i = 0; i < result.getNumPlan(); i++) {
 77             plan += (i + 1) + "." + result.getPlan(i).getContent() + "\n";
 78         }
 79         Dialog alertDialog = new AlertDialog.Builder(contxt).setTitle("查詢結果")
 80                 .setMessage(plan).setIcon(R.drawable.ic_launcher).create();
 81 
 82         alertDialog.show();
 83     }
 84 
 85     @Override
 86     public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
 87         // 返回步行路線搜索結果
 88     }
 89 
 90     @Override
 91     public void onGetBusDetailResult(MKBusLineResult result, int iError) {
 92         // 返回公交車詳情信息搜索結果
 93     }
 94 
 95     @Override
 96     public void onGetShareUrlResult(MKShareUrlResult result, int type, int error) {
 97         // 在此處理短串請求返回結果.
 98     }
 99 
100     @Override
101     public void onGetPoiDetailSearchResult(int arg0, int arg1) {
102         // TODO Auto-generated method stub
103 
104     }
105 
106     @Override
107     public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
108         // TODO Auto-generated method stub
109 
110     }
111 }

這兩個是主要的類。ide

獲取位置和網絡鏈接都是須要相關權限的。咱們知道百度LBS是三種技術的綜合。GPS定位,wifi定位,基站定位。所這這些權限都是要加入AndroidManifest.xmlui

 1 <!-- 使用網絡功能所需權限 -->
 2     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
 3     </uses-permission>
 4     <uses-permission android:name="android.permission.INTERNET" >
 5     </uses-permission>
 6     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
 7     </uses-permission>
 8     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
 9     </uses-permission>
10     <!-- SDK離線地圖和cache功能須要讀寫外部存儲器 -->
11     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
12     </uses-permission>
13     <uses-permission android:name="android.permission.WRITE_SETTINGS" >
14     </uses-permission>
15     <!-- 獲取設置信息和詳情頁直接撥打電話須要如下權限 -->
16     <uses-permission android:name="android.permission.READ_PHONE_STATE" >
17     </uses-permission>
18     <uses-permission android:name="android.permission.CALL_PHONE" >
19     </uses-permission>
20     <!-- 使用定位功能所需權限,demo已集成百度定位SDK,不使用定位功能可去掉如下6項 -->
21     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
22     </uses-permission>
23 
24     <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
25     </permission>
26 
27     <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
28     </uses-permission>
29     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
30     </uses-permission>
31     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
32     </uses-permission>
33     <uses-permission android:name="android.permission.ACCESS_GPS" />
34     <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
35     
36     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

還有定位不可缺乏的一個服務要加入AndroidManifest.xml中:this

1 <service
2             android:name="com.baidu.location.f"
3             android:enabled="true"
4             android:process=":remote" >
5             <intent-filter>
6                 <action android:name="com.baidu.location.service_v2.2" >
7                 </action>
8             </intent-filter>
9         </service>

 這樣基本完成:spa

運行結果以下:進入看到個人位置

 點擊搜索加油站:

 這些紅點就是附近的加油站。

點擊到市府廣場:

能夠看到有5個公交乘車方案。

總結:這樣技術層面是沒有任何問題了。將這些功能嵌入到公司的項目中就能夠了。

版權:歸博客園和Egojit全部,轉載請標明出處。
相關文章
相關標籤/搜索