Android百度地圖(二):百度地圖sdk顯示位置點(diǎn)权纤、圖層繪制

轉(zhuǎn)載勤篮、引用請(qǐng)標(biāo)明出處
http://www.reibang.com/p/fdd1ba783495
本文出自zhh_happig的簡書博客,謝謝

Android百度地圖(一):百度地圖定位sdk 類方法參數(shù)臂外、定位原理詳細(xì)介紹
Android百度地圖(三):百度地圖畫運(yùn)動(dòng)軌跡及圖層點(diǎn)擊事件處理
Android百度地圖(四):百度地圖運(yùn)動(dòng)軌跡糾偏、去噪喇颁、綁路之百度鷹眼sdk服務(wù)
Android百度地圖(五):百度地圖鷹眼sdk監(jiān)控進(jìn)出地理圍欄(區(qū)域)
Android百度地圖(六):百度地圖POI檢索漏健,行政區(qū)邊界、公交橘霎、線路規(guī)劃查詢蔫浆,地理編碼介紹

上一篇文章介紹定位sdk 類方法參數(shù)、定位原理茎毁,講述了如何利用定位sdk進(jìn)行定位克懊。這篇文章將講解如何顯示定位位置和繪制圖層,以及地圖相關(guān)api的講解七蜘。

一 百度地圖sdk介紹

通過定位sdk獲取的BDLocation類中包含了當(dāng)前位置的:經(jīng)緯度谭溉,省、市橡卤、區(qū)扮念、街道等地址信息。如果應(yīng)用只需要獲取用戶當(dāng)前位置所在的市碧库、縣柜与、區(qū)等信息巧勤,那么定位sdk就可以滿足你的需求。如果要具體顯示位置在哪弄匕,除了通過定位sdk獲取經(jīng)緯度之外颅悉,還需要通過百度地圖來顯示。

百度地圖sdk提供了Mapview迁匠、BaiduMap剩瓶、OverlayOptions、Overlay等api城丧,用于地圖的操作與圖層繪制延曙。

MapView就是一張圖,就是一個(gè)View亡哄,它不會(huì)產(chǎn)生位置枝缔。

定位sdk能獲取經(jīng)緯度,相當(dāng)于x蚊惯、y坐標(biāo)愿卸;地圖根據(jù)坐標(biāo)找到對(duì)應(yīng)的點(diǎn),在地圖圖層上畫一個(gè)圖標(biāo)標(biāo)識(shí)拣挪,這就是我們?cè)诘貓D上看到的定位


地圖+定位位置

了解這些擦酌,如何在地圖上顯示出定位點(diǎn)就簡單了,我們需要地圖與位置菠劝。

二 百度地圖與定位sdk的結(jié)合使用

1.初始化地圖

//偽代碼
// 地圖初始化
MapView mMapView = (MapView) findViewById(R.id.bmapView);
BaiduMap mBaiduMap = mMapView.getMap();//獲取地圖實(shí)例
// 開啟定位圖層赊舶,一定不要少了這句,否則對(duì)在地圖的設(shè)置赶诊、繪制定位點(diǎn)將無效
mBaiduMap.setMyLocationEnabled(true);

這樣地圖就獲取到了笼平,接著對(duì)定位圖標(biāo)進(jìn)行配置,非常簡單舔痪,一句代碼寓调。也可以不配置,百度會(huì)用默認(rèn)的圖標(biāo)

/**
* 對(duì)定位的圖標(biāo)進(jìn)行配置锄码,需要MyLocationConfiguration實(shí)例夺英,這個(gè)類是用設(shè)置定位圖標(biāo)的顯示方式的
 */
mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(locationMode, true, bitmapDescriptor));

MyLocationConfiguration有2個(gè)構(gòu)造方法

new MyLocationConfiguration(LocationMode lm, boolean direction, BitmapDescriptor bd);
new MyLocationConfiguration(LocationMode lm, boolean direction, BitmapDescriptor bd,int fillColor,int strokeColor);

LocationMode:圖標(biāo)類型
有三種:
LocationMode.NORMAL:普通


普通圖標(biāo):圓點(diǎn),不顯示方向滋捶;地圖方位固定痛悯,上北下南左西右東

LocationMode.FOLLOWING:跟隨


跟隨圖標(biāo):地圖方位固定,上北下南左西右東重窟;箭頭轉(zhuǎn)動(dòng)载萌,箭頭表示手機(jī)頭部所朝的方向,

LocationMode.COMPASS:羅盤
羅盤圖標(biāo):地圖會(huì)隨方向轉(zhuǎn)動(dòng),有指南針的方向標(biāo)識(shí)扭仁;可觀察箭頭方向偏離北的情況

direction:是否允許顯示方向信息垮衷,如果設(shè)置為false,則圖標(biāo)任何情況下都不會(huì)有箭頭

BitmapDescriptor:用戶自定義定位圖標(biāo)乖坠,可以更換定位圖標(biāo)樣式

fillColor:精度圈填充顏色(半徑等于location.getRadius())
strokeColor:精度圈邊框顏色
如果不想要這個(gè)精度圈搀突,使用location.getRadius() = 0;

3.定位sdk初始化

// 定位初始化
LocationClient mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);//注冊(cè)定位位置監(jiān)聽回調(diào)
LocationClientOption option = new LocationClientOption();//定位方式參數(shù)設(shè)置
option.setOpenGps(true); // 打開gps
option.setCoorType("bd09ll"); // 設(shè)置坐標(biāo)類型
option.setScanSpan(1000);//周期性請(qǐng)求定位瓤帚,1秒返回一次位置
mLocClient.setLocOption(option);//參數(shù)設(shè)置
mLocClient.start();//開始定位

定位sdk更多api詳解請(qǐng)閱讀百度地圖(一):百度地圖定位sdk 類方法參數(shù)描姚、定位原理詳細(xì)介紹

4.位置監(jiān)聽回調(diào)

//偽代碼
public class MyLocationListenner implements BDLocationListener {

    @Override
    public void onReceiveLocation(BDLocation location) {
        //定位位置回調(diào)
        /**
        * MyLocationData 定位數(shù)據(jù)類,地圖上的定位位置需要經(jīng)緯度戈次、精度、方向這幾個(gè)參數(shù)筒扒,所以這里我們把這個(gè)幾個(gè)參數(shù)傳給地圖
        * 如果不需要要精度圈怯邪,推薦builder.accuracy(0);
        * mCurrentDirection 是通過手機(jī)方向傳感器獲取的方向;也可以設(shè)置option.setNeedDeviceDirect(true)獲取location.getDirection()花墩,
          但是這不會(huì)時(shí)時(shí)更新位置的方向悬秉,因?yàn)橹芷谛哉?qǐng)求定位有時(shí)間間隔。
        * location.getLatitude()和location.getLongitude()經(jīng)緯度冰蘑,如果你只需要在地圖上顯示某個(gè)固定的位置和泌,完全可以寫入固定的值,
          如緯度36.958454祠肥,經(jīng)度114.137588武氓,這樣就不要要同過定位sdk來獲取位置了
        */
        MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
        .direction(mCurrentDirection).latitude(location.getLatitude()).longitude(location.getLongitude()).build();

        mBaiduMap.setMyLocationData(locData);//給地圖設(shè)置定位數(shù)據(jù),這樣地圖就顯示位置了

        /**
        *當(dāng)首次定位時(shí)仇箱,記得要放大地圖县恕,便于觀察具體的位置
        * LatLng是縮放的中心點(diǎn),這里注意一定要和上面設(shè)置給地圖的經(jīng)緯度一致剂桥;
        * MapStatus.Builder 地圖狀態(tài)構(gòu)造器
        */
        if (isFirstLoc) {
            isFirstLoc = false;
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
            MapStatus.Builder builder = new MapStatus.Builder();
            //設(shè)置縮放中心點(diǎn)忠烛;縮放比例;
            builder.target(ll).zoom(18.0f);
           //給地圖設(shè)置狀態(tài)
            mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
        }
    }
}

5.繪制圖層

/**
* 繪制Marker权逗,地圖上常見的類似氣球形狀的圖層
*/
MarkerOptions markerOptions = new MarkerOptions();//參數(shù)設(shè)置類
markerOptions.position(latLng);//marker坐標(biāo)位置
markerOptions.icon(icon);//marker圖標(biāo)美尸,可以自定義
markerOptions.draggable(false);//是否可拖拽,默認(rèn)不可拖拽
markerOptions.anchor(0.5f, 1.0f);//設(shè)置 marker覆蓋物與位置點(diǎn)的位置關(guān)系斟薇,默認(rèn)(0.5f, 1.0f)水平居中师坎,垂直下對(duì)齊
markerOptions.alpha(0.8f);//marker圖標(biāo)透明度,0~1.0奔垦,默認(rèn)為1.0
markerOptions.animateType(MarkerAnimateType.drop);//marker出現(xiàn)的方式屹耐,從天上掉下
markerOptions.flat(false);//marker突變是否平貼地面
markerOptions.zIndex(1);//index

//Marker動(dòng)畫效果
markerOptions.icons(bitmapList);//如果需要顯示動(dòng)畫,可以設(shè)置多張圖片輪番顯示
markerOptions.period(10);//每個(gè)10ms顯示bitmapList里面的圖片
...
mMarker = (Marker) mBaiduMap.addOverlay(markerOptions);//在地圖上增加mMarker圖層

/**
* 繪制折線
*/
PolylineOptions polylineOptions= new PolylineOptions();//參數(shù)設(shè)置類
polylineOptions.width(10);//寬度,單位:像素
polylineOptions.color(0xAAFF0000);//設(shè)置折線顏色
polylineOptions.points(points);//折線頂點(diǎn)坐標(biāo)集

/**
* colorValue:List<Integer>,折線顏色集合
* 如果這里設(shè)置了折現(xiàn)顏色集合惶岭,那么options.color()中設(shè)置的顏色會(huì)被覆蓋
* 例:5個(gè)點(diǎn)能畫出4條線段寿弱,每條線段繪制時(shí)按照索引依次取值,
  如果顏色個(gè)數(shù)小于線段個(gè)數(shù)按灶,剩余線段取最后一個(gè)顏色繪制
*/
polylineOptions.colorsValues(colorValue);
polylineOptions.dottedLine(false);//是否是虛線症革,默認(rèn)為false
polylineOptions.zIndex(9);//index
polylineOptions.visible(true);//是否可見,默認(rèn)可見
polylineOptions.extraInfo(bundle);//附加bundle

/**
* 設(shè)置線段紋理樣式鸯旁,所以折線紋理樣式是可以自己定義的
* textureList:折現(xiàn)紋理樣式集合 
* textureIndexs:折線紋理索引噪矛,繪制時(shí)按照索引從textureList里面取樣式,
  如下面代碼中铺罢,0和1就是textureList的索引艇挨,這樣就會(huì)先取a再取b,
  如果textureIndexs.add(1)然后再textureIndexs.add(0)就先取b再取a了韭赘,
  所以textureIndexs里面的值不能亂加缩滨,應(yīng)該是小于等于textureList個(gè)數(shù)的值,不然就出錯(cuò)了泉瞻。
*/
List<BitmapDescriptor> textureList = new ArrayList<BitmapDescriptor>();
textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.a));
textureList.add(BitmapDescriptorFactory.fromResource(R.drawable.b));
polylineOptions.customTextureList(textureList);//設(shè)置折現(xiàn)紋理樣式
List<Integer> textureIndexs = new ArrayList<Integer>();
textureIndexs.add(0);
textureIndexs.add(1);
polylineOptions.textureIndex(textureIndexs);
...
mPolyline = (Polyline) mBaiduMap.addOverlay(polylineOptions);//在地圖上增加mPolyline圖層

