Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 百度地圖系列之地圖初始化及定位

android 百度地圖系列之地圖初始化及定位

編輯:關於Android編程

在Android應用中,很多時候需要地圖功能,回顧過去寫的項目和百度地圖api,開始總結一下Android百度地圖的實現。首先總結一下怎麼開始一個Android百度地圖功能。
當使用百度地圖的時候,提到一個appkey。“在使用百度地圖SDK為您提供的各種LBS能力之前,您需要獲取百度地圖移動版的開發密鑰,該密鑰與您的百度賬戶相關聯。因此,您必須先有百度帳戶,才能獲得開發密鑰。並且,該密鑰與您創建的過程名稱有關。Key地址為:http://lbsyun.baidu.com/apiconsole/key”
這是百度地圖api給的定義。總之,一個項目包名和sha1對應一個appkey。首先注冊百度賬號,根據教程一步步創建appkey。
當有了appkey,我們就能開一部署一個android百度地圖環境。首先在百度api的相關下載中,將需要的功能勾選上,並下載相關的開發包,示例代碼等。將開發包導入項目libs文件夾下。然後,開始部署AndroidMinifest.xml,添加權限,添加appkey,定位的service。



    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        
        
            
                

                
            
        
        
        
    

下一步就是在activity_main.xml中添加布局文件。本片文章還有自定義的放大縮小,定位等功能。



    
    

    

    
    
    

顯示效果圖:
這裡寫圖片描述
下面開始具體的代碼實現
當前程序有三個功能:顯示地圖,顯示定位,實現按鈕控制。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //初始化控件 initView(); //初始化地圖 initMap(); //定位 initLocation(); }

一。顯示基本地圖
初始化地圖顯示,將地圖在手機上顯示出來

//獲取地圖控件引用  
mMapView = (MapView) findViewById(R.id.bmapView);
// 不顯示縮放比例尺
mMapView.showZoomControls(false);
// 不顯示百度地圖Logo
mMapView.removeViewAt(1);
//百度地圖
mBaiduMap = mMapView.getMap();
// 改變地圖狀態,使地圖顯示在恰當的縮放大小
MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);

二。地圖的控制按鈕:縮放按鈕,切換模式按鈕,開啟實時交通圖
1.在地圖初始化顯示時,我將自帶的縮放比例尺去掉了,需要自定義一個縮放按鈕。
我們一般顯示將地圖顯示在5-18級別中,所以在點擊事件中對按鈕進行了控制。

case R.id.ib_large:
if (zoomLevel < 18) {
    mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
    ib_small.setEnabled(true);
} else {
    showInfo("已經放至最大,可繼續滑動操作");
    ib_large.setEnabled(false);
}
break;
case R.id.ib_small:
if (zoomLevel > 6) {
    mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
    ib_large.setEnabled(true);
} else {
    ib_small.setEnabled(false);
    showInfo("已經縮至最小,可繼續滑動操作");
}
break;

zoomlevel是一個全局變量,這時候就需要實時監控地圖的縮放級別是多少,需要給地圖添加一個地圖狀態改變的監聽事件

//設置地圖狀態改變監聽器
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus arg0) {
}
@Override
public void onMapStatusChangeFinish(MapStatus arg0) {
}
@Override
public void onMapStatusChange(MapStatus arg0) {
    //當地圖狀態改變的時候,獲取放大級別
    zoomLevel = arg0.zoom;
}
});

2.切換顯示模式和實時交通圖

boolean modeFlag = true;//設置初始時是普通模式
case R.id.ib_mode://衛星模式和普通模式
if(modeFlag){
    modeFlag = false;
    mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
    showInfo("開啟衛星模式");
}else{
    modeFlag = true;
    mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    showInfo("開啟普通模式");
}
break;
case R.id.ib_traffic://是否開啟交通圖
if(mBaiduMap.isTrafficEnabled()){//判斷是否開啟了交通圖
    mBaiduMap.setTrafficEnabled(false);
    ib_traffic.setBackgroundResource(R.drawable.offtraffic);
    showInfo("關閉實時交通圖");
}else{
    mBaiduMap.setTrafficEnabled(true);
    ib_traffic.setBackgroundResource(R.drawable.ontraffic);
    showInfo("開啟實時交通圖");
}
break;

