Android的百度地圖開發(fā).ppt_第1頁(yè)
Android的百度地圖開發(fā).ppt_第2頁(yè)
Android的百度地圖開發(fā).ppt_第3頁(yè)
Android的百度地圖開發(fā).ppt_第4頁(yè)
Android的百度地圖開發(fā).ppt_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android的百度地圖開發(fā),Android進(jìn)階,百度地圖API平臺(tái)介紹,百度地圖 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系統(tǒng))及以上版本設(shè)備的應(yīng)用程序接口??梢允褂迷撎?SDK開發(fā)適用于Android系統(tǒng)移動(dòng)設(shè)備的地圖應(yīng)用,通過調(diào)用地圖SDK接口,您可以輕松訪問百度地圖服務(wù)和數(shù)據(jù),構(gòu)建功能豐富、交互性強(qiáng)的地圖類應(yīng)用程序。 百度地圖Android SDK提供的所有服務(wù)是免費(fèi)的,接口使用無次數(shù)限制。您需申請(qǐng)密鑰(key)后,才可使用百度地圖Android SDK。任何非營(yíng)利性產(chǎn)品請(qǐng)直接使用。,百度地圖API平臺(tái),百度地圖API

2、網(wǎng)址: 獲取密鑰 申請(qǐng)新密鑰及查看原先申請(qǐng)的密鑰 開發(fā)指南 在安卓平臺(tái)上使用百度地圖的開發(fā)指南 類參考 地圖庫(kù)所提供的類及方法說明 相關(guān)下載 開發(fā)所使用的相關(guān)包及說明示例下例,申請(qǐng)key,點(diǎn)擊 獲取密鑰 進(jìn)入密鑰申請(qǐng)頁(yè)并閱讀相關(guān)的使用條款 勾選 已閱讀并同意條款 填寫應(yīng)用名稱 填寫一下應(yīng)用的相應(yīng)功能及描述 輸入驗(yàn)證碼確定后 密鑰即可申請(qǐng)成功,如何把API 添加到我的Android工程中,在工程里新建libs文件夾(若不存在的話),將開發(fā)包里的baidumapapi_v2_1_1.jar拷貝到libs根目錄下,將libapp_BaiduMapApplib_v2_1_1.so和libvi_vosl

3、ib.so 拷貝到libsarmeabi目錄下 項(xiàng)目屬性中Java Build Path-Order and Export中,確定Android Private Libaries與Android Dependencies這兩項(xiàng)前面的選擇框被選上后,點(diǎn)確定 菜單Project-clean重新編譯項(xiàng)目后就可以正常使用地圖中的功能進(jìn)行編程了。 上圖包中的liblockSDK3.1.jar及對(duì)應(yīng)的so文件是用于定位與搜索功能的,如果不需要可以不加入到項(xiàng)目當(dāng)中,項(xiàng)目清單添加權(quán)限,在Manifest中添加使用權(quán)限, ,項(xiàng)目清單添加權(quán)限,在清單文件中添加對(duì)屏幕的支持, ,對(duì)需要加載地圖的Activity進(jìn)行

4、屬性設(shè)置,項(xiàng)目清單添加權(quán)限,在布局中添加百度地圖顯示控件,這個(gè)就是加載百度地圖的控件框,這個(gè)布局你可以根據(jù)自己的需要進(jìn)行調(diào)整,或是放置到你的Activity需要的地方去。此控件需要接收到點(diǎn)擊事件,所以需要把clickable設(shè)置成true。,MapActivity基類,管理顯示在MapView類中activity處理邏輯的基礎(chǔ)類 。MapActivity這個(gè)基類不是必須的,但一般情況下,我們會(huì)把地圖配置處相關(guān)處理代碼放在基類中,然后在實(shí)現(xiàn)此基類的子類中專心實(shí)現(xiàn)業(yè)務(wù)的相關(guān)邏輯,而不是把大量的地圖設(shè)置與業(yè)務(wù)邏輯混雜在一起。它的責(zé)任包括: Activity及地圖生命周期管理 地圖控制相關(guān)配置 在一個(gè)

5、MapView后面創(chuàng)建和銷毀服務(wù) 定位結(jié)果返回后的處理,BMapManager,地圖、定位、搜索功能都需要用BMapManager對(duì)象來管理, BMapManager提供四個(gè)接口:init()、start()、stop()、destroy()。在應(yīng)用程序里生成BMapManager 對(duì)象并初始化,在程序退出時(shí)調(diào)用destroy(),在需要使用sdk功能的Activity的onCreate()方法里調(diào)用start()方法,onDestroy()方法里調(diào)用stop()方法,或者onResume()/onPause()分別調(diào)用start()和stop()。 常用方法: destroy() : 在程序

6、退出前調(diào)用 boolean init(java.lang.StringstrKey, MKGeneralListener listener) 初始化地圖引擎,需要送入申請(qǐng)的百度地圖Key boolean start() :開啟百度地圖API boolean stop(): 終止百度地圖API,調(diào)用此函數(shù)后,不會(huì)再發(fā)生回調(diào),MKGeneralListener,一般事件通知接口,該接口返回網(wǎng)絡(luò)狀態(tài),授權(quán)驗(yàn)證等結(jié)果,用戶需要實(shí)現(xiàn)該接口以處理相應(yīng)事件 。 void onGetPermissionState(intiError) : 返回授權(quán)驗(yàn)證錯(cuò)誤 ,iError 為錯(cuò)誤號(hào),值為300,驗(yàn)證失敗 vo

7、id onGetNetworkState(int iError) 返回網(wǎng)絡(luò)錯(cuò)誤 參數(shù):iError - 錯(cuò)誤號(hào),MapView,一個(gè)顯示地圖的視圖控件,當(dāng)被焦點(diǎn)選中時(shí),它能捕獲按鍵事件和觸摸手勢(shì)去平移和縮放地圖 setBuiltInZoomControls(booleanon):設(shè)置是否啟用內(nèi)置的縮放控件 getController():返回地圖的MapController,這個(gè)對(duì)象可用于控制和驅(qū)動(dòng)平移和縮放 setDoubleClickZooming(booleanbDoubleClickZooming) :設(shè)置mapview是否支持雙擊放大效果 getOverlays():獲取當(dāng)時(shí)地圖控件

8、中的已有圖層 refresh(): 刷新此地圖控件,MapController,處理地圖移動(dòng)和縮放的工具類 setCenter(GeoPointpoint) :設(shè)置地圖視圖中心點(diǎn),必須設(shè)置中心點(diǎn)才能顯示地圖 setZoom(intzoomLevel) :設(shè)置地圖的縮放級(jí)別。3-19值越大地圖上建筑越大 zoomIn/Out():放大/縮小一個(gè)級(jí)別 animateTo(GeoPoint p,Message m):以動(dòng)畫的方式將地圖視圖移到到指定點(diǎn)上,結(jié)果后發(fā)送一個(gè)指定的消息。,GeoPoint(int latitudeE6,int longitudeE6) 普通經(jīng)緯度要乘以106 表示一個(gè)地理坐

