1. 程式人生 > >Android百度地圖開發學習筆記(二)之定位當前位置和自定義控制元件返回

Android百度地圖開發學習筆記(二)之定位當前位置和自定義控制元件返回

在完成HelloMap後,接來完成的重要功能是如何定位當前位置和如何一鍵返回。效果圖如下:


這裡的控制元件就是一個ImageView,自己去百度一個好看的圖片就可以了。

一 定位當前位置和自定義控制元件返回

1.官方技術文件

可以先點選百度地圖定位技術文件,仔細看一下相關函式呼叫方法。對於新手開發和用最新版sdk的幫助很大。我們之前就是按照網上之前舊版本開發的,直接看直接去用踩過很多坑。看完官方的技術文件在看下面的activity程式介紹。

2.個人開發過程

看一下我的MapActivity程式,相關的註釋已給出。

import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.yanis.yc_ui_fragment_tabhost.R.id;



public class MapActivity extends Activity {
	

    private BitmapDescriptor currentMarker = null;
    private MyLocationConfiguration.LocationMode currentMode;
    private ImageView iv_location;

	
    MapView mMapView = null;  
    public static final String TAG="mian";
    StringBuffer sb = new StringBuffer(256);
    public StringBuilder builder=new StringBuilder();
    
    boolean isOpenLocation=false;
    private BaiduMap mBaiduMap;
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();

    private boolean isFirstLocation = true;
    private double lat;  
    private double lon;

    private BDLocation mCurrentLocation;
		  
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.app_map);
     
          
        mMapView = (MapView) findViewById(R.id.bmapView); 
        mBaiduMap = mMapView.getMap();
        // 刪除百度地圖LoGo  
        mMapView.removeViewAt(1);  
              
     	   
        mLocationClient = new LocationClient(getApplicationContext());     //宣告LocationClient類
        mLocationClient.registerLocationListener( myListener );    //註冊監聽函式
        
              
        initView();//ImageView初始化
        initLocation();//配置定位SDK引數
            
        mLocationClient.start(); 
        
        mBaiduMap.setMyLocationEnabled(true); 
        currentMode = MyLocationConfiguration.LocationMode.NORMAL;//NORMAL為正常模式  FOLLOWING為跟隨模式  COMPASS為羅盤模式
        mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
					currentMode, true, currentMarker));
        
         		
    }
    
    private void initView() {
		
		iv_location = (ImageView) findViewById(R.id.iv_location);
			
		iv_location.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (mCurrentLocation != null) {
					LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
					MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);
					mBaiduMap.animateMapStatus(mapStatusUpdate, 1000);
				}

			}
		});
					
	}
	  
	private void initLocation(){
		
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);//可選,預設高精度,設定定位模式,高精度,低功耗,僅裝置
        option.setCoorType("bd09ll");//可選,預設gcj02,設定返回的定位結果座標系
        int span=0;
        option.setScanSpan(span);//可選,預設0,即僅定位一次,設定發起定位請求的間隔需要大於等於1000ms才是有效的
        option.setIsNeedAddress(true);//可選,設定是否需要地址資訊,預設不需要
        option.setOpenGps(true);//可選,預設false,設定是否使用gps
        option.setLocationNotify(true);//可選,預設false,設定是否當gps有效時按照1S1次頻率輸出GPS結果
        option.setIsNeedLocationDescribe(true);//可選,預設false,設定是否需要位置語義化結果,可以在BDLocation.getLocationDescribe裡得到,結果類似於“在北京天安門附近”
        option.setIsNeedLocationPoiList(true);//可選,預設false,設定是否需要POI結果,可以在BDLocation.getPoiList裡得到
        option.setIgnoreKillProcess(false);//可選,預設true,定位SDK內部是一個SERVICE,並放到了獨立程序,設定是否在stop的時候殺死這個程序,預設不殺死  
        option.SetIgnoreCacheException(false);//可選,預設false,設定是否收集CRASH資訊,預設收集
        option.setEnableSimulateGps(false);//可選,預設false,設定是否需要過濾gps模擬結果,預設需要
        mLocationClient.setLocOption(option);
    }

    public class MyLocationListener implements BDLocationListener {  
    	  
        private float radius;

		@Override  
        public void onReceiveLocation(BDLocation location) {  
            StringBuffer sb = new StringBuffer(256);  
         //   sb.append("time : ");  
         //   sb.append(location.getTime());  
         //   sb.append("\nerror code : ");  
         //   sb.append(location.getLocType());  
         //   sb.append("\nlatitude : ");  
         //   sb.append(location.getLatitude());  
         //   sb.append("\nlontitude : ");  
         //   sb.append(location.getLongitude());  
         //  sb.append("\nradius : ");  
         //   sb.append(location.getRadius());  
            
            if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位結果  
                sb.append("\nspeed : ");  
                sb.append(location.getSpeed());// 單位:公里每小時  
                sb.append("\nsatellite : ");  
                sb.append(location.getSatelliteNumber());  
                sb.append("\nheight : ");  
                sb.append(location.getAltitude());// 單位:米  
                sb.append("\ndirection : ");  
                sb.append(location.getDirection());// 單位度  
                sb.append("\naddr : ");  
                sb.append(location.getAddrStr());  
                sb.append("\ndescribe : ");  
                sb.append("gps定位成功");  
  
            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網路定位結果  
               // sb.append("\naddr : ");  
                sb.append(location.getAddrStr());  
                //運營商資訊  
              //  sb.append("\noperationers : ");  
              // sb.append(location.getOperators());  
              //  sb.append("\ndescribe : ");  
              //  sb.append("網路定位成功");  
            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果  
                sb.append("\ndescribe : ");  
                sb.append("離線定位成功,離線定位結果也是有效的");  
            } else if (location.getLocType() == BDLocation.TypeServerError) {  
                sb.append("\ndescribe : ");  
                sb.append("服務端網路定位失敗,可以反饋IMEI號和大體定位時間到
[email protected]
,會有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("\ndescribe : "); sb.append("網路不同導致定位失敗,請檢查網路是否通暢"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("\ndescribe : "); sb.append("無法獲取有效定位依據導致定位失敗,一般是由於手機的原因,處於飛航模式下一般會造成這種結果,可以試著重啟手機"); } sb.append("\nlocationdescribe : "); sb.append(location.getLocationDescribe());// 位置語義化資訊 List<Poi> list = location.getPoiList();// POI資料 if (list != null) { sb.append("\npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("\npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } mCurrentLocation = location; radius = location.getRadius(); lat = location.getLatitude(); //當前的經緯度 lon = location.getLongitude(); if(isFirstLocation){ // 構造定位資料 MyLocationData locData = new MyLocationData.Builder() .accuracy(radius) .latitude(lat) .longitude(lon) .build(); // 設定定位資料 mBaiduMap.setMyLocationData(locData); LatLng ll = new LatLng(lat, lon); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(msu); // //定義地圖狀態 MapStatus mMapStatus = new MapStatus.Builder() .target(ll) .zoom(18) //自定義定位後地圖顯示的縮放比例 .build(); //定義MapStatusUpdate物件,以便描述地圖狀態將要發生的變化 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus); //改變地圖狀態 mBaiduMap.setMapStatus(mMapStatusUpdate); } } } @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(); } }
 在執行程式之前,我們還必須在AndroidManifest.xml進行相關配置和許可權的宣告        在application標籤中宣告定位service元件
 <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >

附上網路上關於百度地圖定位原理

使用百度Android定位SDK必須註冊GPS和網路使用許可權。定位SDK採用GPS、基站、Wi-Fi訊號進行定位。當應用程式向定位SDK發起定位請求時,定位SDK會根據應用的定位因素(GPS、基站、Wi-Fi訊號)的實際情況(如是否開啟GPS、是否連線網路、是否有訊號等)來生成相應定位依據進行定位。
使用者可以設定滿足自身需求的定位依據:
若使用者設定GPS優先,則優先使用GPS進行定位,如果GPS定位未開啟或者沒有可用位置資訊,且網路連線正常,定位SDK則會返回網路定位(即Wi-Fi與基站)的最優結果。為了使獲得的網路定位結果更加精確,請開啟手機的Wi-Fi開關。



相關推薦

Android地圖開發學習筆記定位當前位置定義控制元件返回

在完成HelloMap後,接來完成的重要功能是如何定位當前位置和如何一鍵返回。效果圖如下: 這裡的控制元件就是一個ImageView,自己去百度一個好看的圖片就可以了。 一 定位當前位置和自定義控制元件返回 1.官方技術文件 可以先點選百度地圖定位技術文件,仔細看一下相關

地圖API學習筆記

com.baidu.mapapi.map.GroundOverlay,定義在地圖上繪製一個 Ground 覆蓋物,繼承自com.baidu.mapapi.map.Overlay 欄位概要 從類繼承的欄位 com.baidu.mapapi.map.Overlay 方法概要

安卓開發學習筆記Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx

編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:

Linux開發學習筆記

Shell程式設計 1、簡單介紹 Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式。Shell 程式設計跟 java、php 程式設計一樣,只要有一個能編寫程式碼的文字編輯器和一個能解釋執行的指令碼直譯器就可以了。簡單地講,shell程式設計就是對一

自動化構建Android專案 ---- Jenkins自動化部署學習筆記

  上篇文章跟大家分享了在Windows上安裝Jenkins的方法,這篇文章來跟大家分享一下利用Jenkins自動化構建Android專案: 一、所需準備: Android專案上傳至版本管理平臺,這裡我準備了Github上的Android專案https://github.co

GTK+圖形化應用程式開發學習筆記—Glib庫1

 在學習GTK+之前我們需要先學習一下 glib的有關知識。因為我們將會在以後的學習中遇到這些知識。由於本筆記不是專門介紹glib的,所以下面的介紹不會太詳細。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft

Windows Phone 開發學習筆記 Hello Windows Phone不費功夫

現在這個時代,各種技術層出不窮。很長一段時間裡,在開發程式時我首先是搜尋功能相近的例程,以它為基礎,修改實現自己的功能。可這樣只解決一時問題,一旦需要擴充套件功能或者程式出現問題,解決起來毫無頭緒。慢慢意識到基礎的重要,也想仔細讀讀書。可每部書都特別厚,字典一樣,從頭到尾讀

iOS開發學習筆記 -- 動態新增控制元件事件處理

剛開始學iOS開發的時候,經常要跟interface builder打交道,乍一看拖控制元件是挺方便的,跟以前做C#開發類似,但是Xcode比較噁心的一點是,拖完控制元件之後,還得手動地在Connections Inspector中繫結控制元件和變數的關係,事件的繫結也在這

IO流學習筆記BufferedWriter與BufferedReader及例項Demo

在之前的學習筆記(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter與FileReader的Demo使用的中轉資料buf實際就是緩衝區,是由我們自己建立的。 緩衝區可以提高效率,Java對緩衝區進行了封裝,封裝成了物

Servlet學習筆記Servlet路徑對映配置、Servlet介面、ServletConfig、ServletContext

Servlet路徑對映配置 要使Servlet物件正常的執行,需要進行適當的配置,以告訴Web容器哪個請求呼叫哪個Servlet物件處理,對Servlet起到一個註冊的作用。Servlet的配置資訊包含在web.xml檔案中,主要通過兩步進行配置: (1)宣告Servlet物件 通過< servlet&

mybatis學習筆記XML方式的基本用法

在前一篇筆記中,我們建立了配置 mybatis-config.xml 檔案,原來 mappers標籤下的內容為: <mappers> <mapper resource="tk/mybatis/simple/mapper/CountryMa

A-GPS學習筆記 SUPL

1. GNSS GNSS的全稱是全球導航衛星系統(Global Navigation Satellite System),它是泛指所有的衛星導航系統,包括全球的、區域的和增強的,如美國的GPS、俄羅斯的Glonass、歐洲的Galileo、中國的北斗衛星導航系統,以及相關的增強系統,如美國的WAAS(廣域增

java 併發程式設計學習筆記 基礎框架搭建併發模擬工具,程式碼

                                基礎框架搭建和併發模擬工具,程式碼 (1)基礎框架搭建 (2)併發模擬 (3)CountDownLatch  通常用來 保證 幾個執行緒執行完成之後,再執行其他的程式碼 Semaphore

ElasticSearch學習筆記IK分詞器拼音分詞器的安裝

ElasticSearch是自帶分詞器的,但是自帶的分詞器一般就只能對英文分詞,對英文的分詞只要識別空格就好了,還是很好做的(ES的這個分詞器和Lucene的分詞器很想,是不是直接使用Lucene的就不知道),自帶的分詞器對於中文就只能分成一個字一個字,這個顯然

TensorFlow學習筆記視覺化(Tensorboard

一、Tensorboard簡介 Tensorboard是TensorFlow自帶的一個強大的視覺化工具,也是一個web應用程式套件。通過將tensorflow程式輸出的日誌檔案的資訊視覺化使得tensorflow程式的理解、除錯和優化更加簡單高效。支援其七種視

oracle資料庫學習筆記分組統計查詢

統計函式(分組函式) 在oracle裡面對於統計函式提供有很多種,下面主要介紹標準的五個統計函式: - 統計表中的資料量:COUNT(*  |  欄位  |  DISTINCT 欄位) - 統計平均值: AVG(列) - 求和:SUM(列) - 最大值 :MAX(列) -

pelican學習筆記Writing content

Writing content 2018/01/25 Articles and pages 文章和頁面 Pelican 認為 “文章(articles)” 是按時間順序排列的內容, 如部落格上的帖子, 因此與日期相關。 “頁面(pages)”

多執行緒學習筆記執行緒安全問題

執行緒安全問題的現象 首先讓我們考慮一個問題: class Demo implements Runnable{ private int num = 100; //實現Runnable介面,覆蓋run方法 public void r

OSG學習筆記OSG靜態庫的使用

OSG是以外掛的方式管理,因此要使用OSG的某個格式的解析不僅要有其相關lib還必須將相關外掛引入,下面通過一個簡單的例子加以說明。 OSG相關外掛引入使用USE_OSGPLUGIN,例如: USE_OSGPLUGIN(ive) USE_OSGPLUGIN(osg) US

MongoDB 學習筆記 查詢

最簡單的查詢 個人認為mongoDB是面向物件的吧。 例如最簡單的查詢  整個資料集只有三條資料 第一查詢姓名為張三的  資料 查詢的條件比較好寫 隨意   db.collection.find(查詢條件)   例如 15 得到的結果是這樣  如果你不