Android端百度地圖API使用詳解

百度地圖API簡介

百度地圖移動版API(Android)是一套基於Android設備的應用程序接口,經過該接口,能夠輕鬆的訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。
百度地圖移動版API不只包含構建地圖的基本接口,還提供了本地搜索、路線規劃、地圖定位等數據服務php

演示示例

1、準備工做

  • 1.註冊百度開發者帳號,建立應用,獲取API key
  • 2.建立應用須要應用的數字簽名SHA1和包名
    • 在Preference中能夠看到Android項目Eclipse默認的數字簽名SHA1html

    • 切換到模擬器安裝目錄下輸入命令命令 "C:\Program Files\Java\jdk1.6.0_45\bin\keytool.exe" -list -v -keystoredebug.keystore默認密碼是android也能獲取數字簽名的SHA1node

    • 獲取建立的API key
  • 3.添加地圖引擎(類庫和.so文件)到工程中
  • 4.添加權限
<!-- 這個權限用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個權限用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網絡,網絡定位須要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權限,用戶寫入離線定位數據-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--容許應用讀取低級別的系統日誌文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
  • 5.在清單文件Application節點下添加
<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="33c6iZyFukuzDOg77Wk6wE2t"/>

2、MapView和BaiduMap介紹

public class HelloWorld extends Activity{
    private static final String TAG ="HelloWorld";
    private MapView mapView;
    private BaiduMap baiduMap;
    
    private double latitude = 40.050966;// 緯度
    private double longitude = 116.303128;// 經度
    private LatLng hmPos = new LatLng(latitude, longitude);// 座標
    private MyBaiduSdkReceiver receiver;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        intManager();
        setContentView(R.layout.common);
        init();
    }
    private void intManager() {
        receiver = new MyBaiduSdkReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        registerReceiver(receiver, filter);
    }
    private void init() {
        mapView = (MapView) findViewById(R.id.mapView);
        
        //BaiduMap管理具體的某一個MapView: 旋轉,移動,縮放,事件。。。
        baiduMap = mapView.getMap();
        
        //設置縮放級別,默認級別爲12
        MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);;
        baiduMap.setMapStatus(mapstatusUpdate);
        
        //設置地圖中心點,默認是天安門
        MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory.newLatLng(hmPos);
        baiduMap.setMapStatus(mapstatusUpdatePoint );
        
        //mapView.showScaleControl(false);//默認是true,顯示縮放按鈕
        //mapView.showZoomControls(false);//默認是true,顯示比例尺
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //旋轉,移動,縮放
        switch (keyCode) {
        case KeyEvent.KEYCODE_1:
            //放大地圖縮放級別,每次放大一個級別
            
            baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
            break;
        case KeyEvent.KEYCODE_2:
            //每次縮小一個級別
            baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
            
            break;
        case KeyEvent.KEYCODE_3:
            //以一個點爲中心旋轉
            //獲取地圖當前的狀態
            MapStatus mapStatus = baiduMap.getMapStatus();
            float rotate = mapStatus.rotate;
            Log.d(TAG,  "rotate:" + rotate);
            
            //旋轉範圍 0-360
            MapStatus newRotate = new MapStatus.Builder().rotate(rotate+30).build();
            
            baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newRotate));
            break;
        case KeyEvent.KEYCODE_4:
            //以一條直線爲軸,旋轉 調整俯仰角 overlook
            //範圍 0-45
            float overlook = baiduMap.getMapStatus().overlook;
            MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();
            baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overStatus));
            break;
        case KeyEvent.KEYCODE_5:
            //移動
            MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));
            //帶動畫的更新地圖狀態,仍是300毫秒
            baiduMap.animateMapStatus(moveStatusUpdate);
            break;
        default:
            break;
        }
        
        
        return super.onKeyDown(keyCode, event);
    }
    
    
    
    @Override
    protected void onDestroy() {
        //卸載super的先後是沒有卻別的
        mapView.onDestroy();
        unregisterReceiver(receiver);
        
        super.onDestroy();
        
    }
    
    @Override
    protected void onResume() {
        mapView.onResume();
        super.onResume();
    }
    
    
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        mapView.onPause();
    }
    
    class MyBaiduSdkReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
                //網絡錯誤
                Toast.makeText(getApplicationContext(), "無網絡", 0).show();
            }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
                //key校驗失敗
                Toast.makeText(getApplicationContext(), "校驗失敗", 0).show();
            }
        }
    }
}