/**
* 繪制多邊形
*/
PolygonOptions polygonOptions = new PolygonOptions();
polygonOptions.points(pts);//多邊形頂點(diǎn)坐標(biāo)集
polygonOptions.stroke(new Stroke(5, 0xAA00FF00));//邊框樣式
polygonOptions.fillColor(0xAAFFFF00);//填充顏色
mPolygon = mBaiduMap.addOverlay(polygonOptions);//在地圖上增加mPolygon 圖層

/**
* 繪制圓形
*/
OverlayOptions oCircle = new CircleOptions().fillColor(0x000000FF)
                .center(latLngCircle).stroke(new Stroke(5, 0xAA000000))
                .radius(1400);
mBaiduMap.addOverlay(oCircle);

/**
* 繪制弧形
*/
OverlayOptions oArc = new ArcOptions().color(0xAA00FF00).width(4)
                .points(p1, p2, p3);//三點(diǎn)繪制一個(gè)弧形
mBaiduMap.addOverlay(oArc);

/**
* 繪制文本文字
*/
OverlayOptions ooText = new TextOptions().bgColor(0xAAFFFF00)
                .fontSize(24).fontColor(0xFFFF00FF).text("文字內(nèi)容").rotate(-30)
                .position(latLngText);
mBaiduMap.addOverlay(ooText);

6.地圖關(guān)鍵api介紹

//是將地理坐標(biāo)轉(zhuǎn)換為屏幕上的坐標(biāo)脉漏,其中point.y是地理位置點(diǎn)相對(duì)于MapView左上角的y軸坐標(biāo)。
Point point = mBaiduMap.getProjection().toScreenLocation(latLng);

//截圖
mBaiduMap.snapshot(new SnapshotReadyCallback() {
    @Override
    public void onSnapshotReady(Bitmap arg0) {

    }
});

//截圖袖牙, Rect指定區(qū)域
mBaiduMap.snapshotScope(new Rect(), new SnapshotReadyCallback() {
    @Override
    public void onSnapshotReady(Bitmap arg0) {

    }
});

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);//設(shè)置地圖類型侧巨,衛(wèi)星地圖

mBaiduMap.clear();//清空地圖所有的 Overlay 覆蓋物以及 InfoWindow

//Overlay所有圖層父類
mOverlay.setVisible(true);//設(shè)置圖層是否可見
mOverlay.remove();//刪除該圖層,只刪除這一個(gè)鞭达;mBaiduMap.clear()會(huì)把所有的圖層清空司忱,這有時(shí)候不是我們需要看到。

更多百度地圖api會(huì)在后續(xù)文章中介紹

7.地圖事件監(jiān)聽

// 點(diǎn)擊Marker事件響應(yīng)
mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        if(marker.getZIndex() == mMarker.getZIndex()){//判斷是哪個(gè)marker
            //獲取mMarker的信息
        }
        return false;
    }
});

// Marker拖拽事件響應(yīng)
mBaiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {      
    @Override
    public void onMarkerDragStart(Marker arg0) {
        //拖拽開始
    }
            
    @Override
    public void onMarkerDragEnd(Marker arg0) {
        //拖拽結(jié)束  
    }
            
    @Override
    public void onMarkerDrag(Marker arg0) {
        //拖拽中
    }
});

// 點(diǎn)擊Polyline事件響應(yīng)
mBaiduMap.setOnPolylineClickListener(new BaiduMap.OnPolylineClickListener() {
    @Override
    public boolean onPolylineClick(Polyline polyline) {      
        if(polyline.getZIndex() == mPolyline.getZIndex()){//判斷是哪個(gè)mPolyline
                mPolyline.getPoints();//獲取折線點(diǎn)集合
                mPolyline.getExtraInfo();//獲取附加的信息
                ...
        }
        return false;
    }
});

//地圖點(diǎn)擊事件響應(yīng)
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng latLng) {
        //點(diǎn)擊地圖某個(gè)位置獲取經(jīng)緯度latLng.latitude碉怔、latLng.longitude
    }

    @Override
    public boolean onMapPoiClick(MapPoi mapPoi) {
        //點(diǎn)擊地圖上的poi圖標(biāo)獲取描述信息:mapPoi.getName()烘贴,經(jīng)緯度:mapPoi.getPosition()
        return false;
    }
});

//地圖加載完成事件響應(yīng)
mBaiduMap.setOnMapLoadedCallback(new OnMapLoadedCallback() {
    @Override
    public void onMapLoaded() {
        //地圖的有些操作需要再加載完成之后進(jìn)行
    }
});

//地圖中心、縮放狀態(tài)改變事件響應(yīng)
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
    @Override
    public void onMapStatusChangeStart(MapStatus status) {
        //開始
    }
            
    @Override
    public void onMapStatusChangeFinish(MapStatus status) {//完成
        status.target;//當(dāng)前中心點(diǎn)
        status.zoom;//當(dāng)前縮放比例
        ...
    }
            
    @Override
    public void onMapStatusChange(MapStatus status) {
                
    }
});

//地圖定位圖標(biāo)點(diǎn)擊響應(yīng)事件
mBaiduMap.setOnMyLocationClickListener(new OnMyLocationClickListener() {
    @Override
    public boolean onMyLocationClick() {
        ...
        return false;
    }
});

地圖響應(yīng)事件還有很多撮胧,不一一列舉了桨踪,想了解更多,閱讀api就可以了芹啥,比較簡單锻离,難的是如何將這些結(jié)合起來實(shí)現(xiàn)功能,后續(xù)文章將會(huì)講到墓怀。

退出時(shí)記得釋放資源

//偽代碼
protected void onDestroy() {
    // 退出時(shí)銷毀定位
    mLocClient.unRegisterLocationListener(myListener);
    mLocClient.stop();
    // 關(guān)閉定位圖層
    mBaiduMap.setMyLocationEnabled(false);
    mBaiduMap.clear();
    mMapView.onDestroy();
    mMapView = null;
}

到這里汽纠,百度地圖sdk就介紹了,還是很簡單的傀履,更多api會(huì)在后續(xù)文章中講解虱朵。

如果各位看官覺得文章不錯(cuò),別忘了點(diǎn)個(gè)喜歡。
源碼下載地址

以上文章內(nèi)容碴犬,是本人工作中的總結(jié)絮宁,供大家參考,有誤的地方還請(qǐng)指正服协。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绍昂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子偿荷,更是在濱河造成了極大的恐慌窘游,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跳纳,死亡現(xiàn)場離奇詭異忍饰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棒旗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門喘批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铣揉,你說我怎么就攤上這事〔筒埽” “怎么了逛拱?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長台猴。 經(jīng)常有香客問我朽合,道長,這世上最難降的妖魔是什么饱狂? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任曹步,我火速辦了婚禮,結(jié)果婚禮上休讳,老公的妹妹穿的比我還像新娘讲婚。我一直安慰自己,他們只是感情好俊柔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布筹麸。 她就那樣靜靜地躺著,像睡著了一般雏婶。 火紅的嫁衣襯著肌膚如雪物赶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天留晚,我揣著相機(jī)與錄音酵紫,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奖地,可吹牛的內(nèi)容都是我干的橄唬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鹉动,長吁一口氣:“原來是場噩夢啊……” “哼轧坎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泽示,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤缸血,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后械筛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捎泻,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年埋哟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笆豁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赤赊,死狀恐怖闯狱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抛计,我是刑警寧澤哄孤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吹截,受9級(jí)特大地震影響瘦陈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜波俄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一晨逝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懦铺,春花似錦捉貌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刘急,卻和暖如春棚菊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叔汁。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工统求, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留检碗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓码邻,卻偏偏與公主長得像折剃,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子像屋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容