百度地图 sdk 使用小结(行动轨迹)

编程入门 行业动态 更新时间:2024-10-26 16:32:12

百度地图 sdk 使用<a href=https://www.elefans.com/category/jswz/34/1769750.html style=小结(行动轨迹)"/>

百度地图 sdk 使用小结(行动轨迹)

最近把之前的地图代码再看了一遍,想借此机会小结一番,下面是效果图,点没取好,凑合看吧。

这里做的是一个地图上的行为轨迹,包含各个点的覆盖物以及路线绘制,需要用到百度地图定位 SDK,具体如何引入百度地图的 SDK 就不过讲了,下面给出官网说明文档:

.php?title=androidsdk

下面详细讲讲具体如何使用百度地图,直至画出我们要的行为轨迹。

初始化设置

第一步,先在 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());}

下面是定位的一些参数:

    // 定位相关MapView mMapView;           //地图 viewBaiduMap mBaiduMap;         //地图Polyline mPolyline;         //线LocationClient mLocationClient;     //定位List<LatLng> latLngs = new ArrayList<>();                   //位置轨迹List<BitmapDescriptor> bitmapDesList = new ArrayList<>();   //位置在地图的覆盖物

初始化地图,并通过定位 SDK 获取位置信息,这里可以获得很多参数不多说了。

    private void setupMap() {// 地图初始化mMapView = findViewById(R.id.map);mBaiduMap = mMapView.getMap();// 开启定位图层mBaiduMap.setMyLocationEnabled(true);//设置定位相关initLocation();//请求轨迹数据mPresenter.load();}private LatLng nowLocation;private void initLocation() {mLocationClient = new LocationClient(getApplication());LocationClientOption option = new LocationClientOption();//定位方式参数设置option.setOpenGps(true); // 打开gpsoption.setCoorType("bd09ll"); // 设置坐标类型option.setScanSpan(1000);//周期性请求定位,1秒返回一次位置mLocationClient.setLocOption(option);//参数设置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);//给地图设置定位数据,这样地图就显示位置了nowLocation = new LatLng(location.getLatitude(), location.getLongitude());}});//开始定位mLocationClient.start();}

获得数据后更新

获取到数据后,转换地址数据,绘制地图轨迹。

    private void loadDataEnd() {//转换地图坐标convertLatLngPosition();//绘制地图轨迹drawMapTrajectory();}

网上说这里的地址要通过 converter 转换,可是我发现转换后地址不准了,看需要吧!

    private void convertLatLngPosition() {//坐标点需要转换使用
//        CoordinateConverter converter  = new CoordinateConverter();
//        converter.from(CoordinateConverter.CoordType.COMMON);for (Record record : mData) {//纬度在前,经度在后LatLng src = new LatLng(record.getLat(), record.getLng());//converter.coord(src);//LatLng target = converter.convert();latLngs.add(src);}}

下面是绘制标记物和轨迹的代码,东西较多

   private void drawMapTrajectory() {//创建覆盖物图形createBitmapDescriptors();//动态更新缩放比例autoZoom();//创建覆盖物createMarkers();//去掉缩放按钮mMapView.showZoomControls(false);//标记点点击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);}}

这里通过布局来创建覆盖物图形,包含起点、终点以及过程点,这里有一点要注意,不能再根据不设置背景图片,不然图片不会随覆盖物改变大小,具体布局按需要弄吧,问题不大。

    @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);}//用到了这个实例化方法来把自定义布局实现到marker中。BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromView(view);bitmapDesList.add(bitmapDescriptor);}}

上面只是创建了覆盖物的图形,我们还要拿上面数据创建真的覆盖物,并添加到地图里面去

    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);}}

地图缩放问题其实百度地图提供了解决方法,可以根据我们提供的点自动缩放。

    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);}

行为轨迹的绘制在上面已经有了,这里再讲一下,尤其注意不能少于两个点,不然会崩溃。

        //绘制轨迹线条if (latLngs.size() >= 2) {OverlayOptions ooPolyline= new PolylineOptions().width(13).color(0xAA4DDC26).points(latLngs);mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);mPolyline.setZIndex(3);}

结语

我这里写的不是很清除,但是整个流程应该是没问题的,因为这是公司的代码,也不太好全放出来,读者有需要的话,按这个流程写下来应该问题不大,如果想更加深入一点,下面我推荐一篇博客,写的很详细,希望有帮助。

Android百度地图(二):百度地图sdk显示位置点、图层绘制

end

更多推荐

百度地图 sdk 使用小结(行动轨迹)

本文发布于:2023-07-03 14:18:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1007566.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小结   轨迹   地图   sdk

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!