您好,登錄后才能下訂單哦!
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);
效果如下圖:
例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ā)現(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; }
效果圖如下:
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ù) } } }
免責(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)容。