百度地图 sdk 使用小结(行动轨迹)
最近把之前的地圖代碼再看了一遍,想借此機會小結(jié)一番,下面是效果圖,點沒取好,湊合看吧。
這里做的是一個地圖上的行為軌跡,包含各個點的覆蓋物以及路線繪制,需要用到百度地圖定位 SDK,具體如何引入百度地圖的 SDK 就不過講了,下面給出官網(wǎng)說明文檔:
https://lbsyun.baidu.com/index.php?title=androidsdk
下面詳細講講具體如何使用百度地圖,直至畫出我們要的行為軌跡。
初始化設(shè)置
第一步,先在 XML 中放入地圖控件:
<com.baidu.mapapi.map.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"/>在使用到的地方使用 Application 去初始化 SDK,也可以在 Application 中初始化
static {//需要使用全局context初始化SDKInitializer.initialize(IfireApplication.getGobalApplication());}下面是定位的一些參數(shù):
// 定位相關(guān)MapView mMapView; //地圖 viewBaiduMap mBaiduMap; //地圖Polyline mPolyline; //線LocationClient mLocationClient; //定位List<LatLng> latLngs = new ArrayList<>(); //位置軌跡List<BitmapDescriptor> bitmapDesList = new ArrayList<>(); //位置在地圖的覆蓋物初始化地圖,并通過定位 SDK 獲取位置信息,這里可以獲得很多參數(shù)不多說了。
private void setupMap() {// 地圖初始化mMapView = findViewById(R.id.map);mBaiduMap = mMapView.getMap();// 開啟定位圖層mBaiduMap.setMyLocationEnabled(true);//設(shè)置定位相關(guān)initLocation();//請求軌跡數(shù)據(jù)mPresenter.load();}private LatLng nowLocation;private void initLocation() {mLocationClient = new LocationClient(getApplication());LocationClientOption option = new LocationClientOption();//定位方式參數(shù)設(shè)置option.setOpenGps(true); // 打開gpsoption.setCoorType("bd09ll"); // 設(shè)置坐標(biāo)類型option.setScanSpan(1000);//周期性請求定位,1秒返回一次位置mLocationClient.setLocOption(option);//參數(shù)設(shè)置mLocationClient.registerLocationListener(new BDAbstractLocationListener() {@Overridepublic void onReceiveLocation(BDLocation location) {MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius()).direction(location.getDirection()).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(locData);//給地圖設(shè)置定位數(shù)據(jù),這樣地圖就顯示位置了nowLocation = new LatLng(location.getLatitude(), location.getLongitude());}});//開始定位mLocationClient.start();}獲得數(shù)據(jù)后更新
獲取到數(shù)據(jù)后,轉(zhuǎn)換地址數(shù)據(jù),繪制地圖軌跡。
private void loadDataEnd() {//轉(zhuǎn)換地圖坐標(biāo)convertLatLngPosition();//繪制地圖軌跡drawMapTrajectory();}網(wǎng)上說這里的地址要通過 converter 轉(zhuǎn)換,可是我發(fā)現(xiàn)轉(zhuǎn)換后地址不準了,看需要吧!
private void convertLatLngPosition() {//坐標(biāo)點需要轉(zhuǎn)換使用 // CoordinateConverter converter = new CoordinateConverter(); // converter.from(CoordinateConverter.CoordType.COMMON);for (Record record : mData) {//緯度在前,經(jīng)度在后LatLng src = new LatLng(record.getLat(), record.getLng());//converter.coord(src);//LatLng target = converter.convert();latLngs.add(src);}}下面是繪制標(biāo)記物和軌跡的代碼,東西較多
private void drawMapTrajectory() {//創(chuàng)建覆蓋物圖形createBitmapDescriptors();//動態(tài)更新縮放比例autoZoom();//創(chuàng)建覆蓋物createMarkers();//去掉縮放按鈕mMapView.showZoomControls(false);//標(biāo)記點點擊mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {public boolean onMarkerClick(final Marker marker) {return true;}});//軌跡點擊mBaiduMap.setOnPolylineClickListener(new BaiduMap.OnPolylineClickListener() {@Overridepublic boolean onPolylineClick(Polyline polyline) {return false;}});//繪制軌跡線條if (latLngs.size() >= 2) {OverlayOptions ooPolyline= new PolylineOptions().width(13).color(0xAA4DDC26).points(latLngs);mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);mPolyline.setZIndex(3);}}這里通過布局來創(chuàng)建覆蓋物圖形,包含起點、終點以及過程點,這里有一點要注意,不能再根據(jù)不設(shè)置背景圖片,不然圖片不會隨覆蓋物改變大小,具體布局按需要弄吧,問題不大。
@SuppressLint("SetTextI18n")private void createBitmapDescriptors() {for (int i = 0; i< latLngs.size(); i++) {@SuppressLint("InflateParams")View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_trajectory_marker, null);//加載自定義的布局TextView text = view.findViewById(R.id.text);ImageView icon = view.findViewById(R.id.icon);if (i == 0) {//注意時間為最新的在前面text.setTextColor(Color.parseColor("#FE4C4C"));text.setText("終點");icon.setImageResource(R.drawable.ic_trajectory_end);}else if (i == (latLngs.size() - 1)) {text.setTextColor(Color.parseColor("#62b500"));text.setText("起點");icon.setImageResource(R.drawable.ic_trajectory_start);}else {text.setTextColor(Color.parseColor("#0396E4"));text.setText(mData.get(i).getActualDate().substring(0, 5));//時:分icon.setImageResource(R.drawable.ic_trajectory_via);}//用到了這個實例化方法來把自定義布局實現(xiàn)到marker中。BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromView(view);bitmapDesList.add(bitmapDescriptor);}}上面只是創(chuàng)建了覆蓋物的圖形,我們還要拿上面數(shù)據(jù)創(chuàng)建真的覆蓋物,并添加到地圖里面去
private void createMarkers() {for (int i = 0; i < bitmapDesList.size(); i++) {//針對不同位置生成不同markerBitmapDescriptor descriptor = bitmapDesList.get(i);MarkerOptions options = new MarkerOptions().position(latLngs.get(i)).icon(descriptor).zIndex(i);mBaiduMap.addOverlay(options);}}地圖縮放問題其實百度地圖提供了解決方法,可以根據(jù)我們提供的點自動縮放。
private void autoZoom() {LatLngBounds.Builder LatLngBuilder = new LatLngBounds.Builder();for (LatLng latLng : latLngs) {LatLngBuilder.include(latLng);}MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(LatLngBuilder.build());mBaiduMap.setMapStatus(mapStatusUpdate);}行為軌跡的繪制在上面已經(jīng)有了,這里再講一下,尤其注意不能少于兩個點,不然會崩潰。
//繪制軌跡線條if (latLngs.size() >= 2) {OverlayOptions ooPolyline= new PolylineOptions().width(13).color(0xAA4DDC26).points(latLngs);mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);mPolyline.setZIndex(3);}結(jié)語
我這里寫的不是很清除,但是整個流程應(yīng)該是沒問題的,因為這是公司的代碼,也不太好全放出來,讀者有需要的話,按這個流程寫下來應(yīng)該問題不大,如果想更加深入一點,下面我推薦一篇博客,寫的很詳細,希望有幫助。
Android百度地圖(二):百度地圖sdk顯示位置點、圖層繪制
https://www.jianshu.com/p/fdd1ba783495
end
總結(jié)
以上是生活随笔為你收集整理的百度地图 sdk 使用小结(行动轨迹)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 据说优秀的程序员都是这样送新年祝福的?
- 下一篇: QCOM 8976 porting SP