歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發教程:NextBus之顯示實時車輛位置信息

Android開發教程:NextBus之顯示實時車輛位置信息

日期:2017/3/1 11:02:59   编辑:Linux編程

要實現的功能如下:首先點擊menu會顯示兩條路線(僅僅做簡單的模擬),點擊路線之後去下載本條路線實時的車輛信息,並且畫在地圖上。點擊另外一條路線的時候也執行以上操作,並且把原來的圖像擦除。

好,我們首先新建一個工程TestActivity,繼承與MapActivity,同時在layout的main.xml文件中加上mapview控件

  1. <com.google.Android.maps.MapView
  2. android:clickable="true"
  3. android:layout_width="fill_parent"
  4. android:id="@+id/mapView"
  5. android:layout_height="fill_parent"
  6. android:apiKey="0GPDZeAXmGQ3vHfDbNitJWUp-lghBsV8jouMc5g"
  7. ></com.google.android.maps.MapView>

還有哦,不要忘記在androidmanifest中添加上<uses-library android:name="com.google.android.maps" />,至於權限什麼的,多加幾條就多加幾條吧

  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  2. <uses-permission android:name="android.permission.INTERNET" />
  3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  4. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  5. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  6. <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

好,到此為止,至少打開我們新建的工程能夠正常的顯示google地圖了。

接下來,變量初始化一下

  1. mapView = (MapView) findViewById(R.id.mapView);
  2. mapView.setStreetView(true);
  3. mapView.setBuiltInZoomControls(true);
  4. mapOverlays = mapView.getOverlays();
  5. myloctionController=mapView.getController();

然後模擬個兩條路線吧,在menu裡面menu.add(0,0,0,"choose a route");在這個選項的點擊響應中添加個函數showroutelist(),routestrings裡面當然是放兩條路線咯

  1. private void showRouteList() {
  2. // TODO Auto-generated method stub
  3. final ArrayList<String> routeStrings=new ArrayList<String>();
  4. routeStrings.add("1");
  5. routeStrings.add("10");
  6. ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.item, R.id.textViewId, routeStrings);
  7. AlertDialog.Builder builder=new AlertDialog.Builder(this);
  8. builder.setTitle("當前兩條路線");
  9. builder.setAdapter(adapter, new OnClickListener() {
  10. @Override
  11. public void onClick(DialogInterface dialog, int which) {
  12. // TODO Auto-generated method stub
  13. achieveAllDirection(routeStrings.get(which));
  14. }
  15. });
  16. builder.show();
  17. }

這裡得到了我們點擊的路線的名稱,根據路線名稱我們可以下載到路線上所有車子的實時信息,下過來存在一個string中,然後把這個string拿來解析,將獲得的數據放在ArrayList<VehicleLocationsData> vehicleLocationsData中把,VehicleLocationsData有多個數據成員,包括汽車的朝向,速度,經緯度等等。

  1. private void achieveAllDirection(String RouteName) {
  2. String path="http://webservices.nextbus.com/service/publicXMLFeed?command=vehicleLocations&a=mbta&r="+RouteName+"&t=0";
  3. HttpDownloader hd = new HttpDownloader();//下載實時信息
  4. String resultStr = hd.download(path);
  5. //System.out.println(resultStr);
  6. try{
  7. SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader reader = factory.newSAXParser().getXMLReader();
  8. VehicleLocationsPrase vehicleLocationsPrase=new VehicleLocationsPrase();
  9. reader.setContentHandler(vehicleLocationsPrase);
  10. //開始解析文件
  11. reader.parse(new InputSource(new StringReader(resultStr)));
  12. ArrayList<VehicleLocationsData> temp=vehicleLocationsPrase.getVehicleLocationsDatas();
  13. System.out.println(temp.size());
  14. if (temp.size()==0) {
  15. Toast.makeText(mapView.getContext(), "這輛車在這個方向上目前沒有實時信息", Toast.LENGTH_LONG );
  16. }
  17. else {
  18. //下載解析好之後開始畫圖
  19. afterClickBusOnRoute(temp);
  20. }
  21. }
  22. catch(Exception e){
  23. e.printStackTrace();
  24. }
  25. }