3、地圖圖層

什麼是地圖圖層

  • 地圖能夠包含一個或多個圖層,每一個圖層在每一個級別都是由若干個圖塊組成的,他們覆蓋了地圖的整個表面。例如您所看到的包括街道、興趣點(POI)、學校、公園等內容的地圖展示就是一個圖層,另外交通留香的展示也是經過圖層來實現的。android

    圖層分類

  • 底圖
    • 基本的地圖圖層,包括軟杆個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容
  • 實時交通訊息圖baiduMap.setTrafficEnabled(true)
  • 衛星圖baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
    • 衛星地圖是衛星拍攝的真實的地理面貌(其實不少都是飛機航拍的,由於衛星拍照貴啊),因此衛星地圖可用來檢測地面的信息git

      覆蓋物的成績壓蓋關係,具體以下(從下至上的順序):
      1.基礎底圖(包括底圖、底圖道路、衛星圖等);
      2.地形圖圖層(GroundOverlay);
      3.熱力圖圖層(HeatMap);
      4.實時路況圖圖層(BaiduMap.setTrafficEnabled(true););
      5.百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););
      6.底圖標註(指的是底圖上面自帶的那些POI元素);
      7.幾何圖形圖層(點、折線、弧線、圓、多邊形);
      8.標註圖層(Marker),文字繪製圖層(Text);
      9.指南針圖層(當地圖發生旋轉和視角變化時,默認出如今左上角的指南針);
      10.定位圖層(BaiduMap.setMyLocationEnabled(true););
      11.彈出窗圖層(InfoWindow);
      12.自定義View(MapView.addView(View););api

  • 切換地圖,交通圖,衛星圖,是否顯示實時交通服務器

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //切換 地圖、交通圖、 衛星圖
        switch (keyCode) {
        case KeyEvent.KEYCODE_1:
            //按1 設置顯示底圖
            baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            
            break;
        case KeyEvent.KEYCODE_2:
            //衛星圖
            baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            break;
        case KeyEvent.KEYCODE_3:
            //打開交通圖
            baiduMap.setTrafficEnabled(true);
            break;
        }
        return super.onKeyDown(keyCode, event);
    }

4、覆蓋物

全部疊加或覆蓋到地圖的內容,咱們琮琤爲地圖覆蓋物。如標註、矢量圖性元素(包括:折現和多邊形和圓),定位圖標等。覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,他們會嚮應的處理網絡

覆蓋物包括:本地覆蓋物和搜索覆蓋物

#### 本地覆蓋物的抽象基類:OverlayOptions(核心類)異步

  • 圓形覆蓋物: CircleOptions
  • 文字覆蓋物: TextOptions
  • marker覆蓋物: MarkerOptions
  • 圓點覆蓋物:DotOptions
  • ground 覆蓋物:GroundOverlayOptions
  • 圓點覆蓋物:DotOptions
  • 多邊形覆蓋物:PolygonOptions
  • 折線覆蓋物:PolylineOptions
  • 弧線覆蓋物:ArcOptionside

    搜索覆蓋物抽象類: OverlayManager (核心類)

  • 本地搜索覆蓋物:PoiOverlay
  • 駕車路線覆蓋物:DrivingRouteOverlay
  • 步行路線覆蓋物:WalkingRouteOverlay
  • 換乘路線覆蓋物:TransitOverlay
  • 公交路線覆蓋物:BusLineOverlay

    建立覆蓋物的步驟:

  1. 建立本身
  2. 給本身設置數據
  3. 把覆蓋物添加到地圖中
  • 添加圓形覆蓋物
private void draw() {
        //定義一個圓 : 圓心+半徑
        
        //1.建立本身
        CircleOptions circleOptions = new CircleOptions();
        //2.給本身設置數據
        circleOptions.center(hmPos) //圓心
        .radius(1000)//半徑 單位米
        .fillColor(0x60ff0000)//填充色
        .stroke(new Stroke(2,0x6000ff00));//邊框寬度和顏色
        
        //3.把覆蓋物添加到地圖中
        baiduMap.addOverlay(circleOptions);
    }
  • 效果

  • 添加文字覆蓋物

private void draw() {
        TextOptions textOptions = new TextOptions();
        
        textOptions.fontColor(0x60ff0000)//設置字體顏色
        .text("無良印品,窗前明月光")//文字內容
        .position(hmPos)//位置
        .fontSize(24)//字體大小
        .typeface(Typeface.SERIF)//字體
        .rotate(30);//旋轉
        
        baiduMap.addOverlay(textOptions);
    }
  • 效果

  • Marker覆蓋物

public class MarkerOptionsDemo extends BaseActivity {
    private View pop;
    private TextView title;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        draw();
        
        //點擊某一個Marker,在腦殼上彈出pop
        initPop();
    }
    private void draw() {
        
        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon);
        
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(hmPos)//設置位置
        .icon(bitmapDescriptor)//設置覆蓋物小圖標
        .draggable(true)//設置是否能夠拖拽,默認爲否
        .title("中心");//設置標題
        baiduMap.addOverlay(markerOptions);
        
        markerOptions = new MarkerOptions().title("向北")
                .position(new LatLng(latitude+0.001, longitude))
                .icon(bitmapDescriptor);
        baiduMap.addOverlay(markerOptions);
        
        ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
        bitmaps.add(bitmapDescriptor);
        bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
        
        markerOptions = new MarkerOptions().title("向東")
                .position(new LatLng(latitude, longitude+0.001))
                .icons(bitmaps)//圖標設置一個幀動畫,多個圖片來回切換
                .period(10);//切換幀的時間間隔
        baiduMap.addOverlay(markerOptions);
        
        markerOptions = new MarkerOptions().title("向西南")
                .position(new LatLng(latitude-0.001, longitude-0.001))
                .icon(bitmapDescriptor);
        baiduMap.addOverlay(markerOptions);
        
        baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
            
            @Override
            public boolean onMarkerClick(Marker result) {
                //當點擊時,更新pop的位置,設置爲顯示
                
                MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder()
                .layoutMode(ELayoutMode.mapMode)//按照經緯度設置位置
                .position(result.getPosition())//不能傳null
                .width(MapViewLayoutParams.WRAP_CONTENT)
                .height(MapViewLayoutParams.WRAP_CONTENT)
                .yOffset(-5)//距離position的像素 向下是正值,向上是負值
                .build();
                
                mapview.updateViewLayout(pop, layoutParams);
                pop.setVisibility(View.VISIBLE);
                title.setText(result.getTitle());
                
                return true;
            }
        });
    }
    private void initPop() {
        //加載pop 添加到mapview,設置爲隱藏
        
        pop = View.inflate(getApplicationContext(), R.layout.pop, null);
        MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder()
        .layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)//按照經緯度設置位置
        .position(hmPos)//不能傳null,設置爲mapMode時,必須設置position
        .width(MapViewLayoutParams.WRAP_CONTENT)
        .height(MapViewLayoutParams.WRAP_CONTENT)
        .build();
        
        mapview.addView(pop, layoutParams);
        pop.setVisibility(View.INVISIBLE);
        
        title = (TextView) pop.findViewById(R.id.title);
    }
    
}
  • 效果

5、搜索

百度地圖移動版API集成搜索服務,包括位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索

核心類

PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener

實現思路

  • 初始化PoiSearch類,經過setOnGetPoiSearchResultListtener方法註冊搜索結果的監聽對象OnGetPoiSearchResultListener
    ,實現異步搜索服務。
  • 經過自定義MySearchListener實現類,處理不一樣的回調方法,得到搜索結果。
  • 注意,OnGetPoiSearchResultListener只支持一個,一最後一次設置爲準

    結合覆蓋物展現搜索

    本地搜索覆蓋物:PoiOverlay
    駕車路線覆蓋物:DrivingRouteOverlay
    步行路線覆蓋物:WalkingRouteOverlay
    換乘路線覆蓋物:TransitOverlay

    POI(Point of Interest興趣點)搜索有三種方式

    根據範圍和檢索詞發起範圍檢索searchInBound
    周邊檢索searchNearby
    城市poi檢索searchInCity
    poi詳細信息檢索 searchPoiDetail
    結果的展現: PoiOverlay

    在OnGetPoiSearchResultListener的onGetPoiResult方法中處理搜索結果

  • 處理步驟:
    • 判斷服務器結果返回
    • 建立poi覆蓋物
    • 將服務器返回數據添加到poi覆蓋物中
    • 添加覆蓋物到地圖addToMap
    • 縮放地圖,使全部Overlay都在合適的視野內
  • 注意
    • POI檢索結果每頁容量默認狀況下爲10,能夠經過pageCapacity設置,支持1-50(10)
    • 翻頁功能從新調用經過PoiSearch類的searchInXxx()方法並傳遞頁數角標pageNum來實現,該方法是異步函數,搜索成功後會調用註冊的事件處理函數onGetPoiResult 返回查詢頁的結果
  • 在必定範圍內搜索POI

