溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

百度地圖開發(fā)總結(jié)

發(fā)布時間:2020-07-20 17:14:46 來源:網(wǎng)絡(luò) 閱讀:2163 作者:屠夫章哥 欄目:移動開發(fā)


1.  怎么接入百度SDK,百度文檔說得很明白,我就不說了。

2.  注意

   1)初始化的時候,上下文用全局的,即ApplicationContext。

   2)要在Activity的相應(yīng)生命周期方法里調(diào)用MapView對應(yīng)的生命周期方法。

3.  百度地圖的核心類:

   1)SDKInitializer 百度地圖初始化類

     》》注冊網(wǎng)絡(luò)錯誤、key驗證錯誤的廣播

     這樣一樣百度地圖崩潰了,或者出異常了,就知道有沒有可能是這一塊出現(xiàn)了問題。

private void initSDK() {
		SDKInitializer.initialize(getApplicationContext());
		//注冊網(wǎng)絡(luò)錯誤和KEY驗證失敗的廣播
		IntentFilter filter = new IntentFilter();
		filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
		filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
		registerReceiver(new MyReceiver(), filter);
	}  
	
	class MyReceiver extends BroadcastReceiver
	{
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if(action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){
				Toast.makeText(getApplicationContext(), "網(wǎng)絡(luò)錯誤", 0).show();
			}else if(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){
				Toast.makeText(getApplicationContext(), "key驗證失敗", 0).show();
			}
		}
	}

   2)MapView  顯示百度地圖的組件

     》》設(shè)置綻放按鈕顯示與隱藏

        mMapView.showZoomControls(false);  

     》》設(shè)置比例尺顯示與隱藏

        mMapView.showScaleControl(false);

     》》替換百度地圖logo

        將"baidumapapi_v3_3_0.jar"復(fù)制到桌面,然后解壓,將assets目錄下的logo_h,logo_l

        用自己的圖片替換掉。然后再將jar包拷貝回去。


     可以做addView操作,而BaiduMap是addOverlay()添加覆蓋物。


   3)BaiduMap  控制器  通過MapView.getMap()獲取

      》》設(shè)置地圖的狀態(tài) map.setMapStatus(MapStatusUpdate)

         通過MapStatusUpdateFactory.方法()可以得到參數(shù)

    

           //設(shè)置地圖的綻放級別

         MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(18);
	 map.setMapStatus(zoom);

      

          //設(shè)置中心點,注意LatLng的構(gòu)造函數(shù)latitude,longtitude,分別為緯度、經(jīng)度,在百度地

            圖上查的坐標(biāo)與這個正好相反的。

             map.setMapStatus(MapStatusUpdateFactory.newLatLng(
         new LatLng(40.050513,116.30361)));

          Android百度地圖默認(rèn)位置中心點設(shè)置

          http://blog.csdn.net/xyy410874116/article/details/32094157

           

           //旋轉(zhuǎn)百度地圖(以中心點) 

            

            //得到地圖之前的狀態(tài)和角度
        MapStatus mapStatus = map.getMapStatus();
        	float preRotate = mapStatus.rotate;
        	//利用MapStatus.Builder靜態(tài)內(nèi)部類來構(gòu)造新的狀態(tài),對之前狀態(tài)的角度累加一個
        	  值。
        	Builder builder = new MapStatus.Builder();
        	MapStatus newStatus = builder.rotate(preRotate + 30).build();
        	//將新的狀態(tài)設(shè)置給百度地圖
        	map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus));

           //翻轉(zhuǎn)百度地圖(以直線),改變俯角,也就是看百度地圖的角度。

          

                    MapStatus mapStatus2 = map.getMapStatus();
		float preOverlook = mapStatus2.overlook;
		Builder builder2 = new MapStatus.Builder();
		MapStatus newStatus2 = builder2.overlook(preOverlook - 5 ).build();
		map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus2));

          //移動百度地圖到指定中心點

            animateMapStatus方法有重載形式,可以指定動畫的時長。(默認(rèn)300ms)

                MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newLatLng(
                LatLng(39.979982, 116.309258));
	    map.animateMapStatus(statusUpdate);

    》》更改底圖和添加交通圖圖層

       //底圖設(shè)置為默認(rèn)的

            map.setMapType(BaiduMap.MAP_TYPE_NORMAL);

       //底圖設(shè)置成衛(wèi)星圖

            map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

         //顯示交通圖圖層

            map.setTrafficEnabled(true);

   4)OverlayOptions 本地覆蓋物的抽象基類

     OverlavOptions關(guān)于覆蓋物的操作:

     1)創(chuàng)建覆蓋物

    2)給覆蓋物添加數(shù)據(jù)

      一般都要設(shè)置坐標(biāo)(覆蓋物具體擺在哪兒)

      其它的。。。  

    3)把覆蓋物添加到地圖上



     例1:添加圓形覆蓋物 CircleOptions

      

           //創(chuàng)建圓形覆蓋物
		CircleOptions options = new CircleOptions();
	   //設(shè)置數(shù)據(jù)
		//圓心坐標(biāo)
		options.center(new LatLng(40.050513,116.30361))
		//圓半徑
		.radius(1000)
		//填充顏色
		.fillColor(Color.BLUE)
		//圓的邊框?qū)挾群皖伾?		.stroke(new Stroke(5, Color.RED));
	   //將覆蓋物添加到地圖上
		map.addOverlay(options);

     效果如下圖:

        百度地圖開發(fā)總結(jié)


     例2:添加文字覆蓋物  TextOptions

       

        TextOptions options = new TextOptions();
		options.fontColor(Color.BLUE)
		.fontSize(100)
		.bgColor(0x3300ff00)
		.rotate(30)
		.typeface(Typeface.SERIF)
		.position(new LatLng(40.050513,116.30361))
		.text("我在北京");
		map.addOverlay(options);

     效果如下圖:

        百度地圖開發(fā)總結(jié) 


    通過上面的兩個例子,發(fā)現(xiàn),文字(包括百度地圖本身的文字)并不會隨著地圖一起縮放,

    但是圓形覆蓋物會隨著地圖一起縮放。


   例3:添加標(biāo)記覆蓋物  MarkerOptions

    

                MarkerOptions options = new MarkerOptions();
		BitmapDescriptor icon;
		options.position(testPos)
		.title("我在北京")
		//是否可拖拽
		.draggable(true)
		//圖標(biāo)(工廠創(chuàng)建)
		.icon(BitmapDescriptorFactory.fromResource(R.drawable.eat_icon));
		map.addOverlay(options);

   作為一個注重產(chǎn)品性能的程序員,應(yīng)該在設(shè)置icon的時候創(chuàng)建一個BitmapDescriptor的引用,

   在onDestroy里回收資源

   

         //釋放圖片資源
         bitmapDescriptor.recycle();

    4)OverlavManager 搜索覆蓋物的抽象基類 

     顯示和管理多個Overlay的基類   

        |--本地搜索覆蓋物:PoiOverlay

       |--駕車路線覆蓋物:DrivingRouteOverlay

       |--步行路線覆蓋物:WalkingRouteOverlay

        |--換乘路線覆蓋物:TransitOverlay

       |--公交路線覆蓋物:BusLineOverlay

      

     百度地圖移動版API集成搜索服務(wù)包括

        |---位置檢索、周邊檢索、范圍檢索  (點搜索)

             使用PoiSearch和OnGetPoiSearchResultListener核心類

        |---公交檢索、駕乘檢索、步行檢索  (線搜索)

           使用RoutePlanSearch和OnGetRoutePlanResultListener核心類

      

       

    POI(Point of Interest興趣點)搜索有三種方式

        根據(jù)范圍和檢索詞發(fā)起范圍檢索searchInBound

        周邊檢索searchNearby

        城市poi檢索searchInCity

        poi詳細信息檢索 searchPoiDetail

    結(jié)果的展示: PoiOverlay

    

     例1:搜索指定范圍內(nèi)的加油站(矩形區(qū)域搜索)

      

        private void search() {
		PoiSearch search = PoiSearch.newInstance();
		search.setOnGetPoiSearchResultListener(new MyOnGetPoiSearchResultListener());
		
		//范圍內(nèi)搜索
		PoiBoundSearchOption boundOption = new PoiBoundSearchOption();
		//搜索關(guān)鍵字
		boundOption.keyword("加油站");
		//搜索范圍
		LatLngBounds latLngBounds = new LatLngBounds.Builder()
		.include(new LatLng(39.98, 116.310))
		.include(new LatLng(39.96, 116.30))
		.build();
		boundOption.bound(latLngBounds);
		
		search.searchInBound(boundOption);
	}
	
	class MyOnGetPoiSearchResultListener implements OnGetPoiSearchResultListener
	{

		@Override
		public void onGetPoiDetailResult(PoiDetailResult arg0) {
			//詳情搜索在此處理結(jié)果
		}

		@Override
		public void onGetPoiResult(PoiResult result) {
			if(result == null || result.error == 
			    SearchResult.ERRORNO.RESULT_NOT_FOUND)
			{
				return ;  //無搜索結(jié)果
			}
			//找到搜索結(jié)果
			
			//創(chuàng)建覆蓋物
			MyOverlay overlay = new MyOverlay(map);
			
			//++++++++監(jiān)聽覆蓋物的點擊事件++++++++++
			map.setOnMarkerClickListener(overlay);
			
			//為覆蓋物綁定數(shù)據(jù)
			overlay.setData(result);
			
			//將覆蓋物添加到地圖上
			overlay.addToMap();
			
			//顯示全部的搜索結(jié)果
			overlay.zoomToSpan();
		}
	}
	
	//自定義一個實現(xiàn)了點擊事件的覆蓋物
	class MyOverlay extends PoiOverlay
	{

		public MyOverlay(BaiduMap arg0) {
			super(arg0);
		}
		
		@Override
		public boolean onPoiClick(int index) {
			PoiResult result = getPoiResult();
			//在搜索集中找到被點擊的覆蓋物的信息
			PoiInfo poiInfo = result.getAllPoi().get(index);
			Toast.makeText(getApplicationContext(), poiInfo.address, 0).show();
			return super.onPoiClick(index);
		}
	}

  

    例2:搜索周邊的地鐵站(圓形區(qū)域搜索)

     原理和加油站的搜索一下,只是PoiSearch調(diào)用的方法及方法的參數(shù)不同,監(jiān)聽者不用改變。

    可以進行共用。

    PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
		nearbySearchOption.keyword("地鐵站")
		.radius(1000)
		.location(testPos);
	search.searchNearby(nearbySearchOption);

   上面兩個例子,MyOverlay在監(jiān)聽點擊的時候,得到了覆蓋物的PoiInfo,通過PoiInfo又可以得

     到uid,根據(jù)uid就可以發(fā)起詳情搜索:

    //詳情搜索
	protected void detailSearch(PoiInfo poiInfo) {
	    PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
	    detailSearchOption.poiUid(poiInfo.uid);
	  search.searchPoiDetail(detailSearchOption);
	}

   監(jiān)聽詳情搜索結(jié)果 

