編輯:關於Android編程
1、什麼是百度地圖API?
百度地圖移動版API(Android)是一套基於Android設備的應用程序接口,通過該接口,可以輕松訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。
百度地圖移動版API不僅包含構建地圖的基本接口,還提供了本地搜索、路線規劃、地圖定位等數據服務。
2、百度地圖的三大核心
SDKInitialzer 、 MapView 、 BaiduMap
3、百度地圖使用的准備工作
①獲取API Key ②建立工程 ③添加地圖引擎到Android工程中 ④添加權限 ⑤初始化地圖引擎 ⑥引入布局(地圖控件)
需要的權限:
"android.permission.ACCESS_COARSE_LOCATION"> "android.permission.ACCESS_FINE_LOCATION"> "android.permission.ACCESS_WIFI_STATE"> "android.permission.ACCESS_NETWORK_STATE"> "android.permission.CHANGE_WIFI_STATE"> "android.permission.READ_PHONE_STATE"> "android.permission.WRITE_EXTERNAL_STORAGE"> "android.permission.INTERNET"/> "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"> "android.permission.READ_LOGS">獲取APIKey
IntentFilterfilter = newIntentFilter(); filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(receiver,filter); public void onReceive(Contextcontext,Intent intent) { Stringresult = intent.getAction(); //判斷網絡 if (result .equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){ Toast.makeText(getApplicationContext(),"無網絡",0).show(); } //授權驗證 else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){ Toast.makeText(getApplicationContext(),"授權失敗",0).show(); } }控制管理 –通過MapView設置縮放控件showZoomControls(false),默認顯示 縮放級別:V2.0之前支持(3-18),V2.0之後多一級(3-19) 默認的縮放級別12 –設置地圖的中心位置
BaiduMapbaiduMap= mapView.getMap();
double latitude = 40.050966;//緯度
double longitude = 116.303128;//經度
LatLnghmPos= new LatLng(latitude,longitude);
BaiduMap:控制地圖移動、縮放、旋轉 –動畫形式移動:animateMapStatus(MapStatusUpdate) –縮放:MapStatusUpdateFactory:
zoomOut()—縮小;zoomIn()—放大;zoomTo(float)—指 定縮放級別;zoomBy(float)—按增量縮放級別;
–旋轉:MapStatus 水平方向:rotate(float),旋轉角范圍: 0~ 360 ,單位:度默認值為0度,逆時針旋轉為角度增大方向,通過BaiduMap的getM apStatus() .rotate獲取當前角度 俯視:overlook(float) ,俯角范圍:-45 ~ 0 , 單位:度 –指南針設置:UiSettings().setCompassPosition(new Point(x, y)),坐標系原點為MapView左上頂點 ,指南針在3D模式下自動 顯現,隱藏指南針UiSettings().setCompassEnabled(false) BaiduMap:處理地圖事件 –setOnMapClickListener(BaiduMap.OnMapClickListenerlistener)設置地圖單擊事件監聽者
setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)設置地圖Marker 覆蓋物點擊事件監聽者
setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)
設置地圖雙擊事件監聽者
snapshot(BaiduMap.SnapshotReadyCallback callback)
發起截圖請求
5、百度地圖加強 1、地圖圖層 2、覆蓋物 3、搜索 4、離線地圖 5.1、地圖圖層 ?什麼是地圖圖層 –地圖可以包含一個或多個圖層,每個圖層在每個級別都是由若干個圖塊組成的,它們覆蓋了地圖的整個表面。例如您所看到 包括街道、興趣點、學校、公園等內容的地圖展現就是一個圖層,另外交通流量的展現也是通過圖層來實現的。 ?圖層分類 –底圖 ?基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。 –實時交通信息圖:baiduMap.setTrafficEnabled(true) –衛星圖: baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE) ?衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。覆蓋物的層級壓蓋關系,具體如下(從下至上的順序):
1、基礎底圖(包括底圖、底圖道路、衛星圖等);
2、地形圖圖層(GroundOverlay);
3、熱力圖圖層(HeatMap);
4、實時路況圖圖層(BaiduMap.setTrafficEnabled(true););
5、百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););
6、底圖標注(指的是底圖上面自帶的那些POI元素);
7、幾何圖形圖層(點、折線、弧線、圓、多邊形);
8、標注圖層(Marker),文字繪制圖層(Text);
9、指南針圖層(當地圖發生旋轉和視角變化時,默認出現在左上角的指南針);
10、定位圖層(BaiduMap.setMyLocationEnabled(true););
11、彈出窗圖層(InfoWindow);
12、自定義View(MapView.addView(View););
5.2、覆蓋物 ?所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖標等。覆 蓋物擁有自己的地理坐標,當您拖動或縮放地圖時,它們會相應的處理。 ?覆蓋物包括:本地覆蓋物和搜索覆蓋物 –本地覆蓋物的抽象基類:OverlayOptions(核心類) –圓形覆蓋物:CircleOptions –文字覆蓋物:TextOptions –marker覆蓋物: MarkerOptions –圓點覆蓋物:DotOptions –ground 覆蓋物:GroundOverlayOptions –圓點覆蓋物:DotOptions –多邊形覆蓋物:PolygonOptions –折線覆蓋物:PolylineOptions –弧線覆蓋物:ArcOptions 添加覆蓋物:baiduMap.addOverlay(ooCircle);添加覆蓋物
overlay.setData(result);
overlay.addToMap();
overlay.zoomToSpan();
CircleOptions繪制步驟: –創建圓形: CircleOptions() 。 –設置圓心坐標:center(LatLngcenter) –設置圓填充顏色:fillColor(int color) ,16進制如:#00ff0000 透明、紅、綠、藍 –設置圓半徑:radius(intradius) –設置圓邊框信息:stroke(Strokestroke) –設置圓是否可見:visible(booleanvisible) –設置圓zIndex(顯示優先級)信息:zIndex(int zIndex),值越大優先級越高 TextOptions繪制步驟: –創建文字覆蓋物對象, TextOptions() –設置文字覆蓋物地理坐標:position(LatLng position) –設置文字覆蓋物旋轉角度,逆時針:rotate(float rotate) –設置文字覆蓋物的文字內容:text(java.lang.String text) –設置文字覆蓋物字體:typeface(Typefacetypeface) –設置文字覆蓋物可見性:visible(booleanvisible) –設置文字覆蓋物 zIndex:zIndex(int zIndex) –設置文字覆蓋物對齊方式,默認居中對齊:align(int alignX, int alignY) –設置文字覆蓋物背景顏色:bgColor(intbgColor) –設置文字覆蓋物額外信息:extraInfo(BundleextraInfo) –設置文字覆蓋物字體顏色,默認黑色:fontColor(intcolor) –設置文字覆蓋物字體大小:fontSize(intsize) MarkerOptions: 某個類型的覆蓋物,包含多個類型相同、顯示方式相同、處理方式相同的項時,使用此類。或者用來標記位置。 開發步驟 –設置 marker覆蓋物的位置坐標:position(LatLngposition) –設置 marker覆蓋物的標題:title(java.lang.String title) –設置 Marker覆蓋物的圖標:icon(BitmapDescriptor icon) –設置 marker是否允許拖拽,默認不可拖拽:draggable(booleandraggable)
option= newMarkerOptions().title("向北") .position(newLatLng(latitude+ 0.001, longitude)).icon(bitmap); baiduMap.addOverlay(option); option= newMarkerOptions().title("向東") .position(newLatLng(latitude,longitude + 0.001)).icon(bitmap); baiduMap.addOverlay(option); option= newMarkerOptions().title("向西南") .position(newLatLng(latitude- 0.001, longitude - 0.001)) .icon(bitmap); baiduMap.addOverlay(option);
5.3、搜索
百度地圖移動版API集成搜索服務包括: 位置檢索、周邊檢索、范圍檢索、公交檢索、駕乘檢索、步行檢索 核心類: PoiSearch和OnGetPoiSearchResultListenerRoutePlanSearch和OnGetRoutePlanResultListener
實現思路: –初始化PoiSearch類,通過setOnGetPoiSearchResultListener方法注冊搜索結果的監聽對象OnGetPoiSearchResultListener ,實現異步搜索服務。 –通過自定義MySearchListener實現類,處理不同的回調方法,獲得搜索結果。 –注意,OnGetPoiSearchResultListener只支持一個,以最後一次設置為准 結合覆蓋物展示搜索: –本地搜索覆蓋物:PoiOverlay –駕車路線覆蓋物:DrivingRouteOverlay –步行路線覆蓋物:WalkingRouteOverlay –換乘路線覆蓋物:TransitOverlay 本地搜索: ?POI(Pointof Interest興趣點)搜索有三種方式 –根據范圍和檢索詞發起范圍檢索searchInBound –周邊檢索searchNearby –城市poi檢索searchInCity –poi詳細信息檢索 searchPoiDetail ?結果的展示: PoiOverlay ?查詢加油站信息 –多種查詢方法,但結果的處理都在OnGetPoiSearchResultListener的onGetPoiResult方法中 –處理步驟: ?判斷服務器結果返回 ?創建poi覆蓋物 ?將服務器返回數據添加到poi覆蓋物中 ?添加覆蓋物到地圖addToMap ?縮放地圖,使所有Overlay都在合適的視野內 ?注意 –POI檢索結果每頁容量默認情況下為10,可以通過pageCapacity設置,支持1-50(10) –翻頁功能重新調用通過PoiSearch類的searchInXxx()方法並傳遞頁數角標pageNum來實現,該方法是異步函數,搜索成功 後會調用注冊的事件處理函數onGetPoiResult 返回查詢頁的結果。 路線搜索: ?駕車路線查詢 ?結果展示:DrivingRouteOverlay ?案例:從黑馬到傳智路線查詢 ?駕車路線查詢 –查詢:RoutePlanSearch.drivingSearch駕乘路線搜索,或者增加途經點. –PlanNode內容的設置:可以使用經緯度和地名,但不支持模糊查詢,需要輸入准確的名稱 –可以通過DrivingRoutePlanOption.policy (intpolicy) 來設置駕車路線規劃策略 –結果處理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result) ?步行路線查詢 ?結果展示: WalkingRouteOverlay –RoutePlanSearch. walkingSearch步行路線搜索. –結果處理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result) 換乘路線: ?僅公交路線搜索 ?結果展示:TransitRouteOverlay ?檢索:RoutePlanSearch. transitSearch ?通過TransitRoutePlanOption.policy (intpolicy) 設置路線規劃策略 ?結果處理:OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result) 地址解析服務: ?GeoCoder.geocode(GeoCodeOption option) –根據地址名獲取地址信息異步函數,返回結果在OnGetGeoCoderResultListener裡的onGetGeoCodeResult方法通知 ?GeoCoder.reverseGeoCode(ReverseGeoCodeOption option) –根據地理坐標點獲取地址信息異步函數,返回結果在OnGetGeoCoderResultListener裡的onGetReverseGeoCodeResult方法 通知 聯想詞搜索: ?SuggestionSearch . requestSuggestion(SuggestionSearchOption option) –查詢一系列與指定key相關的內容,結果中包括城市及包含key的名稱 –結果處理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result) 公交路線詳細信息搜索: ?檢索:BusLineSearch. searchBusLine(BusLineSearchOption option) ?busLineUid信息獲取:公交線路的uid,可以通過poi查詢返回的結果中獲取MKPoiInfo的uid。 –使用poiSearchInCity查詢公交線信息,利用PoiInfo的type可以判斷poi類型,當類型為公交線路時,記錄當前的PoiInfo中的ui d信息。 –利用獲取的uid信息進行公交線的查詢 –結果處理:在OnGetBusLineSearchResultListener. onGetBusLineResult(BusLineResult result)中進行結果的處理,此時使用 到的覆蓋物是BusLineOverlay0:普通點 1:公交站 2:公交線路 3:地鐵站 4:地鐵線路,
定位: ?LocationClient和BDLocationListener ?首先需要打開定位圖層BaiduMap.setMyLocationEnabled(true); ?設置監聽器LocationClient. registerLocationListener(BDLocationListener) ?設置定位模式baiduMap.setLocationMode(LocationMode) Hight_Accuracy,高精度定位模式:這種定位模式下,會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果; Battery_Saving,低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網絡定位(Wi-Fi和基站定位) Device_Sensors,僅用設備定位模式:這種定位模式下,不需要連接網絡,只使用GPS進行定位,這種模式下不支持室 內環境的定位 ?設置定位顯示模式BaiduMap.setMyLocationConfigeration(MyLocationConfiguration) ?定位數據獲取:在BDLocationListener. onReceiveLocation(BDLocation result)方法中設置定位數據,baiduMap.setMyLocationData(MyLocationData);
在百度地圖移動版API中,提供一個重要的特色功能:定位,通過這個功能,能獲取到用戶當前所在位置。在程序中,如果使用此功能,必須注冊GPS和網絡的使用權限。 在獲取用戶位置時,優先使用GPS進行定位;如果GPS定位沒有打開或者沒有可用位置信息,則會通過判斷網絡是否連接(即確認手機是否能上網,不論是連接2G/3G或Wi-Fi網絡),如果是,則通過請求百度網絡定位服務,返回網絡定位結果。為了使獲得的網絡定位結果更加精確,請打開手機的Wi-Fi開關。
目前系統自帶的網絡定位服務精度低,且服務不穩定、精度低,並且從未來的趨勢看,基站定位是不可控的(移動公司隨時可能更改基站編號以壟斷定位服務),而Wi-Fi定位則不然,它是一種精度更高、不受管制的定位方法。國內其它使用Wi-Fi定位的地圖軟件,Wi-Fi定位基本不可用,百度的定位服務量化指標優秀,網絡接口返回速度快(服務端每次定位響應時間50毫秒以內),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆蓋率98%,在國內處於一枝獨秀的地位。
注意
關於經緯度的說明:該經緯度信息是經過加密處理,所以在其它地圖工具中測得的經緯度信息不適合百度的坐標系統。使用百度經緯度坐標,可以通過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理坐標如果需要在百度地圖上顯示使用其他坐標系統的位置,請發郵件至[email protected]申請坐標轉換接口
http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
mLocationClient = newLocationClient(getApplicationContext()); myListener = newMylocationListener(); mLocationClient.registerLocationListener(myListener); LocationClientOptionoption = newLocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);//設置定位模式 option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,默認值gcj02 option.setScanSpan(5000);//設置發起定位請求的間隔時間為5000ms option.setIsNeedAddress(true);//返回的定位結果包含地址信息 option.setNeedDeviceDirect(true);//返回的定位結果包含手機機頭的方向 mLocationClient.setLocOption(option); baiduMap.setMyLocationEnabled(true); baiduMap.setMyLocationConfigeration(newMyLocationConfiguration( MyLocationConfiguration.LocationMode.COMPASS,true, BitmapDescriptorFactory.fromResource(R.drawable.icon_geo))); public void onReceiveLocation(BDLocationresult) { if (result != null) { double latitude2 = result.getLatitude(); double longitude2 = result.getLongitude(); MyLocationData data= newMyLocationData.Builder() .latitude(latitude2).longitude(longitude2).build(); baiduMap.setMyLocationData(data); } } } @Override public booleanonKeyDown(intkeyCode,KeyEventevent) { switch (keyCode){ case KeyEvent.KEYCODE_1: baiduMap.setMyLocationConfigeration(newMyLocationConfiguration( MyLocationConfiguration.LocationMode.NORMAL,true, BitmapDescriptorFactory.fromResource(R.drawable.icon_geo))); break; case KeyEvent.KEYCODE_2: baiduMap.setMyLocationConfigeration(newMyLocationConfiguration( MyLocationConfiguration.LocationMode.COMPASS,true, BitmapDescriptorFactory.fromResource(R.drawable.icon_geo))); break; case KeyEvent.KEYCODE_3: baiduMap.setMyLocationConfigeration(newMyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING,true, BitmapDescriptorFactory.fromResource(R.drawable.icon_geo))); break; default: break; } return super.onKeyDown(keyCode,event); }
離線地圖:
?離線文件下載 –http://shouji.baidu.com/map/map.html?from=3052,指定機型和城市下載對應的離線地圖 –2.0以上版本處理步驟 ?將下載好的離線地圖包解壓縮。 ?找到解壓出的"BaiduMap"文件夾,把它放入手機存儲卡根目錄。在上述過程中如遇提示“是否需要覆蓋文件”,點擊確定即可。 ?斷開與電腦連接,打開百度手機地圖(如已打開請重啟),系統會提示導入成功。 ?提示:下載多個城市包時,經解壓後,這些城市數據都會被同時解壓到BaiduMap文件夾中,不同城市不會出現被覆蓋的情況 –1.X版本處理步驟 ?將離線地圖加壓,把Mapdata文件夾拷入SD卡根目錄下的BaiduMapSdk下 ?利用MKOfflineMap在初始化(init)後調用scan()掃描本地地圖資源/** 離線地圖初始化 **/ mOffline =new MKOfflineMap(); mOffline.init(mBMapMan, newMKOfflineMapListener() { public void onGetOfflineMapState(inttype, intstate) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElementupdate = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s: %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo",String.format("addofflinemap num:%d",state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo",String.format("newofflinemap ver")); break; } } } ); /** 離線地圖導入離線包**/ int num = mOffline.scan();
最近在看一些關於Material Design的東西,還記得在博客《你所不知道的Activity轉場動畫——ActivityOptions》中,我
前段時間項目有需要要顯示彩色探測點的二維碼,網上搜了下,有基於java,c等的源碼。網上的java源碼直接照搬有些問題,自己改了改。不說廢話,先上結果圖。原理其實很簡單,
什麼是JSONJSON 指的是 JavaScript 對象表示法(JavaScript Object Notation) JSON 是輕量級的文本數據交換格式 JSON
先看看效果圖:首先過程中碰到的幾個問題: 1、對 EditText 進行自定義背景 2、運行時自動 EditText 自動獲得焦點 3、在獲