效果图:
摘要:1.定位。
2.导航。
3.围栏。
4.判断是否在禁区内。
零:注册百度地图开放平台账号,傻瓜式注册,创建应用,有一个简单的难点:生成sha1开发版和正式版下面试步骤:
找到小黑窗:1.cd 你的jdk地址
2.keytool -list -v -keystore E:签名文件android.keystore
3.输入签名密码
4.开发版sha1:重复第一步骤:第二步骤修改签名路径 keytool -list -v -keystore C:Usersxxx.androiddebug.keystore
5.如果弄不出来,肯定是Java环境变量有问题,百度配置一下环境变量
一:百度地图定位
1.这个是写在oncreate里面,方向传感器是获取角度,可以让地图上面代表所在位置的角标可以根据手机的转向来控制角标指示方向。
定位初始化,我这里写的比较少,可以参考百度地图文档里面,全。
2. option.setScanSpan(1000);我给注释了,这个代表是每隔一秒来更新一次定位,我项目中不需要,注释了,
//方向传感器 myOrientationListener = new MyOrientationListener(this); myOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() { @Override public void onOrientationChanged(float x) { mCurrentX = x; Log.d("bbbbbb","onOrientationChanged-"+mCurrentX); } }); map = mMapView.getMap(); map.setMapType(BaiduMap.MAP_TYPE_NORMAL);//普通地图 ,mBaiduMap是地图控制器对象 UiSettings settings= map.getUiSettings(); settings.setCompassEnabled(true); settings.setRotateGesturesEnabled(false);//屏蔽旋转 mMapView.showZoomControls(false); map.setMyLocationEnabled(true); map.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, null, 0x00000000, 0x00000000)); //定位初始化 mLocationClient = new LocationClient(this); //通过LocationClientOption设置LocationClient相关参数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 // option.setScanSpan(1000); //设置locationClientOption mLocationClient.setLocOption(option); //注册LocationListener监听器 MyLocationListener myLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(myLocationListener); //开启地图定位图层 mLocationClient.start();
2.根据生命周期打开或者销毁地图。
@Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); //开启定位的允许 map.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) { mLocationClient.start(); //开启方向传感器 myOrientationListener.start(); } } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); //关闭定位 map.setMyLocationEnabled(false); mLocationClient.stop(); //停止方向传感器 myOrientationListener.stop(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); map.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); }
3.注意mCurrentX这个就是传感器得到的参数
public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { Log.d("aaaaaa","MyLocationListener-"+mCurrentX); Log.d("aaaaaa",location.getLatitude()+"MyLocationListener-"+location.getLongitude()); //将获取的location信息给百度map MyLocationData data = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360,mLastX就是获取到的方向传感器传来的x轴数值 .direction(mCurrentX) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); map.setMyLocationData(data); //更新经纬度 mLatitude = location.getLatitude(); mLongitude = location.getLongitude(); //获取经纬度 LatLng ll = new LatLng(location.getLatitude(),location.getLongitude()); MapStatus mMapStatus = new MapStatus.Builder() .target(new LatLng(mLatitude,mLongitude))//设定中心点坐标 ,要移动到的点 .zoom(20) //设置级别,放大地图到13倍 .build(); MapStatusUpdate status = MapStatusUpdateFactory.newMapStatus(mMapStatus); //mBaiduMap.setMapStatus(status);//直接到中间 map.animateMapStatus(status);//动画的方式到中间 } }
二:导航:完整代码,startpt是起始位置坐标,endpt我不说是啥。
LatLng startPt = new LatLng(40.047416,116.312143); LatLng endPt = new LatLng(40.048424, 116.313513); BikeNaviLaunchParam param = new BikeNaviLaunchParam().stPt(startPt).endPt(endPt).vehicle(0); BikeNavigateHelper.getInstance().initNaviEngine(BaiduMapActivity.this, new IBEngineInitListener() { @Override public void engineInitSuccess() { //骑行导航初始化成功之后的回调 Log.d("aaaaa","引擎初始化成功的回调"); BikeNavigateHelper.getInstance().routePlanWithParams(param, new IBRoutePlanListener() { @Override public void onRoutePlanStart() { //执行算路开始的逻辑 Log.d("aaaaa","开始算路的回调"); } @Override public void onRoutePlanSuccess() { //算路成功 //跳转至诱导页面 Log.d("aaaaa","算路成功"); Intent intent = new Intent(BaiduMapActivity.this,BikMaoActivity.class); startActivity(intent); } @Override public void onRoutePlanFail(BikeRoutePlanError bikeRoutePlanError) { //执行算路失败的逻辑 Log.d("aaaaa","算路失败的回调"); } }); } @Override public void engineInitFail() { //骑行导航初始化失败之后的回调 Log.d("aaaaa","引擎初始化失败的回调"); } });
BikMaoActivity.class:这里面可以加入语音播报:::::我没弄,懒懒
public class BikMaoActivity extends AppCompatActivity { private BikeNavigateHelper mNaviHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bik_mao); mNaviHelper = BikeNavigateHelper.getInstance(); // 获取诱导页面地图展示View View view = mNaviHelper.onCreate(BikMaoActivity.this); if (view != null) { setContentView(view); } // 开始导航 mNaviHelper.startBikeNavi(BikMaoActivity.this); // 设置诱导监听, 具体诱导信息请参考javadoc类参考 // com.baidu.mapapi.bikenavi.adapter -> IBRouteGuidanceListener mNaviHelper.setRouteGuidanceListener(this, new IBRouteGuidanceListener() { @Override public void onRouteGuideIconUpdate(Drawable icon) { //诱导图标更新 Log.d("aaaaaaaa","诱导图标更新"); } @Override public void onRouteGuideKind(RouteGuideKind routeGuideKind) { //诱导类型枚举 Log.d("aaaaaaaa","诱导类型枚举"); } @Override public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) { //诱导信息 Log.d("aaaaaaaa","诱导信息"); } @Override public void onRemainDistanceUpdate(CharSequence charSequence) { //总的剩余距离 Log.d("aaaaaaaa","总的剩余距离"); } @Override public void onRemainTimeUpdate(CharSequence charSequence) { //总的剩余时间 Log.d("aaaaaaaa","总的剩余时间"); } @Override public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) { //GPS状态发生变化,来自诱导引擎的消息 Log.d("aaaaaaaa","GPS状态发生变化,来自诱导引擎的消息"); } @Override public void onRouteFarAway(CharSequence charSequence, Drawable drawable) { //已经开始偏航 Log.d("aaaaaaaa","已经开始偏航"); } @Override public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) { //偏航规划中 Log.d("aaaaaaaa","偏航规划中"); } @Override public void onReRouteComplete() { //重新算路成功 Log.d("aaaaaaaa","重新算路成功"); } @Override public void onArriveDest() { //到达目的地 Log.d("aaaaaaaa","到达目的地"); } @Override public void onVibrate() { Log.d("aaaaaaaa","震动"); //震动 } @Override public void onGetRouteDetailInfo(BikeRouteDetailInfo bikeRouteDetailInfo) { //获取骑行导航路线详细信息类 Log.d("aaaaaaaa","获取骑行导航路线详细信息类"); } }); mNaviHelper.setTTsPlayer(new IBTTSPlayer() { /** * 获取导航过程中语音,进行播报 * @param s 播报语音文本 * @param b 是否抢占播报 */ @Override public int playTTSText(String s, boolean b) { //调用语音识别SDK的语音回调进行播报 Log.d("aaaaaaaa",s+"获取导航过程中语音,进行播报"+b); return 0; } }); } @Override protected void onResume() { super.onResume(); mNaviHelper.resume(); } @Override protected void onPause() { super.onPause(); mNaviHelper.pause(); } @Override protected void onDestroy() { super.onDestroy(); mNaviHelper.quit(); } }
三:围栏:用的是百度地图当中的绘制线功能
首先是区域围栏,百度地图上的区域围栏,我就是按照绘制线的方式来绘制围栏,缺点是坐标点越多,耗时越多,优点是简单易上手
// TODO 城市边界,检索城市坐标集合绘制线 成功完事 (实现围栏功能,并实现检测是否在围栏内) DistrictSearch mDistrictSearch = DistrictSearch.newInstance();//初始化行政区检索 mDistrictSearch.setOnDistrictSearchListener(listeners );//设置回调监听 DistrictSearchOption districtSearchOption = new DistrictSearchOption(); districtSearchOption.cityName("北京市");//检索城市名称 districtSearchOption.districtName("大兴区");//检索的区县名称 mDistrictSearch.searchDistrict(districtSearchOption);//请求行政区数据*/
OnGetDistricSearchResultListener listeners = new OnGetDistricSearchResultListener() { @Override public void onGetDistrictResult(DistrictResult districtResult) { districtResult.getCenterPt();//获取行政区中心坐标点 districtResult.getCityName();//获取行政区域名称 //获取行政区域边界坐标点 polyLines = districtResult.getPolylines(); for (int i = 0; i < polyLines.size(); i++) { Log.d("aaaaaaaa",""+ polyLines.get(i).toString()); OverlayOptions mOverlayOptions = new PolylineOptions() .width(10) .color(0xAAFF0000) .points(polyLines.get(i)); //在地图上绘制折线 //mPloyline 折线对象 Overlay mPolyline = map.addOverlay(mOverlayOptions); } //边界就是坐标点的集合,在地图上画出来就是多边形图层。有的行政区可能有多个区域,所以会有多个点集合。 } };
四:禁区判断:
LatLng location=new LatLng(39.839945,116.28793);//当前位置
boolean isPolygonContains = SpatialRelationUtil.isPolygonContainsPoint(polyLines.get(0), location);
Log.d("aaaaa",""+isPolygonContains);
下一章:地图语音提示<增加角标?太简单>