您好,登錄后才能下訂單哦!
1. 怎么接入百度SDK,百度文檔說得很明白,我就不說了。
2. 注意
1)初始化的時候,上下文用全局的,即ApplicationContext。
2)要在Activity的相應生命周期方法里調用MapView對應的生命周期方法。
3. 百度地圖的核心類:
1)SDKInitializer 百度地圖初始化類
》》注冊網絡錯誤、key驗證錯誤的廣播
這樣一樣百度地圖崩潰了,或者出異常了,就知道有沒有可能是這一塊出現了問題。
private void initSDK() { SDKInitializer.initialize(getApplicationContext()); //注冊網絡錯誤和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(), "網絡錯誤", 0).show(); }else if(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){ Toast.makeText(getApplicationContext(), "key驗證失敗", 0).show(); } } }
2)MapView 顯示百度地圖的組件
》》設置綻放按鈕顯示與隱藏
mMapView.showZoomControls(false);
》》設置比例尺顯示與隱藏
mMapView.showScaleControl(false);
》》替換百度地圖logo
將"baidumapapi_v3_3_0.jar"復制到桌面,然后解壓,將assets目錄下的logo_h,logo_l
用自己的圖片替換掉。然后再將jar包拷貝回去。
可以做addView操作,而BaiduMap是addOverlay()添加覆蓋物。
3)BaiduMap 控制器 通過MapView.getMap()獲取
》》設置地圖的狀態 map.setMapStatus(MapStatusUpdate)
通過MapStatusUpdateFactory.方法()可以得到參數
//設置地圖的綻放級別
MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(18); map.setMapStatus(zoom);
//設置中心點,注意LatLng的構造函數latitude,longtitude,分別為緯度、經度,在百度地
圖上查的坐標與這個正好相反的。
map.setMapStatus(MapStatusUpdateFactory.newLatLng( new LatLng(40.050513,116.30361)));
Android百度地圖默認位置中心點設置
http://blog.csdn.net/xyy410874116/article/details/32094157
//旋轉百度地圖(以中心點)
//得到地圖之前的狀態和角度 MapStatus mapStatus = map.getMapStatus(); float preRotate = mapStatus.rotate; //利用MapStatus.Builder靜態內部類來構造新的狀態,對之前狀態的角度累加一個 值。 Builder builder = new MapStatus.Builder(); MapStatus newStatus = builder.rotate(preRotate + 30).build(); //將新的狀態設置給百度地圖 map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus));
//翻轉百度地圖(以直線),改變俯角,也就是看百度地圖的角度。
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方法有重載形式,可以指定動畫的時長。(默認300ms)
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newLatLng( LatLng(39.979982, 116.309258)); map.animateMapStatus(statusUpdate);
》》更改底圖和添加交通圖圖層
//底圖設置為默認的
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//底圖設置成衛星圖
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//顯示交通圖圖層
map.setTrafficEnabled(true);
4)OverlayOptions 本地覆蓋物的抽象基類
OverlavOptions關于覆蓋物的操作:
1)創建覆蓋物
2)給覆蓋物添加數據
一般都要設置坐標(覆蓋物具體擺在哪兒)
其它的。。。
3)把覆蓋物添加到地圖上
例1:添加圓形覆蓋物 CircleOptions
//創建圓形覆蓋物 CircleOptions options = new CircleOptions(); //設置數據 //圓心坐標 options.center(new LatLng(40.050513,116.30361)) //圓半徑 .radius(1000) //填充顏色 .fillColor(Color.BLUE) //圓的邊框寬度和顏色 .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);
效果如下圖:
通過上面的兩個例子,發現,文字(包括百度地圖本身的文字)并不會隨著地圖一起縮放,
但是圓形覆蓋物會隨著地圖一起縮放。
例3:添加標記覆蓋物 MarkerOptions
MarkerOptions options = new MarkerOptions(); BitmapDescriptor icon; options.position(testPos) .title("我在北京") //是否可拖拽 .draggable(true) //圖標(工廠創建) .icon(BitmapDescriptorFactory.fromResource(R.drawable.eat_icon)); map.addOverlay(options);
作為一個注重產品性能的程序員,應該在設置icon的時候創建一個BitmapDescriptor的引用,
在onDestroy里回收資源
//釋放圖片資源 bitmapDescriptor.recycle();
4)OverlavManager 搜索覆蓋物的抽象基類
顯示和管理多個Overlay的基類
|--本地搜索覆蓋物:PoiOverlay
|--駕車路線覆蓋物:DrivingRouteOverlay
|--步行路線覆蓋物:WalkingRouteOverlay
|--換乘路線覆蓋物:TransitOverlay
|--公交路線覆蓋物:BusLineOverlay
百度地圖移動版API集成搜索服務包括
|---位置檢索、周邊檢索、范圍檢索 (點搜索)
使用PoiSearch和OnGetPoiSearchResultListener核心類
|---公交檢索、駕乘檢索、步行檢索 (線搜索)
使用RoutePlanSearch和OnGetRoutePlanResultListener核心類
POI(Point of Interest興趣點)搜索有三種方式
根據范圍和檢索詞發起范圍檢索searchInBound
周邊檢索searchNearby
城市poi檢索searchInCity
poi詳細信息檢索 searchPoiDetail
結果的展示: PoiOverlay
例1:搜索指定范圍內的加油站(矩形區域搜索)
private void search() { PoiSearch search = PoiSearch.newInstance(); search.setOnGetPoiSearchResultListener(new MyOnGetPoiSearchResultListener()); //范圍內搜索 PoiBoundSearchOption boundOption = new PoiBoundSearchOption(); //搜索關鍵字 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) { //詳情搜索在此處理結果 } @Override public void onGetPoiResult(PoiResult result) { if(result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { return ; //無搜索結果 } //找到搜索結果 //創建覆蓋物 MyOverlay overlay = new MyOverlay(map); //++++++++監聽覆蓋物的點擊事件++++++++++ map.setOnMarkerClickListener(overlay); //為覆蓋物綁定數據 overlay.setData(result); //將覆蓋物添加到地圖上 overlay.addToMap(); //顯示全部的搜索結果 overlay.zoomToSpan(); } } //自定義一個實現了點擊事件的覆蓋物 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:搜索周邊的地鐵站(圓形區域搜索)
原理和加油站的搜索一下,只是PoiSearch調用的方法及方法的參數不同,監聽者不用改變。
可以進行共用。
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.keyword("地鐵站") .radius(1000) .location(testPos); search.searchNearby(nearbySearchOption);
上面兩個例子,MyOverlay在監聽點擊的時候,得到了覆蓋物的PoiInfo,通過PoiInfo又可以得
到uid,根據uid就可以發起詳情搜索:
//詳情搜索 protected void detailSearch(PoiInfo poiInfo) { PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption(); detailSearchOption.poiUid(poiInfo.uid); search.searchPoiDetail(detailSearchOption); }
監聽詳情搜索結果
@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("武術館") .pageNum(pageIndex ++); //分布顯示數據 search.searchInCity(citySearchOption); }
注意分頁顯示數據的時候,要清除之前的數據,在onGetPoiResult方法里:
//清除數據,防止分布的時候顯示前一頁的數據。 map.clear();
4. 百度地圖高級開發:
案例1:泡泡提示信息
第1步:初始化PopView,并添加到MapView當中,隱藏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覆蓋物的點擊監聽
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的開發。下面要說的就是定位SDK使用,就是定位手機當前的
位置。照著百度定位SDK開發文檔做,但是代碼需要有一定的改動。
代碼如下:
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 ); //注冊監聽函數 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 );//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備 option.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果坐標系 int span=1000; option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要 option.setOpenGps(true);//可選,默認false,設置是否使用gps option.setLocationNotify(true);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果 option.setIgnoreKillProcess(false);//可選,默認false,定位SDK內部是一個SERVICE,并放到了獨立進程,設置是否在stop的時候殺死這個進程,默認殺死 option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集 mLocationClient.setLocOption(option); //設置自己的定位圖標 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()); //經度 map.setMyLocationEnabled(true); //允許定位圖層 map.setMyLocationData(builder.build()); //設置定位數據 } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。