9、標(biāo)點(diǎn),存放經(jīng)度和緯度,以微度的整數(shù)形式存儲(chǔ),LocationClient,定位處理功能的核心類 registerLocationListener(BDLocationListener)接收到定位數(shù)據(jù)后可由指定監(jiān)聽器中的onReceiveLocation(BDLocation)的方法來接收相關(guān)的數(shù)據(jù)并做相關(guān)的處理 構(gòu)造: new LocationClient(getApplicationContext() setLocOption(LocationClientOption)設(shè)置定位的參數(shù) start()啟動(dòng)定位功能,此功能是持續(xù)的,可以定義間隔刷新時(shí)間 stop()結(jié)束定位功能,但前面設(shè)置的定位

10、參數(shù)不會(huì)消失,可以再啟動(dòng) requestLocation() 發(fā)起異步定位請(qǐng)求,如果位置沒有變化,不會(huì)發(fā)起網(wǎng)絡(luò)請(qǐng)求,直接返回上次的位置。(2次間隔需要大于1秒),LocationClientOption,設(shè)置定位功能的定位方式 disableCache(boolean) 真表示禁用緩存定位 setOpenGPS(boolean) 是否使用GPS定位,前提是手機(jī)打開了GPS定位 setAddrType(String) 當(dāng)字串為all時(shí)返回此位置地址信息,其它不返回 setCoorType(String) 設(shè)置返回坐標(biāo)的格式 gcj02 - 國(guó)測(cè)局bd09百度墨卡托bd0911百度經(jīng)緯坐標(biāo)(手機(jī)默

11、認(rèn)) setScanSpan(int) 定時(shí)定位的時(shí)間間隔(ms) 此值大于1000時(shí),每隔此值指定的時(shí)間就會(huì)發(fā)起一次定位 此值小于1000時(shí)或不設(shè)置此值時(shí),調(diào)用一次requestLocation()方法則定位一次,LocationData,保存用戶位置的數(shù)據(jù)實(shí)例 double latitude 緯度值 double longitude 經(jīng)度值 float accuracy 定位精度 float direction GPS定位時(shí)的方向角度 int satellitesNum GPS衛(wèi)星的數(shù)量 speed GPS定位時(shí)速度,MapActivity代碼,protected void onDestr

12、oy() mapView.destroy(); if (mapManager != null) mapManager.destroy(); mapManager = null; super.onDestroy(); ,protected void onPause() mapView.onPause(); if (mapManager != null) mapManager.stop(); super.onPause(); ,protected void onResume() mapView.onResume(); if (mapManager != null) mapManager.start

13、(); super.onResume(); ,地圖代碼示例,protected void onCreate(Bundle savedInstanceState) /MapActivity基類的Create super.onCreate(savedInstanceState); mapManager = new BMapManager(getApplication(); mapManager.init(BAIDU_MAP_KEY, null); locationClient = new LocationClient(getApplicationContext(); locationClient.

14、registerLocationListener(this); LocationClientOption lco = new LocationClientOption(); lco.setOpenGps(true); lco.setCoorType(bd09ll); lco.setPriority(LocationClientOption.GpsFirst); / lco.setScanSpan(5000); locationClient.setLocOption(lco); locData = new LocationData(); ,protected void initMap(int m

15、apId) /初始化地圖 mapView = (MapView) findViewById(mapId); mapView.setBuiltInZoomControls(true); mc = mapView.getController(); locData.latitude = 39.915d; locData.longitude = 116.404d; mc.setCenter(new GeoPoint(int) (locData.latitude * 1e6), (int) (locData.longitude * 1e6); mc.enableClick(true); mc.setZo

16、om(14); locationOverlay = new MyLocationOverlay(mapView); mapView.getOverlays().add(locationOverlay); locationOverlay.enableCompass(); mapView.refresh(); ,地圖示例效果圖,mapView.setTraffic(true),mapView.setSatellite(true),覆蓋物,所以疊加或覆蓋到地圖的內(nèi)容,統(tǒng)稱為地圖覆蓋物。如標(biāo)注、矢量圖形元素(包括折線、多邊形和圓)、定位圖標(biāo)等。覆蓋物擁有自己的地理坐標(biāo),當(dāng)拖動(dòng)或縮放地圖時(shí),覆蓋物也會(huì)做

17、相應(yīng)的移動(dòng)。 地圖API提供如下幾種覆蓋物: Overlay:覆蓋物的抽象基類,所有的覆蓋物都繼承此類的方法,實(shí)現(xiàn)用戶自定義圖層顯示。 MyLocationOverlay: 負(fù)責(zé)顯示用戶當(dāng)前位置的Overlay。 ItemizedOverlay:Overlay的一個(gè)基類,包含了一個(gè)OverlayItem列表,相當(dāng)于一組分條的Overlay,通過繼承此類,將一組興趣點(diǎn)顯示在地圖上。 PoiOverlay:本地搜索圖層,提供某一特定地區(qū)的位置搜索服務(wù),比如北京市搜索公園,通過此圖層將公園顯示在地圖上。 PopupOverlay 用于快速在特定位置顯示一個(gè)彈窗,通常用于導(dǎo)航,搜索定位點(diǎn)的提供 Rou

18、teOverlay:步行、駕車導(dǎo)航線路圖層,將步行、駕車出行方案的路線及關(guān)鍵點(diǎn)顯示在地圖上。 TransitOverlay:公交換乘線路圖層,將某一特定地區(qū)的公交出行方案的路線及換乘位置顯示在地圖上。,覆蓋物類繼承圖,com.baidu.mapapi.map.Overlay,GraphicsOverlay,MyLocationOverlay,PopupOverlay,ItemizedOverlay,PoiOverlay,RouteOverlay,TransitOverlay,標(biāo)注我的位置,MyLocationOverlay myLay = new MyLocationOverlay(mapVi

19、ew); LocationData locData = new LocationData(); locData.latitude = 26.04968d; locData.longitude = 119.307784d; /手動(dòng)設(shè)定經(jīng)緯度 myLay.setData(locData); mapView.getOverlays().add(myLay ); mapView.refresh(); mapView.getController().animateTo(newGeoPoint(int)(locData.latitude*1e6), (int)(locData.longitude* 1e6

20、);,在實(shí)際的開發(fā)中,位置的經(jīng)緯度是要通過LocationClient接口去獲取的 可以看到位置圖層不僅可以顯示所在的點(diǎn),還可以顯示定位信號(hào)的誤差范圍(藍(lán)色的圈表示),標(biāo)注圖形及文字,Bitmap bp = Bitmap.createBitmap(120, 120, Config.ARGB_8888); /需要繪制的圖形 Canvas c = new Canvas(bp); Paint p = new Paint(); p.setColor(android.graphics.Color.BLUE); Bitmap arrow = BitmapFactory.decodeResource(get

21、Resources(), android.R.drawable.arrow_down_float); /獲取圖形資源庫(kù)中的箭頭圖形 c.drawBitmap(arrow, 60, 60, p); p.setTextSize(20); c.drawText(中心點(diǎn), 60, 60, p); BitmapDrawable bd = new BitmapDrawable(bp); /通過此類進(jìn)行Bitmap至Drawable轉(zhuǎn)換 ItemizedOverlay cLay = new ItemizedOverlay(bd, mapView); OverlayItem centerItem = new

22、OverlayItem(mapView.getMapCenter(), 中心點(diǎn), 搜索的中心點(diǎn)); cLay.addItem(centerItem); mapView.getOverlays().add(cLay); mapView.refresh();,如果僅需要繪制圖形,只需要在new ItemizedOverlay構(gòu)造的第一個(gè)參數(shù)送入相應(yīng)的Drawable資源文件就可以了 如果需要繪制文字,則需要先將文字繪制在圖形文件中,然后再把圖形文件通過ItemizedOverlay對(duì)象繪制到地圖上即可,根據(jù)范圍和關(guān)鍵字檢索位置,MKSearch search=new MKSearch(); sea

23、rch.init(bmm, new MySearchListener(); search.poiSearchNearBy(searchText.getText().toString(), mapView.getMapCenter(), 2000);,public void onGetPoiResult(MKPoiResult res, int type, int error) if (mapView = null) return; if (error = MKEvent.ERROR_RESULT_NOT_FOUND) Toast.makeText(XRMapActivity.this, 抱歉,

24、未找到結(jié)果, 0).show(); return; else if (error != 0 | res = null) Toast.makeText(XRMapActivity.this, 抱歉,搜索出錯(cuò), 0).show(); return; Overlay o = null; for (Iterator ir = mapView.getOverlays().iterator(); ir.hasNext();) o = (Overlay) ir.next(); if (o instanceof PoiOverlay) ir.remove(); mapView.refresh(); /去除上次

25、搜索的結(jié)果 PoiOverlay pLay = new PoiOverlay(XRMapActivity.this, mapView); pLay.setData(res.getAllPoi(); /獲取查詢返回的結(jié)果 mapView.getOverlays().add(pLay); mapView.refresh(); ,標(biāo)注搜索范圍,mapView.getOverlays().clear(); mapView.refresh(); /清除先前生成的內(nèi)容 GraphicsOverlay gLay = new GraphicsOverlay(mapView); Geometry geo = n

26、ew Geometry(); geo.setCircle(mapView.getMapCenter(), 2000); /使用一個(gè)圓來表示范圍 Symbol sym = new Symbol(); Symbol.Color circleColor = sym.new Color(); circleColor.alpha = 80; /設(shè)置透明度 circleColor.red = 0; circleColor.green = 200; /綠色的圓 circleColor.blue = 0; sym.setSurface(circleColor, 1, 1); /第一個(gè)參數(shù)表示圓需要填充,后面表

27、示邊界 Graphic gra = new Graphic(geo, sym); gLay.setData(gra); mapView.getOverlays().add(gLay); mapView.refresh();,上面這個(gè)圖是疊加了前面三種圖層產(chǎn)生的綜合結(jié)果,其中的綠色圓圈,為右側(cè)代碼所生成,路線搜索,/先要查詢出來當(dāng)前地圖中心點(diǎn)所在的城市名稱 search.reverseGeocode(mapView.getMapCenter();,public void onGetAddrResult(MKAddrInfo res, int error) if (error != 0 | res

28、 = null) return; String city = res.addressComponents.city; MKPlanNode startNode = new MKPlanNode(); startN = startText.getText().toString(); MKPlanNode endNode = new MKPlanNode(); endN = endText.getText().toString(); switch (radioGroup.getCheckedRadioButtonId() case R.id.radio0: sear

29、ch.walkingSearch(city, startNode, city, endNode); break; case R.id.radio1: /可以設(shè)置策略,最省時(shí),或最省錢 search.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); search.drivingSearch(city, startNode, city, endNode); break; case R.id.radio2: search.transitSearch(city, startNode, endNode); break; /獲取到city字串后就可以調(diào)用相關(guān)的接口實(shí)現(xiàn)

30、相關(guān)的功能,由于相關(guān)的接口需要指定搜索所在的城市名,所以我們可以先通過接口獲取相關(guān)的城市名,再調(diào)用后續(xù)的搜索接口展示不同的路線結(jié)果。,路線搜索,public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) /步行 if (error != 0 | res = null) return; mapView.getOverlays().clear(); mapView.refresh(); RouteOverlay ro = new RouteOverlay(XRMapActivity.this, mapView);

31、 ro.setData(res.getPlan(0).getRoute(0); mapView.getOverlays().add(ro); mapView.refresh(); /駕車代碼與其完全一樣,只有參數(shù)名不一樣 MKDrivingRouteResult,public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) /公交 if (error != 0 | res = null) return; mapView.getOverlays().clear(); mapView.refresh(); Tran

32、sitOverlay to = new TransitOverlay(XRMapActivity.this, mapView); to.setData(res.getPlan(0); mapView.getOverlays().add(to); mapView.refresh(); /公交用的圖層與上面的不一樣,路線搜索效果圖,不同的搜索類型在點(diǎn)擊地圖上的相關(guān)圖標(biāo)點(diǎn)時(shí),提示也會(huì)有不同。比如公交線路搜索會(huì)直接提示需要坐幾路車,經(jīng)過多少站。,公交詳細(xì)路線圖,查找公交線路需要分三步進(jìn)行 查找當(dāng)前視圖中心點(diǎn)所在城市名稱 查找此城市指定線路的uid 根據(jù)城市名稱及線路uid查詢所有的站點(diǎn)并標(biāo)注相關(guān)信息,

33、/查找城市名 search.reverseGeocode(mapView.getMapCenter(); public void onGetAddrResult(MKAddrInfo res, int error) if (error != 0 | res = null) return; String city = res.addressComponents.city; search.poiSearchInCity(city, K2); /查找線路uid Log.d(city, city); ,公交詳細(xì)路線圖,/查找線路uid public void onGetPoiResult(MKPoiR

34、esult res, int type, int error) MKPoiInfo curInfo = null; for (int i = 0; i res.getNumPois(); i+) curInfo = res.getPoi(i); if (2 = curInfo.ePoiType) /指定公交線路類型 break; Log.d(uid, curInfo.uid); search.busLineSearch(city, curInfo.uid); /搜索線路信息 ,/搜索線路信息 public void onGetBusDetailResult(MKBusLineResult re

35、s, int error) if (error != 0 | res = null) return; mapView.getOverlays().clear(); mapView.refresh(); RouteOverlay ro = new RouteOverlay(XRMapActivity.this, mapView); ro.setData(res.getBusRoute(); /將線路輸出到圖層 mapView.getOverlays().add(ro); mapView.refresh(); Log.d(res, res.getBusName(); /打印出線路名稱(帶起止站名稱) searchType = 0;,可以看出,其實(shí)都是圖層處理其實(shí)都是大同小異的,只是數(shù)據(jù)源不同而已??梢酝ㄟ^多步調(diào)用的方式,一步一步地從百度提供的API中獲取我們所關(guān)心的數(shù)據(jù)內(nèi)容,最后再將這些數(shù)據(jù)展示在地圖圖層中,就完成了我們所需要的效果。,實(shí)現(xiàn)定位與目的地導(dǎo)航,從v2.1.1 版本開始,sdk提供一鍵調(diào)起百度地圖客戶端導(dǎo)航功能,而無需再自己實(shí)現(xiàn)相關(guān)的功能。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論