@Override
   public void onGetPoiDetailResult(PoiDetailResult result) {
     if(result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND)
     {
	return ;
      }
     Toast.makeText(getApplicationContext(),"電話:" +  result.getTelephone(), 0).show();
   }

  

     例3:城市搜索 

    //城市搜索
	private void citySearch() {
		PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
		citySearchOption.city("北京")
		.keyword("武術(shù)館")
		.pageNum(pageIndex ++);	  //分布顯示數(shù)據(jù)
		search.searchInCity(citySearchOption);
	}

   注意分頁顯示數(shù)據(jù)的時候,要清除之前的數(shù)據(jù),在onGetPoiResult方法里:

    //清除數(shù)據(jù),防止分布的時候顯示前一頁的數(shù)據(jù)。
      map.clear();

     


4.  百度地圖高級開發(fā):  

  案例1:泡泡提示信息

   第1步:初始化PopView,并添加到MapView當(dāng)中,隱藏PopView

    private void initPop() {
		pop = View.inflate(getApplicationContext(), R.layout.mark_item, null);
    	tip = (TextView) pop.findViewById(R.id.tv);
    	
    	MapViewLayoutParams params = new MapViewLayoutParams.Builder()
    	.layoutMode(ELayoutMode.mapMode)
    	.position(testPos)
    	.width(MapViewLayoutParams.WRAP_CONTENT)
    	.height(MapViewLayoutParams.WRAP_CONTENT)
    	.build();
    	
    	mMapView.addView(pop,params);
    	pop.setVisibility(View.INVISIBLE);
    }

   第2步:為BaiduMap添加Marker覆蓋物的點擊監(jiān)聽

      map.setOnMarkerClickListener(this);

   第3步:處理點擊事件

     將PopView定位到Marker的位置、獲得Marker的信息并展示到PopView上去。

    @Override
	public boolean onMarkerClick(Marker marker) {
		MapViewLayoutParams params = new MapViewLayoutParams.Builder()
    	.layoutMode(ELayoutMode.mapMode)
    	.position(marker.getPosition())
    	.width(MapViewLayoutParams.WRAP_CONTENT)
    	.height(MapViewLayoutParams.WRAP_CONTENT)
    	.build();
		
		mMapView.updateViewLayout(pop, params);
		pop.setVisibility(View.VISIBLE);
		tip.setText(marker.getTitle());
		
		return true;
	}

   效果圖如下:

      百度地圖開發(fā)總結(jié)


