国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android實現查詢公交車還有幾站的功能

2019-10-23 18:28:14
字體:
來源:轉載
供稿:網友

 上一篇文章介紹了如何在Android平臺上利用百度地圖進行定位,接下來就介紹一下在獲取的定位功能的基礎上采用百度地圖來獲取周邊的公交信息。

這里采用如上文同樣的方式,單獨寫一個類,該類是對周邊搜索功能的封裝,NearbySearchHelper。該類向外部只暴露一個函數SearchNearby()接口;

實現的主要流程時,根據當前的定位獲取周邊的公交車的信息,并排除了冗余的公交車線路信息,根據搜索到的公交線路信息,繼續搜索該公交車的uid(百度地圖的唯一標示符),再根據具體的uid來搜索詳細的公交車信息,包括起始站點。具體代碼如下:

1、創建周邊公交搜索幫助類:NearbySearchHelper

import java.util.ArrayList; import java.util.List;  import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.busline.BusLineResult; import com.baidu.mapapi.search.busline.BusLineSearch; import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiNearbySearchOption; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.utils.DistanceUtil; import com.busleep.app.CustomApplication; import com.busleep.bean.MrNearbyBus; import com.busleep.config.Constant; import com.busleep.listener.MrNearbySearchListener; import com.busleep.utils.LogUtils;  /**  * 周邊公交查詢幫助類;這里需要實現百度地圖的兩個接口,一個是Poi搜索監聽器,一個是公交路線搜索監聽器;  * @author Render;  */ public class NearbySearchHelper implements OnGetPoiSearchResultListener,    OnGetBusLineSearchResultListener{    public static final String TAG = "NearbySearchHelper";      private final int BUSSTATION=0;          // 先查詢周邊的公交站點信息;   private final int BUSLINE=1;              // 站點的公交信息;   private PoiSearch mSearch = null;         // Poi點搜索模塊;     private BusLineSearch mBusLineSearch = null;  // 公交路線搜索模塊;      private int mType;                  // 查詢類型;   private int nodeIndex=-1;            // 查詢的索引;      private MrNearbySearchListener nearBySearchListener; //查詢結束監聽對象,該對象是為了封裝而重新的一個監聽器;      private List<MrNearbyBus> nearbyBuses=null;     //查詢的結果;      public NearbySearchHelper(){      }    public void setNearBySearchListener(MrNearbySearchListener nearBySearchListener) {     this.nearBySearchListener = nearBySearchListener;   }    /**    * 初始化函數,主要是初始化百度地圖的搜索對象以及存放周邊公交信息的鏈表,至于Bean實體對象MrNearbyBus下文繼續介紹;    */   public void init(){          if(mSearch==null||mBusLineSearch==null){              mSearch = PoiSearch.newInstance();       mSearch.setOnGetPoiSearchResultListener(this);       mBusLineSearch = BusLineSearch.newInstance();       mBusLineSearch.setOnGetBusLineSearchResultListener(this);              nearbyBuses=new ArrayList<MrNearbyBus>();            }else {       nearbyBuses.clear();     }   }      /**    * 銷毀函數;    */   public void Destory(){          mSearch.destroy();     mBusLineSearch.destroy();   }     /**    * 搜索的周邊的函數;由外部程序直接調用;    */    public void searchNearby(){         //設置當前的搜索類型是公交站點的搜索;         mType=BUSSTATION;      //獲取當前位置的經度與緯度,該值是通過上文的定位方式來獲取的;          double latitude=CustomApplication.mLastLocation.getLatitude();     double longtitude=CustomApplication.mLastLocation.getLongitude();          //查詢周邊公交線路;采用百度地圖的周邊搜索接口,并定義周邊點搜索選項,其中Constant.nearbyRadius是周邊搜索的半徑;     mSearch.searchNearby(new PoiNearbySearchOption().keyword("公交站")         .location(new LatLng(latitude,longtitude)).radius(Constant.nearbyRadius));        }      @Override   public void onGetBusLineResult(BusLineResult arg0) {     // TODO Auto-generated method stub        }    @Override   public void onGetPoiDetailResult(PoiDetailResult arg0) {     // TODO Auto-generated method stub        }    //該函數是百度地圖的周邊興趣點搜索回調函數;該函數在兩處都進行了回調,所以需要根據當前的搜索類型來進行判斷;    @Override   public void onGetPoiResult(PoiResult result) {          switch(mType)     {       case BUSSTATION:       {         //如果查詢失敗直接返回;         if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)         {           LogUtils.i(TAG, "查詢站點失?。?quot;);           nearBySearchListener.onRefreshBusNearby(nearbyBuses);           return;         }         //處理公交站點的搜索結果;         ProcessBusStation(result);         break;       }       case BUSLINE:       {         //如果查詢失敗直接返回;         if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)         {           LogUtils.i(TAG, "查詢線路失敗!");           nearBySearchListener.onRefreshBusNearby(nearbyBuses);           return;         }         //處理公交線路的搜索結果;         ProcessBusLine(result);         break;       }     }   }    /**    * 主要是尋找該站點中是否存在相同的公交,如果存在則取兩趟公交距離當前位置最近的點;    * 由于是搜索周邊的公交站,可能會存在一趟公交車經過周邊的兩個或者三個公交站,為了排除冗余的信息,    * 故需要判斷同一輛公交車的多個車站那個車站距離當前位置最近。    * @return    */    private boolean FindSameBus(MrNearbyBus nearbyBus){          String busName=nearbyBus.getBusName();          LatLng nowLocation=new LatLng(CustomApplication.mLastLocation.getLatitude(),         CustomApplication.mLastLocation.getLongitude());          LatLng newLocation=nearbyBus.getStationLaction();          double newDistance=DistanceUtil.getDistance(nowLocation, newLocation);     double oldDistance=0.0;          for(int i=0;i<nearbyBuses.size();i++)     {       //如果存在名稱相同的公交線路;       if(nearbyBuses.get(i).getBusName().equals(busName))       {         LatLng oldLocation=nearbyBuses.get(i).getStationLaction();          //DistanceUtil是百度地圖提供的計算兩個經緯度坐標之間的距離工具類;                  oldDistance=DistanceUtil.getDistance(nowLocation, oldLocation);                  //如果當前的距離小于之前的距離,則更新該公交車的信息;         if(newDistance<oldDistance)         {           nearbyBuses.get(i).setStationLaction(newLocation);           nearbyBuses.get(i).setStationName(nearbyBus.getStationName());         }         return true;       }     }     return false;   }      /**    * 處理查詢后的結果是公交站點的情況;    * @param result    */   private void ProcessBusStation(PoiResult result){          for (PoiInfo poi : result.getAllPoi())     {       if (poi.type == PoiInfo.POITYPE.BUS_STATION)       {           String busNames []=poi.address.split(";");                  for(int i=0;i<busNames.length;++i){                      MrNearbyBus nearbyBus=new MrNearbyBus();           nearbyBus.setBusName(busNames[i]);           nearbyBus.setStationName(poi.name);           nearbyBus.setStationLaction(poi.location);                      boolean bRes=FindSameBus(nearbyBus);                      if(!bRes)           {             nearbyBuses.add(nearbyBus);           }             }       }     }      //搜索完了公交站點后則根據公交站點來搜索公交路線,由于搜索時間有可能會挺長,故查詢完站點后就調用周邊搜索監聽器      //來刷新數據,UI線程實現了該監聽器,則可以直接刷新數據。      searchBusLine();     nearBySearchListener.onRefreshBusNearby(nearbyBuses);   }      /**    * 查詢公交線路;    */   private void searchBusLine(){     //nodeIndex表示當前周邊站點的索引;          nodeIndex++;          mType=BUSLINE;          if(nearbyBuses.isEmpty()){       return;     }          //部分刷新;     if(nodeIndex%5==0){       nearBySearchListener.onRefreshBusNearby(nearbyBuses);     }          //如果此時返回表明查詢完畢;     if(nodeIndex >= nearbyBuses.size()){       LogUtils.i(TAG, "查詢完畢!");       nearBySearchListener.onRefreshBusNearby(nearbyBuses);       return;     }          //這里還是采用搜索周邊的方式,效率會更高;     double latitude=CustomApplication.mLastLocation.getLatitude();     double longtitude=CustomApplication.mLastLocation.getLongitude();     //獲取當前節點下的周邊公交車的公交名稱;          String busLineName=nearbyBuses.get(nodeIndex).getBusName();     mSearch.searchNearby(new PoiNearbySearchOption().keyword(busLineName+"公交")         .location(new LatLng(latitude,longtitude)).radius(Constant.nearbyRadius));   }      /**    * 處理公交路線的信息;    * @param result    */   private void ProcessBusLine(PoiResult result)   {     for (PoiInfo poi : result.getAllPoi())     {       if (poi.type == PoiInfo.POITYPE.BUS_LINE)       {         MrNearbyBus nearbyBus=nearbyBuses.get(nodeIndex);                  //如果是第一次進來;         if(nearbyBus.getUid()==null){              nearbyBus.setUid(poi.uid);           String drection=poi.name;           int index=drection.indexOf("(");           int length=drection.length();                      drection=drection.substring(index+1,length-1);           nearbyBus.setBusDrection(drection);                    }else {  //否則是返程公交車;                      nearbyBus.setReverseUid(poi.uid);;         }       }     }     searchBusLine();   } } 

2、在UI中 通過該NearbySearchHelper對象可以快速的搜索到周邊的公交車信息,代碼如下:

public class SearchNearbyActivity extends Activity implements MrNearbySearchListener {    private NearbySearchHelper mHelper=null;      @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_splash);      /**      * 創建周邊搜索幫助類,初始化該幫助類,并設置幫助類的監聽器;      */     nearbySearchHelper=new NearbySearchHelper();     nearbySearchHelper.init();     nearbySearchHelper.setNearBySearchListener(this);     }    @Override   public void onRefreshBusNearby(List<MrNearbyBus> list) {          for(int i=0;i<list.size();i++){              LogUtils.i(TAG, list.get(i).getBusName());       }      //busNearAdapter 為顯示公交信息的適配器;          if(busNearAdapter==null){       busNearAdapter=new BusNearAdapter(getActivity(), list);       mBusNearListView.setAdapter(busNearAdapter);     }     else {       busNearAdapter.updateListView(list);     }   }  } 

3、對于上文中提到的保存周邊公交信息的bean對象,是自定義的數據對象,MrNearbyBus 代碼如下:

package com.busleep.bean;  import com.baidu.mapapi.model.LatLng;  /**  * 周邊的公交車信息;  * @author Render;  */ public class MrNearbyBus {    /**    * 公交車名稱;    */   private String busName=null;      /**    * 該公交線路的uid;    */   private String uid=null;      /**    * 反向公交的Uid;    */   private String reverseUid=null;      /**    * 查到周圍的站點名稱,根據該名稱查到的公交線路;    */   private String stationName=null;      /**    * 站點位置;    */   private LatLng stationLaction=null;      /**    * 開往的方向;    */   private String busDrection=null;      /**    * 構造函數;    */   public MrNearbyBus(){        }      public String getBusName() {     return busName;   }    public String getUid() {     return uid;   }    public void setUid(String uid) {     this.uid = uid;   }    public String getReverseUid() {     return reverseUid;   }    public void setReverseUid(String reverseUid) {     this.reverseUid = reverseUid;   }    public void setBusName(String busName) {     this.busName = busName;   }    public String getStationName() {     return stationName;   }    public void setStationName(String stationName) {     this.stationName = stationName;   }    public LatLng getStationLaction() {     return stationLaction;   }    public void setStationLaction(LatLng stationLaction) {     this.stationLaction = stationLaction;   }    public String getBusDrection() {     return busDrection;   }    public void setBusDrection(String busDrection) {     this.busDrection = busDrection;   } } 

4、最后的周邊公交查詢結果如下圖:

android查詢公交車還有幾站,android查詢公交車站臺數,android查詢公交

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白山市| 富顺县| 富平县| 疏附县| 灵丘县| 尖扎县| 宣化县| 光泽县| 东台市| 喀喇沁旗| 蓬溪县| 富蕴县| 巴南区| 黎平县| 玛纳斯县| 昭通市| 同德县| 宁阳县| 时尚| 黑河市| 轮台县| 大安市| 平乐县| 锡林浩特市| 平阴县| 夏河县| 浮梁县| 睢宁县| 宁陵县| 祁东县| 沅陵县| 卫辉市| 双城市| 闻喜县| 大理市| 五指山市| 响水县| 含山县| 东源县| 乐东| 平泉县|