用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

微客吧 首页 教程 微信小程序 实战教程 查看内容

Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨 ...

纸飞机 2017-6-15 11:16

最近共享单车很火,动辄几亿美刀,屌丝的我只有羡慕的份。啥时候自己也能创一番事业呢?我眉头紧皱深深地思索着。个人认为LBS是移动互联网最主要的特征之一,自己以前没做过地图有关的项目,看到网上也没有完整有关 ...

  最近共享单车很火,动辄几亿美刀,屌丝的我只有羡慕的份。啥时候自己也能创一番事业呢?我眉头紧皱深深地思索着。个人认为LBS是移动互联网最主要的特征之一,自己以前没做过地图有关的项目,看到网上也没有完整有关地图的项目,就想起模仿一下摩拜单车app,我这个小项目包括附近车辆、规划路径、行驶距离、行驶轨迹记录、导航等(也挺全的哈);

       需要注意:

0、,其中的附近车辆用的是假数据,实际项目中你上传自己的经纬度然后服务器端会返回给你附近车辆列表显示出来就行。行驶轨迹记录都是保存在本地

数据库

,实际项目中你可以隔几秒上传一次踩点列表到服务器,防止APP被杀死或其它异常导致以前踩点消失

1、距离是取两个位置点的直线距离,DistanceUtil.getDistance(lastLatLng, currentLatLng)。然后把所有这些距离相加就是总距离,这是通常

算法


2、实际项目中可定时你上传当前位置,然后服务器返回给你附近自行车数据,你展示一下就行。

3、行驶轨迹就是开启后台Service每隔几秒收集一次经纬度,到最后必须把所有经纬度上传到服务器,这样就算app被卸载,重新安装你还可以获取到行驶轨迹。有两种思路,一是边收集变上传到服务器或数据库,这样可以防止手机重启或App被杀死导致以前的数据消失,二是等结束进程时上传到服务器。

4、百度内置导航

语音播报的问题:能正常导航,但是无法语音播报

除了地图显示、定位、导航需要的配置之外,tts播报需要添加白名单,点击进入

配置地址

。可参考:

http://blog.csdn.net/chentravelling/article/details/51435976

还有就是要分清提交时是debug版和release版的MD5,如果是

测试

版MD5那么发布版的语音还是没声音

发布版md5或sha获取方法:keytool -list -v -keystore /Users/gaolei/Work/CompanyProject/Bike/BiuBike/BiuBike/biubike.jks
测试版md5或sha获取方法:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

     百度地图开放平台注册不需要公司营业执照什么的,个人就能注册,地址:

http://lbsyun.baidu.com

首先建议大家吧百度地图API的demo下载下来研究一下,它包含我们用到的所有知识点,你再把资源整合一下就行了。SDK的Demo下载地址:

http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar

运行效果图

     下面简单介绍一下有关内容,有需要的可以下载源码运行研究

1、初始化

SDKInitializer.initialize(getApplicationContext());//我测试在Application的onCreate()不行,必须在activity的onCreate()中

2、配置map参数

  1. <span style="font-size:14px;"> private void initMap() {  
  2.         // 地图初始化  
  3.         mMapView = (MapView) findViewById(R.id.id_bmapView);  
  4.         mBaiduMap = mMapView.getMap();  
  5.         // 开启定位图层  
  6.         mBaiduMap.setMyLocationEnabled(true);  
  7.         // 定位初始化  
  8.         mlocationClient = new LocationClient(this);  
  9.         mlocationClient.registerLocationListener(myListener);  
  10.         LocationClientOption option = new LocationClientOption();  
  11.         option.setOpenGps(true); // 打开gps  
  12.         option.setCoorType("bd09ll"); // 设置坐标类型  
  13.         option.setScanSpan(5000);//设置onReceiveLocation()获取位置的频率  
  14.         option.setIsNeedAddress(true);//如想获得具体位置就需要设置为true  
  15.         mlocationClient.setLocOption(option);  
  16.         mlocationClient.start();  
  17.         mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;  
  18.         mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(  
  19.                         mCurrentMode, true, null));  
  20.         myOrientationListener = new MyOrientationListener(this);  
  21.         //通过接口回调来实现实时方向的改变  
  22.         myOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {  
  23.             @Override  
  24.             public void onOrientationChanged(float x) {  
  25.                 mCurrentX = x;  
  26.             }  
  27.         });  
  28.         myOrientationListener.start();  
  29.         mSearch = RoutePlanSearch.newInstance();  
  30.         mSearch.setOnGetRoutePlanResultListener(this);  
  31.         initMarkerClickEvent();  
  32.     }span>  

3、获取当前地址

  1. <span style="font-size:14px;">public class MyLocationListenner implements BDLocationListener {  
  2.   
  3.         @Override  
  4.         public void onReceiveLocation(BDLocation bdLocation) {  
  5.             // map view 销毁后不在处理新接收的位置  
  6.             if (bdLocation == null || mMapView == null) {  
  7.                 return;  
  8.             }  
  9.             MyLocationData locData = new MyLocationData.Builder()  
  10.                     .accuracy(bdLocation.getRadius())  
  11.                     .direction(mCurrentX)//设定图标方向     // 此处设置开发者获取到的方向信息,顺时针0-360  
  12.                     .latitude(bdLocation.getLatitude())  
  13.                     .longitude(bdLocation.getLongitude()).build();  
  14.             mBaiduMap.setMyLocationData(locData);  
  15.             currentLatitude = bdLocation.getLatitude();  
  16.             currentLongitude = bdLocation.getLongitude();  
  17.             current_addr.setText(bdLocation.getAddrStr());  
  18.             currentLL = new LatLng(bdLocation.getLatitude(),  
  19.                     bdLocation.getLongitude());  
  20.             startNodeStr = PlanNode.withLocation(currentLL);  
  21.             //option.setScanSpan(5000),每隔5000ms这个方法就会调用一次,而有些我们只想调用一次,所以要判断一下isFirstLoc  
  22.             if (isFirstLoc) {  
  23.                 isFirstLoc = false;  
  24.                 LatLng ll = new LatLng(bdLocation.getLatitude(),  
  25.                         bdLocation.getLongitude());  
  26.                 MapStatus.Builder builder = new MapStatus.Builder();  
  27.                 //地图缩放比设置为18  
  28.                 builder.target(ll).zoom(18.0f);  
  29.                 mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));  
  30.                 changeLatitude = bdLocation.getLatitude();  
  31.                 changeLongitude = bdLocation.getLongitude();  
  32.                 if (!isServiceLive) {  
  33.                     addOverLayout(currentLatitude, currentLongitude);  
  34.                 }  
  35.             }  
  36.         }  
  37.     }span>  
4、开启service来每隔几秒收集一次经纬度信息,保存到列表,然后通过broadcast把数据传到MainActivity来更新时间和距离UI信息

  1. <span style="font-size:14px;">public class RouteService extends Service {  
  2.   
  3.     private double currentLatitude, currentLongitude;  
  4.   
  5.     private LocationClient mlocationClient = null;  
  6.     private MylocationListener mlistener;  
  7.     private BitmapDescriptor mIconLocation;  
  8.     private MyOrientationListener myOrientationListener;  
  9.     private float mCurrentX;  
  10.     //定位图层显示方式  
  11.     private MyLocationConfiguration.LocationMode locationMode;  
  12.     AllInterface.IUpdateLocation iUpdateLocation;  
  13.     public ArrayList<RoutePoint> routPointList = new ArrayList<RoutePo
鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋
分享至 : QQ空间
收藏