4.  百度地圖定位SDK使用:

    上面講的的這些,都是地圖SDK的開發(fā)。下面要說的就是定位SDK使用,就是定位手機當(dāng)前的

   位置。照著百度定位SDK開發(fā)文檔做,但是代碼需要有一定的改動。

     代碼如下:

public class LocateActivity extends BaseActivity {
	public LocationClient mLocationClient = null;
	public BDLocationListener myListener = new MyLocationListener();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		 mLocationClient = new LocationClient(getApplicationContext());     //聲明LocationClient類
		mLocationClient.registerLocationListener( myListener );    //注冊監(jiān)聽函數(shù)
		
		initLocation();
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		mLocationClient.start();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		mLocationClient.stop();
	}
	
	private void initLocation(){
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy
);//可選,默認(rèn)高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備
        option.setCoorType("bd09ll");//可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系
        int span=1000;
        option.setScanSpan(span);//可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請求的間隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可選,設(shè)置是否需要地址信息,默認(rèn)不需要
        option.setOpenGps(true);//可選,默認(rèn)false,設(shè)置是否使用gps
        option.setLocationNotify(true);//可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時按照1S1次頻率輸出GPS結(jié)果
option.setIgnoreKillProcess(false);//可選,默認(rèn)false,定位SDK內(nèi)部是一個SERVICE,并放到了獨立進程,設(shè)置是否在stop的時候殺死這個進程,默認(rèn)殺死
        option.SetIgnoreCacheException(false);//可選,默認(rèn)false,設(shè)置是否收集CRASH信息,默認(rèn)收集
        mLocationClient.setLocOption(option);
        
        
        //設(shè)置自己的定位圖標(biāo)
        BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
        MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, icon);
        map.setMyLocationConfigeration(configuration);
    }
	
	public class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //Receive Location
        	Builder builder = new MyLocationData.Builder();
        	builder.latitude(location.getLatitude())  //緯度
        	.longitude(location.getLongitude());	//經(jīng)度
        	
        	map.setMyLocationEnabled(true);      //允許定位圖層
            map.setMyLocationData(builder.build());  //設(shè)置定位數(shù)據(jù)
        }
	}
	
}


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI