【「零起點」--百度地圖手機SDK】如何使用離線地圖?

摘要:用戶使用地圖的時候,但願不聯網就能展現地圖。這時,就須要使用到離線地圖了。如何在百度地圖SDK裏引入離線地圖呢?html

-------------------------------------------------------------------------------------------------------------------java

相關閱讀:android

一、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html api

二、【「零起點」--百度地圖手機SDK】如何建立一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.htmlapp

-------------------------------------------------------------------------------------------------------------------ide

1、下載離線地圖包函數

到官網下載離線地圖包,網址:http://shouji.baidu.com/map/map.html?from=3052ui

首先選擇了手機品牌和手機型號:spa

 

 

 

選擇好手機後,系統會出來提示。請選擇舊版本地圖進行下載。orm

由於目前SDK只能使用柵格圖,因此咱們必須下載舊版本的地圖。後期SDK將支持矢量圖,到時候北京市的離線地圖就從114M下降到14M了。

預計6月份就能使用新版離線地圖了~~~

 

好比,我選擇下載了北京市的離線地圖:

 

 

解壓後,有兩個文件。一個是BaiduMap,一個是安裝說明。

 

不要管安裝說明,把BaiduMap打開,能看到Mapdata文件夾。拷貝這個文件夾。

 

將Mapdata文件夾拷貝到手機SD卡的BaiduMapSdk文件夾根目錄下。

 

2、編寫離線地圖代碼

找到主java文件,並在activity裏申明變量。

MKOfflineMap mOffline = null;   //離線地圖變量

 

而後在onCreate函數裏寫離線地圖初始化的代碼:

/** 離線地圖初始化  **/
        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 offlinemap num:%d", state));
                    break;
                case MKOfflineMap.TYPE_VER_UPDATE:
                    Log.d("OfflineDemo", String.format("new offlinemap ver"));
                    break;
                }    
                  }
        }
        );
        /** 離線地圖導入離線包 **/
        int num = mOffline.scan();
        //if (num != 0)   mText.setText(String.format("已安裝%d個離線包", num));

3、連真機,看運行看結果。

看,這是沒有聯網,展現地圖的效果。

 

4、java文件所有源代碼

package com.baidu.searchpoi;

import android.app.Activity;
import android.os.Bundle;

/** 引入類 **/
import java.util.ArrayList;
import java.util.List;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
 
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MKLocationManager;
import com.baidu.mapapi.MKOLUpdateElement;
import com.baidu.mapapi.MKOfflineMap;
import com.baidu.mapapi.MKOfflineMapListener;
import com.baidu.mapapi.MKPlanNode;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.MyLocationOverlay;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.PoiOverlay;
import com.baidu.mapapi.RouteOverlay;
import com.baidu.mapapi.TransitOverlay;

/** activity **/
public class SearchPOIActivity extends MapActivity {
    //申明變量
    BMapManager mBMapMan = null;  
    MapView mMapView = null; 
    MKOfflineMap mOffline = null;   //離線地圖變量
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mBMapMan = new BMapManager(getApplication());
        mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null);
        super.initMapActivity(mBMapMan);
         
        mMapView = (MapView) findViewById(R.id.bmapsView);
        mMapView.setBuiltInZoomControls(true);  //設置啓用內置的縮放控件
         
        MapController mMapController = mMapView.getController();  // 獲得mMapView的控制權,能夠用它控制和驅動平移和縮放
        GeoPoint point = new GeoPoint((int) (39.93 * 1E6),
                (int) (116.42 * 1E6));  //用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
        mMapController.setCenter(point);  //設置地圖中心點
        mMapController.setZoom(13);    //設置地圖zoom級別
        //mMapView.setSatellite(true); //衛星圖
        //mMapView.setTraffic(true); //交通流量
        
        /** 離線地圖初始化  **/
        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 offlinemap num:%d", state));
                    break;
                case MKOfflineMap.TYPE_VER_UPDATE:
                    Log.d("OfflineDemo", String.format("new offlinemap ver"));
                    break;
                }    
                  }
        }
        );
        /** 離線地圖導入離線包 **/
        int num = mOffline.scan();
        //if (num != 0)   mText.setText(String.format("已安裝%d個離線包", num));
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
    
    @Override
    protected void onDestroy() {
        if (mBMapMan != null) {
            mBMapMan.destroy();
            mBMapMan = null;
        }
        super.onDestroy();
    }
    
    @Override
    protected void onPause() {
        if (mBMapMan != null) {
            mBMapMan.stop();
        }
        super.onPause();
    }
    
    @Override
    protected void onResume() {
        if (mBMapMan != null) {
            mBMapMan.start();
        }
        super.onResume();
    }
}
相關文章
相關標籤/搜索