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

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

創(chuàng)新互聯(lián)是專業(yè)的商水網(wǎng)站建設(shè)公司,商水接單;提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行商水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

2.  注意

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

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

3.  百度地圖的核心類:

   1)SDKInitializer百度地圖初始化類

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

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

private void initSDK() {
		SDKInitializer.initialize(getApplicationContext());
		//注冊網(wǎng)絡(luò)錯(cuò)誤和KEY驗(yàn)證失敗的廣播
		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ò)錯(cuò)誤", 0).show();
			}else if(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){
				Toast.makeText(getApplicationContext(), "key驗(yàn)證失敗", 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è)置地圖的綻放級(jí)別

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

      

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

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

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

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

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

           

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

            

            //得到地圖之前的狀態(tài)和角度
        MapStatus mapStatus = map.getMapStatus();
        	float preRotate = mapStatus.rotate;
        	//利用MapStatus.Builder靜態(tài)內(nèi)部類來構(gòu)造新的狀態(tài),對之前狀態(tài)的角度累加一個(gè)
        	  值。
        	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));

          //移動(dòng)百度地圖到指定中心點(diǎn)

            animateMapStatus方法有重載形式,可以指定動(dòng)畫的時(shí)長。(默認(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é) 

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

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

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

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

   在onDestroy里回收資源

   

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

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

     顯示和管理多個(gè)Overlay的基類   

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

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

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

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

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

      

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

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

             使用PoiSearch和OnGetPoiSearchResultListener核心類

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

           使用RoutePlanSearch和OnGetRoutePlanResultListener核心類

      

       

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

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

        周邊檢索searchNearby

        城市poi檢索searchInCity

        poi詳細(xì)信息檢索 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)聽覆蓋物的點(diǎn)擊事件++++++++++
			map.setOnMarkerClickListener(overlay);
			
			//為覆蓋物綁定數(shù)據(jù)
			overlay.setData(result);
			
			//將覆蓋物添加到地圖上
			overlay.addToMap();
			
			//顯示全部的搜索結(jié)果
			overlay.zoomToSpan();
		}
	}
	
	//自定義一個(gè)實(shí)現(xiàn)了點(diǎn)擊事件的覆蓋物
	class MyOverlay extends PoiOverlay
	{

		public MyOverlay(BaiduMap arg0) {
			super(arg0);
		}
		
		@Override
		public boolean onPoiClick(int index) {
			PoiResult result = getPoiResult();
			//在搜索集中找到被點(diǎn)擊的覆蓋物的信息
			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)聽者不用改變。

    可以進(jìn)行共用。

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

   上面兩個(gè)例子,MyOverlay在監(jiān)聽點(diǎn)擊的時(shí)候,得到了覆蓋物的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í)候,要清除之前的數(shù)據(jù),在onGetPoiResult方法里:

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

     

4.  百度地圖高級(jí)開發(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覆蓋物的點(diǎn)擊監(jiān)聽

     map.setOnMarkerClickListener(this);

   第3步:處理點(diǎn)擊事件

     將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使用,就是定位手機(jī)當(dāng)前的

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

     代碼如下:

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有效時(shí)按照1S1次頻率輸出GPS結(jié)果
option.setIgnoreKillProcess(false);//可選,默認(rèn)false,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(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ù)
        }
	}
	
}

文章題目:百度地圖開發(fā)總結(jié)
網(wǎng)址分享:http://muchs.cn/article34/ghegpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、軟件開發(fā)網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)