三。定位自己
定位自己的思路是:當程序啟動的時候,開啟定位圖層,開始定位,收到位置信息後將自己的位置顯示在地圖中間,當地圖離開自己的位置時,點擊定位自己的圖標將地圖重新顯示自己的位置。
首先,開啟定位圖層,開始定位。

@Override
protected void onStart() {
    super.onStart();
    //開啟定位
    mBaiduMap.setMyLocationEnabled(true);
    if(!mLocationClient.isStarted()){//如果定位client沒有開啟,開啟定位
        mLocationClient.start();
    }
}
private void initLocation() {
    //定位客戶端的設置
    mLocationClient = new LocationClient(this);
    mLocationListener = new MyLocationListener();
    //注冊監聽
    mLocationClient.registerLocationListener(mLocationListener);
    //配置定位
    LocationClientOption option = new LocationClientOption();
    option.setCoorType("bd09ll");//坐標類型
    option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
    option.setOpenGps(true);//打開Gps
    option.setScanSpan(1000);//1000毫秒定位一次
    option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裡得到
    mLocationClient.setLocOption(option);
}
//自定義的定位監聽
private class MyLocationListener implements BDLocationListener{
    @Override
    public void onReceiveLocation(BDLocation location) {
        //將獲取的location信息給百度map
        MyLocationData data = new MyLocationData.Builder()  
                .accuracy(location.getRadius())  
                // 此處設置開發者獲取到的方向信息,順時針0-360  
                .direction(100)
                .latitude(location.getLatitude())  
                .longitude(location.getLongitude())
                .build();
        mBaiduMap.setMyLocationData(data);
        if(isFirstLocation){
            //獲取經緯度
            LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
            MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
            //mBaiduMap.setMapStatus(status);//直接到中間
            mBaiduMap.animateMapStatus(status);//動畫的方式到中間
            isFirstLocation = false;
            showInfo("位置:" + location.getAddrStr());
        }
    }
}

注意,設置isFirstLocation=true,這樣我們就只是開始的時候定位自己,並顯示在地圖中間,不會每一秒都跳一次。在我門需要定位的時候,將isFirstLocation重新設置成true就行。

case R.id.ib_loc:
    isFirstLocation = true;
    showInfo("返回自己位置");
    break;

不要忘記在活動結束的時候,將定位取消

@Override
protected void onStop() {
    super.onStop();
    //關閉定位
    mBaiduMap.setMyLocationEnabled(false);
    if(mLocationClient.isStarted()){
        mLocationClient.stop();
    }
}

然後運行程序,發現一個帶有定位功能,並能部分控制地圖顯示的app出來了,下面是MainActivity的源碼

package 包名;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;

/**
 * 我的百度地圖首頁
 * @author jing__jie
 *
 */