/**
 * 範圍內搜索
 * @author mwp
 *
 */
public class PoiSearchInBoundsDemo extends BaseActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        search();
    }
    private void search() {
        PoiSearch poiSearch = PoiSearch.newInstance();
        
        PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();
        
        LatLngBounds latLngBounds = new LatLngBounds.Builder()
        .include(new LatLng(40.049233, 116.302675))//東北的點
        .include(new LatLng(40.050645, 116.303695))//西南的點
        .build();
        //由東北的點和西南的點兩個點肯定搜索的矩形範圍
        boundSearchOption.bound(latLngBounds);//設置搜索範圍
        boundSearchOption.keyword("加油站");//搜索關鍵字
        poiSearch.searchInBound(boundSearchOption);// 只是把範圍能搜索到的poi設置爲 地圖的中心,同時會搜索到範圍外的poi
        
        poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            
            @Override
            public void onGetPoiResult(PoiResult result) {
                if (result==null || result.error==ERRORNO.RESULT_NOT_FOUND) {
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                
                //搜索poi的覆蓋物
                MyPoiOverlay overlay = new MyPoiOverlay(baiduMap);
                //把事件分發給overlay,overlay才能處理那個點擊事件
                baiduMap.setOnMarkerClickListener(overlay);
                overlay.setData(result);//設置結果
                overlay.addToMap();//把搜索的結果添加到地圖中
                overlay.zoomToSpan();//縮放地圖,使全部overlay都在合適的視野內, 注: 該方法只對Marker類型的overlay有效
            }
            
            @Override
            public void onGetPoiDetailResult(PoiDetailResult result) {
                
            }
        });
    }
    
    class MyPoiOverlay extends PoiOverlay{
        public MyPoiOverlay(BaiduMap arg0) {
            super(arg0);
        }
        
        @Override
        public boolean onPoiClick(int index) {
            //獲取搜索結果
            PoiResult poiResult = getPoiResult();
            //獲取點擊的那個poi的信息
            PoiInfo poiInfo = poiResult.getAllPoi().get(index);
            String text = poiInfo.name+","+poiInfo.address;
            Toast.makeText(getApplicationContext(), text, 0).show();
            
            return super.onPoiClick(index);
        }
        
    }
}
  • 搜索結果

  • 周邊搜索

/**
 * 周邊搜索
 * @author mwp
 *
 */
public class PoiSearchNearByDemo extends BaseActivity{
    private PoiSearch poiSearch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        search();
    }
    private void search() {
        poiSearch = PoiSearch.newInstance();
        
        PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
        nearbySearchOption.location(hmPos);//設置中心點
        nearbySearchOption.radius(1000);//設置半徑 米
        nearbySearchOption.keyword("加油站");//關鍵字
        poiSearch.searchNearby(nearbySearchOption);
        
        poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            
            @Override
            public void onGetPoiResult(PoiResult result) {
                if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆蓋物
                baiduMap.setOnMarkerClickListener(overlay);// 把事件分發給overlay,overlay才能處理點擊事件
                overlay.setData(result);// 設置結果
                overlay.addToMap();// 把搜索的結果添加到地圖中
                overlay.zoomToSpan();// 縮放地圖,使全部Overlay都在合適的視野內 注: 該方法只對Marker類型的overlay有效
            }
            
            @Override
            public void onGetPoiDetailResult(PoiDetailResult result) {
                if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                
                String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating();
                Toast.makeText(getApplicationContext(), text, 0).show();
            }
        });
        
    }
    
    class MyPoiOverlay extends PoiOverlay{
        public MyPoiOverlay(BaiduMap arg0) {
            super(arg0);
        }
        
        
        @Override
        public boolean onPoiClick(int index) {
            PoiResult poiResult = getPoiResult();
            PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息
            String text = poiInfo.name + "," + poiInfo.address;
            Toast.makeText(getApplicationContext(), text, 0).show();
            
            PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
            detailSearchOption.poiUid(poiInfo.uid);//設置poi的uid
            poiSearch.searchPoiDetail(detailSearchOption);
            
            return super.onPoiClick(index);
        }
    }
}
  • 搜索結果

  • 城市內搜索

/**
 * 城市內搜索
 * @author mwp
 *
 */
public class PoiSearchIncityDemo extends BaseActivity {
    private PoiSearch poiSearch;
    private int currentPageIndex = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        poiSearch = PoiSearch.newInstance();
        search();
        
        poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            
            @Override
            public void onGetPoiResult(PoiResult result) {
                if (result == null
                        || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                String text = "共" + result.getTotalPageNum() + "頁,共"
                        + result.getTotalPoiNum() + "條,當前第"
                        + result.getCurrentPageNum() + "頁,當前頁"
                        + result.getCurrentPageCapacity() + "條";
                Toast.makeText(getApplicationContext(), text, 1).show();
                
                baiduMap.clear();//清空地圖全部的Overlay覆蓋物以及InfoWindow
                PoiOverlay overlay = new MyPoiOverlay(baiduMap);
                baiduMap.setOnMarkerClickListener(overlay);
                overlay.setData(result);
                
                overlay.addToMap();
                overlay.zoomToSpan();
                
            }
            
            @Override
            public void onGetPoiDetailResult(PoiDetailResult arg0) {
                
            }
        });
    }
    private void search() {
        PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
        citySearchOption.city("北京");
        citySearchOption.keyword("加油站");
        citySearchOption.pageNum(currentPageIndex);
        poiSearch.searchInCity(citySearchOption);
    }
    
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //每按一下數字鍵1就顯示下一頁的POI
        if (keyCode == KeyEvent.KEYCODE_1) {
            currentPageIndex++;
            search();
        }
        
        return super.onKeyDown(keyCode, event);
    }
    
    class MyPoiOverlay extends PoiOverlay{
        public MyPoiOverlay(BaiduMap arg0) {
            super(arg0);
        }
        
        @Override
        public boolean onPoiClick(int index) {
            PoiResult poiResult = getPoiResult();
            PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息
            String text = poiInfo.name + "," + poiInfo.address;
            Toast.makeText(getApplicationContext(), text, 0).show();
            return super.onPoiClick(index);
        }
    }
}
  • 搜索結果

6、路線規劃

自駕路線規劃

結果展現: DrivingRouteOverlay

  • 駕車路線查詢
    • 查詢:RoutePlanSearch.drivingSearch駕乘路線搜索,或者增長途經點.
    • PlanNode內容的設置:可使用經緯度和地名,但不支持模糊查詢,須要輸入準確的名稱
    • 能夠經過DrivingRoutePlanOption.policy (int policy)來設置駕車路線規劃策略
    • 結果處理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result)

步行路線規劃

步行路線查詢
結果展現: WalkingRouteOverlay
RoutePlanSearch. walkingSearch步行路線搜索.
結果處理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)

公交換乘路線規劃

結果展現:TransitRouteOverlay
檢索: RoutePlanSearch. transitSearch
經過TransitRoutePlanOption.policy (int policy) 設置路線規劃策略
結果處理: OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result)

  • 自駕線路規劃(路過特定地點)
/**
 * 駕車路線
 * @author mwp
 *
 */
public class DrivingRouteOverlayDemo extends BaseActivity {
    private RoutePlanSearch routePlanSearch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        search();
    }
    private void search() {
        routePlanSearch = RoutePlanSearch.newInstance();
        
        
        DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
        PlanNode from = PlanNode.withLocation(hmPos);//窗前起點
        PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));//建立終點
        drivingOption.from(from);//設置起點
        drivingOption.to(to);//設置終點
        
        List<PlanNode> nodes = new ArrayList<PlanNode>();
        nodes.add(PlanNode.withCityNameAndPlaceName("北京", "天安門"));
        drivingOption.passBy(nodes);
        drivingOption.policy(DrivingPolicy.ECAR_DIS_FIRST);//設置策略,駕乘檢索策略常量:最短距離
        
        routePlanSearch.drivingSearch(drivingOption);
        
        routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
            
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
                
            }
            
            @Override
            public void onGetTransitRouteResult(TransitRouteResult arg0) {
                
            }
            
            // 自駕搜索結果回調
            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult result) {
                if (result == null
                        || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                
                DrivingRouteOverlay drivingOverlay = new MyDrivingOverlay(baiduMap);
                baiduMap.setOnMarkerClickListener(drivingOverlay);
                drivingOverlay.setData(result.getRouteLines().get(0));//設置線路爲搜索結果的第一條
                drivingOverlay.addToMap();
                drivingOverlay.zoomToSpan();
            }
        });
    }
    
    class MyDrivingOverlay extends DrivingRouteOverlay{
        public MyDrivingOverlay(BaiduMap arg0) {
            super(arg0);
        }
        
        @Override
        public BitmapDescriptor getStartMarker() {
            // 覆寫此方法以改變默認起點圖標
            return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
        }
        
        @Override
        public BitmapDescriptor getTerminalMarker() {
            // 覆寫此方法以改變默認終點圖標
            return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
        }
    }
    
}
  • 搜索結果

  • 步行線路規劃

/**
 * 步行路線
 * @author mwp
 *
 */
public class WalkingRouteOverlayDemo extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        search();
    }
    private void search() {
        RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
        
        WalkingRoutePlanOption walkingOption = new WalkingRoutePlanOption();
        PlanNode from = PlanNode.withLocation(hmPos);//建立起點
        PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點
        walkingOption.from(from);
        walkingOption.to(to);
        
        routePlanSearch.walkingSearch(walkingOption);
        
        routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
            
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult result) {
                if (result == null
                        || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                
                WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
                baiduMap.setOnMarkerClickListener(overlay);
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();
                overlay.zoomToSpan();
            }
            
            @Override
            public void onGetTransitRouteResult(TransitRouteResult arg0) {
                
            }
            
            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
                
            }
        });
    }
    
}
  • 搜索結果

  • 公交換乘規劃

/**
 * 公交換乘路線規劃
 * @author mwp
 *
 */
public class TransitRouteOverlayDemo extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        search();
    }
    private void search() {
        RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
        
        TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
        PlanNode from = PlanNode.withLocation(hmPos);// 建立起點
        PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點
        transitOption.from(from);
        transitOption.to(to);
        transitOption.city("北京");//公交換乘只能在一個城市中,不能跨城市
        transitOption.policy(TransitPolicy.EBUS_WALK_FIRST);//公交檢索策略常量:最少步行距離
        
        routePlanSearch.transitSearch(transitOption);
        
        routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
            
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
                
            }
            
            @Override
            public void onGetTransitRouteResult(TransitRouteResult result) {
                if (result == null
                        || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
                    Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show();
                    return;
                }
                
                TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
                baiduMap.setOnMarkerClickListener(overlay);
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();
                overlay.zoomToSpan();
                
            }
            
            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
                
            }
        });
    }
    
    class MyDrivingOverlay extends DrivingRouteOverlay{
        public MyDrivingOverlay(BaiduMap arg0) {
            super(arg0);
        }
        
        @Override
        public BitmapDescriptor getStartMarker() {
            //覆寫此方法以改變默認起點圖標
            return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
        }
        @Override
        public BitmapDescriptor getTerminalMarker() {
            //覆寫此方法以改變默認終點圖標
            return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
        }
        
    }
}
  • 規劃結果

7、地址解析服務

GeoCoder.geocode(GeoCodeOption option)
根據地址名獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetGeoCodeResult方法通知
GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
根據地理座標點獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetReverseGeoCodeResult方法通知

8、聯想詞檢索

SuggestionSearch . requestSuggestion(SuggestionSearchOption option)
查詢一系列與指定key相關的內容,結果中包括城市及包含key的名稱
結果處理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result)

9、定位

在百度地圖移動版API中,提供一個重要的特點功能:定位,經過這個功能,能獲取到用戶當前所在位置。
在程序中,若是使用此功能,必須註冊GPS和網絡的使用權限。
在獲取用戶位置時,優先使用GPS進行定位;若是GPS定位沒有打開或者沒有可用位置信息,則會經過判斷網絡是否鏈接(即確認手機是否能上網,不管是鏈接2G/3G或Wi-Fi網絡),若是是,則經過請求百度網絡定位服務,返回網絡定位結果。爲了使得到的網絡定位結果更加精確,請打開手機的Wi-Fi開關。
目前系統自帶的網絡定位服務精度低,且服務不穩定、精度低,而且從將來的趨勢看,基站定位是不可控的(移動公司隨時可能更改基站編號以壟判定位服務),而Wi-Fi定位則否則,它是一種精度更高、不受管制的定位方法。國內其它使用Wi-Fi定位的地圖軟件,Wi-Fi定位基本不可用,百度的定位服務量化指標優秀,網絡接口返回速度快(服務端每次定位響應時間50毫秒之內),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆蓋率98%,在國內處於一枝獨秀的地位。
注意
關於經緯度的說明:該經緯度信息是通過加密處理,因此在其它地圖工具中測得的經緯度 信息不適合百度的座標系統。
使用百度經緯度座標,能夠經過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理座標若是須要在百度地圖上顯示使用其餘座標系統的位置,請發郵件至mapapi@baidu.com申請座標轉換接口http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

/**
 * 定位
 * 
 * @author mwp
 *
 */
public class LocationDemo extends BaseActivity {
    private LocationClient locationClient;
    private BitmapDescriptor geo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lacate();
    }
    private void lacate() {
        locationClient = new LocationClient(getApplicationContext());
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式
        option.setCoorType("bd0911");// 返回的定位結果是百度經緯度,默認值gcj02
        option.setScanSpan(5000);// 設置發起定位請求的間隔時間爲5000ms
        option.setIsNeedAddress(true);// 返回的定位結果包含地址信息
        option.setNeedDeviceDirect(true);// 返回的定位結果包含手機機頭的方向
        locationClient.setLocOption(option);
        locationClient.registerLocationListener(new BDLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation result) {
                if (result != null) {
                    MyLocationData data = new MyLocationData.Builder()
                            .latitude(result.getLatitude())
                            .longitude(result.getLongitude()).build();
                    baiduMap.setMyLocationData(data);
                }
            }
        });
        geo = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
        MyLocationConfiguration configuration = new MyLocationConfiguration(
                MyLocationConfiguration.LocationMode.FOLLOWING, true, geo);
        baiduMap.setMyLocationConfigeration(configuration);// 設置定位模式
        baiduMap.setMyLocationEnabled(true);// 打開定位圖層
    }
    @Override
    protected void onStart() {
        locationClient.start();
        super.onStart();
    }
    @Override
    protected void onPause() {
        locationClient.stop();
        super.onPause();
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_1:
            //正常
            baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
                    MyLocationConfiguration.LocationMode.NORMAL, true, geo));
            break;
        case KeyEvent.KEYCODE_2:
            //羅盤
            baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
                    MyLocationConfiguration.LocationMode.COMPASS, true, geo));
            break;
        case KeyEvent.KEYCODE_3:
            //跟隨
            baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
                    MyLocationConfiguration.LocationMode.FOLLOWING, true, geo));
            break;
        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    }
}

10、離線地圖

離線文件下載
http://shouji.baidu.com/map/map.html?from=3052,指定機型和城市下載對應的離線地圖

  • 2.0以上版本處理步驟
    • 將下載好的離線地圖包解壓縮。
    • 找到解壓出的"BaiduMap"文件夾,把它放入手機存儲卡根目錄。在上述過程當中如遇提示「是否須要覆蓋文件」,點擊肯定便可。
    • 斷開與電腦鏈接,打開百度手機地圖(如已打開請重啓),系統會提示導入成功。
    • 提示:下載多個城市包時,經解壓後,這些城市數據都會被同時解壓到BaiduMap文件夾中,不一樣城市不會出現被覆蓋的狀況。
  • 1.X版本處理步驟
    • 將離線地圖加壓,把Mapdata文件夾拷入SD卡根目錄下的BaiduMapSdk下
    • 利用MKOfflineMap在初始化(init)後調用scan()掃描本地地圖資源
/** 離線地圖初始化  **/      
  mOffline = new MKOfflineMap();
          mOffline.init(mBMapMan, new MKOfflineMapListener() {
  public void onGetOfflineMapState(int type, int state) {
  switch (type) {
  case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
                      {
                          MKOLUpdateElement update = mOffline.getUpdateInfo(state);
                          //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio));
                      }
                      break;
  case MKOfflineMap.TYPE_NEW_OFFLINE:
                      Log.d("OfflineDemo", String.format("add offlinemapnum:%d", state));
                      break;
  case MKOfflineMap.TYPE_VER_UPDATE:
                             Log.d("OfflineDemo", String.format("new offlinemapver"));
                      break;
                }   
                    }
  }
  );
  /** 離線地圖導入離線包 **/
          intnum = mOffline.scan();
相關文章
相關標籤/搜索