效果圖:
摘要:1.定位。
2.導航。
3.圍欄。
4.判斷是否在禁區內。
零:注冊百度地圖開放平台賬號,傻瓜式注冊,創建應用,有一個簡單的難點:生成sha1開發版和正式版下面試步驟:
找到小黑窗:1.cd 你的jdk地址
2.keytool -list -v -keystore E:\簽名文件\android.keystore
3.輸入簽名密碼
4.開發版sha1:重復第一步驟:第二步驟修改簽名路徑 keytool -list -v -keystore C:\Users\xxx\.android\debug.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);
下一章:地圖語音提示<增加角標?太簡單>