解析之後我們得到了此刻汽車的朝向,經緯度等等信息就能畫出車子在路上的位置了。畫圖的操作是這樣的,首先我們要獲得兩個原始的圖像,一個車的圖像,一個箭頭的圖像,因為箭頭是要變化的,我們先定義一個矩陣的,然後每次畫一個車,就按照保存著的車輛朝向信息來把原始的箭頭進行旋轉,並且生成一副新的圖像。然後把新的箭頭位圖添加到車輛位圖的上面,產生疊加的效果。這裡所有的車是一個圖層,而每個箭頭是單獨的一個圖層,因為每個圖層的圖像是要一樣的嘛。接下來吧N+1個圖層都添加到mapview中就可以了,添加之前記得把原來的先擦除,

  1. private void afterClickBusOnRoute(ArrayList<VehicleLocationsData> vehicleLocationsData) {
  2. Drawable routeDrawable=getResources().getDrawable(R.drawable.bus);//顯示公交路線的圖標
  3. Bitmap bitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow);//獲得位圖
  4. int w = bitmap.getWidth();// 獲得位圖寬
  5. int h = bitmap.getHeight();// 獲得位圖高
  6. Matrix matrix = new Matrix();
  7. final MyOverlay Route_Overlay=new MyOverlay(routeDrawable, this);
  8. int lat=0,lon=0;
  9. float a;
  10. ArrayList<MyOverlay> allArrow=new ArrayList<MyOverlay>();
  11. for (int i = 0; i < vehicleLocationsData.size(); i++)
  12. {
  13. //System.out.println(vehicleLocationsData.get(i).toString());
  14. //獲得應該旋轉的角度
  15. a=Float.valueOf(vehicleLocationsData.get(i).getHeading());
  16. matrix.setRotate(a);//利用矩陣旋轉
  17. Bitmap bm2 = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  18. //獲得Drawable對象
  19. BitmapDrawable bd= new BitmapDrawable(getResources(), bm2);
  20. lat=(int)(Double.parseDouble(vehicleLocationsData.get(i).getLat())*1000000);
  21. lon=(int)(Double.parseDouble(vehicleLocationsData.get(i).getLon())*1000000);
  22. GeoPoint point=new GeoPoint(lat,lon);
  23. MyOverlay arrow_Overlay=new MyOverlay(bd,this);
  24. OverlayItem overlayitem = new OverlayItem(point, vehicleLocationsData.get(i).getRouteTag(),
  25. vehicleLocationsData.get(i).getDirTag()+vehicleLocationsData.get(i).getHeading()+
  26. vehicleLocationsData.get(i).getHeading());
  27. Route_Overlay.addOverlay(overlayitem);
  28. arrow_Overlay.addOverlay(overlayitem);
  29. allArrow.add(arrow_Overlay);
  30. }
  31. mapOverlays.clear();
  32. mapOverlays=mapView.getOverlays();
  33. mapOverlays.add(Route_Overlay);
  34. //注意圖層放置的順序,先放的在下面
  35. for (int i = 0; i < allArrow.size(); i++) {
  36. mapOverlays.add(allArrow.get(i));
  37. }
  38. GeoPoint lastpPoint=new GeoPoint(lat, lon );
  39. myloctionController.animateTo(lastpPoint);
  40. myloctionController.setZoom(13);
  41. myloctionController.setCenter(lastpPoint);
  42. //mapView.invalidate();
  43. }

這樣就能正常顯示車輛的實時路線了。這個裡面的MyOverlay是繼承與 ItemizedOverlay<OverlayItem>的咯,這個類中繼承了一些方法, 其中這個onTap方法就是點擊了圖標以後會執行的方法。
這個例子中的解析就不具體說了,畢竟每個網頁對應的內容都不一樣嘛。

Copyright © Linux教程網 All Rights Reserved