1. 程式人生 > >手把手教你實現百度基礎地圖+定位功能+設定中心點+新增Marker

手把手教你實現百度基礎地圖+定位功能+設定中心點+新增Marker

package com.demo.baidumapblog;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
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.BitmapDescriptorFactory;
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.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

import java.util.List;

public class ShowMapActivity extends AppCompatActivity {

    private MapView mMapView;

    private boolean isFirstLocation = true;

    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();
    private BaiduMap mBaiduMap;

    private double lat;
    private double lon;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
        //注意該方法要再setContentView方法之前實現
        //使用百度地圖的任何功能都需要先初始化這段程式碼  最好放在全域性中進行初始化
        //百度地圖+定位+marker比較簡單 我就不放到全域性去了
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_show_map);
        //獲取地圖控制元件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        //獲取BaiduMap物件
        mBaiduMap = mMapView.getMap();
        //宣告LocationClient類
        mLocationClient = new LocationClient(getApplicationContext());
        //註冊監聽函式
        mLocationClient.registerLocationListener(myListener);

        //配置定位引數
        initLocation();
        //開始定位
        mLocationClient.start();

    }


    /**
     * 新增marker
     */
    private void setMarker() {
        Log.v("pcw","setMarker : lat : "+ lat+" lon : " + lon);
        //定義Maker座標點
        LatLng point = new LatLng(lat, lon);
        //構建Marker圖示
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.location_marker);
        //構建MarkerOption,用於在地圖上新增Marker
        OverlayOptions option = new MarkerOptions()
                .position(point)
                .icon(bitmap);
        //在地圖上新增Marker,並顯示
        mBaiduMap.addOverlay(option);
    }

    /**
     * 設定中心點
     */
    private void setUserMapCenter() {
        Log.v("pcw","setUserMapCenter : lat : "+ lat+" lon : " + lon);
        LatLng cenpt = new LatLng(lat,lon);
        //定義地圖狀態
        MapStatus mMapStatus = new MapStatus.Builder()
                .target(cenpt)
                .zoom(18)
                .build();
        //定義MapStatusUpdate物件,以便描述地圖狀態將要發生的變化
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        //改變地圖狀態
        mBaiduMap.setMapStatus(mMapStatusUpdate);

    }

    /**
     * 配置定位引數
     */
    private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可選,預設高精度,設定定位模式,高精度,低功耗,僅裝置
        option.setCoorType("bd09ll");//可選,預設gcj02,設定返回的定位結果座標系
        int span=1000;
        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 {

        @Override
        public void onReceiveLocation(BDLocation location) {
            //Receive 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()); } } lat = location.getLatitude(); lon = location.getLongitude(); //這個判斷是為了防止每次定位都重新設定中心點和marker if(isFirstLocation){ isFirstLocation = false; setMarker(); setUserMapCenter(); } Log.v("pcw","lat : " + lat+" lon : " + lon); Log.i("BaiduLocationApiDem", sb.toString()); } } /** * 必須要實現 */ @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(); } }

2.設定中心點的程式碼:

相關推薦

手把手實現基礎地圖+定位功能+設定中心+新增Marker

package com.demo.baidumapblog; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bu

android studio 手把手搭建地圖

想做個百度地圖的demo,首先參考百度開發指南http://lbsyun.baidu.com/index.php?title=androidsdk,雖然寫的跟百度自己的demo配置不一樣,但還是可以勉強看看的。 首先是關於金鑰的申請,最新的key申請已經跟原來

手把手實現Android RecyclerView上拉載入功能

心靈雞湯:知之者不如好之者,好之者不如樂之者。 摘要 一直在用到RecyclerView時都會微微一顫,因為一直都沒去了解怎麼實現上拉載入,受夠了每次去Github找開源引入,因為感覺就為了一個上拉載入功能而去引入一大堆你不知道有多少BUG的程式碼,不僅增加了專案的冗

手把手入門MySQL零基礎入門教程!

手把手教你入門MySQL零基礎入門教程! 目前MySQL已經成為最為流行的開源關系數據庫系統,並且一步一步地占領了原有商業數據庫的市場。可以看到Google、Facebook、Yahoo、網易、久遊等大公司都在使用MySQL數據庫,甚至將其作為核心應用的數據庫系統。而My

手把手實現一個完整的BST(超級詳細)

查找樹 str image isempty 使用 this 根據 數據 false 查找基本分類如下: 線性表的查找 順序查找 折半查找 分塊查找 樹表的查找 二叉排序樹 平衡二叉樹 B樹 B+樹 散列表的查找 今天介紹二叉排序樹。 二叉排序樹 ( Binary

手把手實現電商網站開發》課程學習總結

選擇器 AR 進行 ron 需要 float 慕課 tex github 地址:http://www.imooc.com/learn/100 這是一個純HTML/CSS的教學視頻,沒有JS。 這個視頻課程的學習我已經接近尾聲了,我大概是17年11月開始觀看學習的吧,斷斷續

WebRTC系列(1)-手把手實現一個瀏覽器拍照室Demo

1.WebRTC開發背景   由於業務需求,需要在專案中實現實時音視訊通話功能,之前基於瀏覽器開發的Web專案要進行音視訊通話,需要安裝flash外掛才能實現或者使用C/S客戶端進行通訊。隨著網際網路技術的驅動下,在很多場景下需要進行音視訊通訊,在生活中我們現在使用電話越來越少,使用微信和視訊越來越多。在一

手把手實現一個 Vue 進度條組件!

內容 分享圖片 軟件 pen export padding eight 自己 自動完成 最近在個人的項目中,想對頁面之間跳轉的過程進行優化,想到了很多文檔或 npm 等都用到的頁面跳轉進度條,於是便想自己去實現一個,特此記錄。 來看下 npm 搜索組件時候的效果: so

手把手實現一個 Vue 進度條元件!

最近在個人的專案中,想對頁面之間跳轉的過程進行優化,想到了很多文件或 npm 等都用到的頁面跳轉進度條,於是便想自己去實現一個,特此記錄。 來看下 npm 搜尋元件時候的效果: so 下面咱們一起動手實現一下唄。 定義使用方式 想實現一個元件的前提,一定要想好你的需求是什麼,還要自己去定義一

手把手實現電商網站開發

1-1 電商網站開發課程概況 1-2 電商網站開發準備工作 1-3 電商網站首頁開發之頂部結構 1-4 電商網站開發之頂部細化 1-5 電商網站開發之導航欄(上) 1-6 電商網站開發之導航欄(下) 1-7 電商網站開發之Banner部分 1-8 電商網站開發之主列表左側 1-9 電商網站首頁

編寫搜索廣告過濾的chrome外掛

1 前言 目前百度搜索列表首頁裡,廣告5條正常內容是10條,而且廣告都是前1到5條的位置,與正常內容的顯示樣式無異。對於我們這樣有能力的開發者,其實可以簡單的實現一個chrome外掛,在百度搜索頁面裡執行一些我們自己的javascript,刪除掉這些廣告條目。 2 外掛簡介 Chrome外掛邏輯主體為兩部分組

手把手實現Java許可權管理系統 前端篇(十三):頁面許可權控制

許可權控制方案 既然是後臺許可權管理系統,當然少不了許可權控制啦,至於許可權控制,前端方面當然就是對頁面資源的訪問和操作控制啦。 前端資源許可權主要又分為兩個部分,即導航選單的檢視許可權和頁面增刪改操作按鈕的操作許可權。 我們的設計把頁面導航選單和頁面操作按鈕統一儲存在選單資料庫表中,選單表中包含以下許可權關

Java程式設計從0到1--手把手實現“HelloWorld!”

【宣告】歡迎轉載,但請保留文章原始出處→_→ Java秦學苦練博文的特點:通過“你問我答”的方式,促使你去思考一些小問題,比如:為什麼要安裝JDK?為什麼要配置環境變數?等問題。通過這種“你問我答”,帶你從不同的視角學習Java程式語言! 【正文】  Q&A(你問我答) Q:秦學苦練博主,你好!我

手把手實現Java許可權管理系統 後端篇(十三):系統備份還原

系統備份還原 在很多時候,我們需要系統資料進行備份還原。我們這裡就使用MySql的備份還原命令實現系統備份還原的功能。 新建工程 新建一個maven專案,並新增相關依賴,可以用Spring boot腳手架生成。 新建 kitty-bakcup 工程,這是一個獨立運行於後臺系統的應用程式,可以分開部署。 po

手把手實現一個引導動畫

前言 最近看了一些文章,知道了實現引導動畫的基本原理,所以決定來自己親手做一個通用的引導動畫類。 我們先來看一下具體的效果:點這裡 原理 通過維護一個Modal例項,使用Modal的mask來隱藏掉頁面的其他元素。 根據使用者傳入的需要引導的元素列表,依次來展示元素。展示元素的原理:通過cloneNode來

koa2+webpack4+React+pm2純手工架子搭建,SSR專案入門教程以及流程指引詳解:手把手實現服務端首屏渲染SSR專案

本人全職喵姐,兼職程式設計師,才疏學淺,大神如果有好的idea能指點迷津的話感激不盡。以下專案為純手工搭建的Webpack4+React+KOA2+PM2前端豆腐渣工程,房子的簡陋模型,入門教程以及流程指引。後續要精裝修還是蓋茅草屋看你自己了……/微微笑(自帶表情包)……先學習…...

手把手實現一個微信自動回復機器人

xposed use 分配 oba root 閑置 oot roc 動力 RebateBot 返利機器人 項目地址 項目描述 關鍵詞: 返利 微信 阿裏媽媽 機器人 跨平臺 返利機器人,基於微信建立機器人通道與用戶通過聊天快速生成返利鏈接 利用閑置微信和極小的電腦性能開啟

手把手實現一個微信自動回覆機器人

RebateBot 返利機器人 專案地址 專案描述 關鍵詞: 返利 微信 阿里媽媽 機器人 跨平臺 返利機器人,基於微信建立機器人通道與使用者通過聊天快速生成返利連結 利用閒置微信和極小的電腦效能開啟24小時無人輪值返利機器人 購物只需要傳送連結給機器人,機器人能馬上給你回覆優惠價格及連結

手把手實現一個視覺化爬蟲監控系統,酷炫的圖形化介面

1. 前言 本文並不是講解爬蟲的相關技術實現的,而是從實用性的角度,將抓取並存入 MongoDB 的資料 用 InfluxDB 進行處理,而後又通過 Grafana 將爬蟲抓取資料情況通過酷炫的圖形化介面展示出來。 在開始之前,先對 Grafana 和 InfluxDB 做一下簡要的介紹:

手把手實現一個modal對話方塊

需求: 1、點選一個按鈕彈出對話方塊 2、對話方塊的事件能夠被父元件捕捉 3、對話方塊裡的內容能夠隨時改變 一、如何實現一個對話方塊 1.1 建立一個簡單的對話方塊     簡而言之,一個簡單的對話方塊就是一個div(也可能是幾個div),怎麼建立呢? func