轉(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:普通
LocationMode.FOLLOWING:跟隨
LocationMode.COMPASS:羅盤
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)指正服协。