public class MainActivity extends Activity implements OnClickListener {
    private MapView mMapView = null;
    private BaiduMap mBaiduMap;
    private ImageButton ib_large,ib_small,ib_mode,ib_loc,ib_traffic;
    //模式切換,正常模式
    private boolean modeFlag = true;
    //當前地圖縮放級別
    private float zoomLevel; 
    //定位相關
    private LocationClient mLocationClient;
    private MyLocationListener mLocationListener;
    //是否第一次定位,如果是第一次定位的話要將自己的位置顯示在地圖 中間
    private boolean isFirstLocation = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext  
        //注意該方法要再setContentView方法之前實現  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
        //初始化控件
        initView();
        //初始化地圖
        initMap();
        //定位
        initLocation();
    }  
    private void initMap() {
        //獲取地圖控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);
        // 不顯示縮放比例尺
        mMapView.showZoomControls(false);
        // 不顯示百度地圖Logo
        mMapView.removeViewAt(1);
        //百度地圖
        mBaiduMap = mMapView.getMap();
        // 改變地圖狀態
        MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        mBaiduMap.setMapStatus(mMapStatusUpdate);
        //設置地圖狀態改變監聽器
        mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
            @Override
            public void onMapStatusChangeStart(MapStatus arg0) {
            }
            @Override
            public void onMapStatusChangeFinish(MapStatus arg0) {
            }
            @Override
            public void onMapStatusChange(MapStatus arg0) {
                //當地圖狀態改變的時候,獲取放大級別
                zoomLevel = arg0.zoom;
            }
        });
    }
    private void initLocation() {
        //定位客戶端的設置
        mLocationClient = new LocationClient(this);
        mLocationListener = new MyLocationListener();
        //注冊監聽
        mLocationClient.registerLocationListener(mLocationListener);
        //配置定位
        LocationClientOption option = new LocationClientOption();
        option.setCoorType("bd09ll");//坐標類型
        option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
        option.setOpenGps(true);//打開Gps
        option.setScanSpan(1000);//1000毫秒定位一次
        option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裡得到
        mLocationClient.setLocOption(option);
    }
    private void initView() {
        //地圖控制按鈕
        ib_large = (ImageButton)findViewById(R.id.ib_large);
        ib_large.setOnClickListener(this);
        ib_small = (ImageButton)findViewById(R.id.ib_small);
        ib_small.setOnClickListener(this);
        ib_mode = (ImageButton)findViewById(R.id.ib_mode);
        ib_mode.setOnClickListener(this);
        ib_loc = (ImageButton)findViewById(R.id.ib_loc);
        ib_loc.setOnClickListener(this);
        ib_traffic = (ImageButton)findViewById(R.id.ib_traffic);
        ib_traffic.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.ib_large:
            if (zoomLevel < 18) {
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
                ib_small.setEnabled(true);
            } else {
                showInfo("已經放至最大,可繼續滑動操作");
                ib_large.setEnabled(false);
            }
            break;
        case R.id.ib_small:
            if (zoomLevel > 6) {
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
                ib_large.setEnabled(true);
            } else {
                ib_small.setEnabled(false);
                showInfo("已經縮至最小,可繼續滑動操作");
            }
            break;
        case R.id.ib_mode://衛星模式和普通模式
            if(modeFlag){
                modeFlag = false;
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                showInfo("開啟衛星模式");
            }else{
                modeFlag = true;
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                showInfo("開啟普通模式");
            }
            break;
        case R.id.ib_loc:
            isFirstLocation = true;
            showInfo("返回自己位置");
            break;
        case R.id.ib_traffic://是否開啟交通圖
            if(mBaiduMap.isTrafficEnabled()){
                mBaiduMap.setTrafficEnabled(false);
                ib_traffic.setBackgroundResource(R.drawable.offtraffic);
                showInfo("關閉實時交通圖");
            }else{
                mBaiduMap.setTrafficEnabled(true);
                ib_traffic.setBackgroundResource(R.drawable.ontraffic);
                showInfo("開啟實時交通圖");
            }
            break;
        default:
            break;
        }
    }  
    @Override
    protected void onStart() {
        super.onStart();
        //開啟定位
        mBaiduMap.setMyLocationEnabled(true);
        if(!mLocationClient.isStarted()){
            mLocationClient.start();
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        //關閉定位
        mBaiduMap.setMyLocationEnabled(false);
        if(mLocationClient.isStarted()){
            mLocationClient.stop();
        }
    }
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理  
        mMapView.onDestroy();  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理  
        mMapView.onResume();  
    }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理  
        mMapView.onPause();  
    }
    //顯示消息
    private void showInfo(String str){
        Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
    }
    //自定義的定位監聽
    private class MyLocationListener implements BDLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location) {
            //將獲取的location信息給百度map
            MyLocationData data = new MyLocationData.Builder()  
                    .accuracy(location.getRadius())  
                    // 此處設置開發者獲取到的方向信息,順時針0-360  
                    .direction(100)
                    .latitude(location.getLatitude())  
                    .longitude(location.getLongitude())
                    .build();
            mBaiduMap.setMyLocationData(data);
            if(isFirstLocation){
                //獲取經緯度
                LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
                MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
                //mBaiduMap.setMapStatus(status);//直接到中間
                mBaiduMap.animateMapStatus(status);//動畫的方式到中間
                isFirstLocation = false;
                showInfo("位置:" + location.getAddrStr());
            }
        }

    }
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved