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

首頁(yè) > 系統(tǒng) > Android > 正文

android實(shí)現(xiàn)查詢公交車還有幾站的功能

2019-12-12 02:50:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

實(shí)現(xiàn)的主要流程時(shí),根據(jù)當(dāng)前的定位獲取周邊的公交車的信息,并排除了冗余的公交車線路信息,根據(jù)搜索到的公交線路信息,繼續(xù)搜索該公交車的uid(百度地圖的唯一標(biāo)示符),再根據(jù)具體的uid來(lái)搜索詳細(xì)的公交車信息,包括起始站點(diǎn)。具體代碼如下:

1、創(chuàng)建周邊公交搜索幫助類: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;  /**  * 周邊公交查詢幫助類;這里需要實(shí)現(xiàn)百度地圖的兩個(gè)接口,一個(gè)是Poi搜索監(jiān)聽(tīng)器,一個(gè)是公交路線搜索監(jiān)聽(tīng)器;  * @author Render;  */ public class NearbySearchHelper implements OnGetPoiSearchResultListener,    OnGetBusLineSearchResultListener{    public static final String TAG = "NearbySearchHelper";      private final int BUSSTATION=0;          // 先查詢周邊的公交站點(diǎn)信息;   private final int BUSLINE=1;              // 站點(diǎn)的公交信息;   private PoiSearch mSearch = null;         // Poi點(diǎn)搜索模塊;     private BusLineSearch mBusLineSearch = null;  // 公交路線搜索模塊;      private int mType;                  // 查詢類型;   private int nodeIndex=-1;            // 查詢的索引;      private MrNearbySearchListener nearBySearchListener; //查詢結(jié)束監(jiān)聽(tīng)對(duì)象,該對(duì)象是為了封裝而重新的一個(gè)監(jiān)聽(tīng)器;      private List<MrNearbyBus> nearbyBuses=null;     //查詢的結(jié)果;      public NearbySearchHelper(){      }    public void setNearBySearchListener(MrNearbySearchListener nearBySearchListener) {     this.nearBySearchListener = nearBySearchListener;   }    /**    * 初始化函數(shù),主要是初始化百度地圖的搜索對(duì)象以及存放周邊公交信息的鏈表,至于Bean實(shí)體對(duì)象MrNearbyBus下文繼續(xù)介紹;    */   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();     }   }      /**    * 銷毀函數(shù);    */   public void Destory(){          mSearch.destroy();     mBusLineSearch.destroy();   }     /**    * 搜索的周邊的函數(shù);由外部程序直接調(diào)用;    */    public void searchNearby(){         //設(shè)置當(dāng)前的搜索類型是公交站點(diǎn)的搜索;         mType=BUSSTATION;      //獲取當(dāng)前位置的經(jīng)度與緯度,該值是通過(guò)上文的定位方式來(lái)獲取的;          double latitude=CustomApplication.mLastLocation.getLatitude();     double longtitude=CustomApplication.mLastLocation.getLongitude();          //查詢周邊公交線路;采用百度地圖的周邊搜索接口,并定義周邊點(diǎn)搜索選項(xiàng),其中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        }    //該函數(shù)是百度地圖的周邊興趣點(diǎn)搜索回調(diào)函數(shù);該函數(shù)在兩處都進(jìn)行了回調(diào),所以需要根據(jù)當(dāng)前的搜索類型來(lái)進(jìn)行判斷;    @Override   public void onGetPoiResult(PoiResult result) {          switch(mType)     {       case BUSSTATION:       {         //如果查詢失敗直接返回;         if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)         {           LogUtils.i(TAG, "查詢站點(diǎn)失敗!");           nearBySearchListener.onRefreshBusNearby(nearbyBuses);           return;         }         //處理公交站點(diǎn)的搜索結(jié)果;         ProcessBusStation(result);         break;       }       case BUSLINE:       {         //如果查詢失敗直接返回;         if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)         {           LogUtils.i(TAG, "查詢線路失敗!");           nearBySearchListener.onRefreshBusNearby(nearbyBuses);           return;         }         //處理公交線路的搜索結(jié)果;         ProcessBusLine(result);         break;       }     }   }    /**    * 主要是尋找該站點(diǎn)中是否存在相同的公交,如果存在則取兩趟公交距離當(dāng)前位置最近的點(diǎn);    * 由于是搜索周邊的公交站,可能會(huì)存在一趟公交車經(jīng)過(guò)周邊的兩個(gè)或者三個(gè)公交站,為了排除冗余的信息,    * 故需要判斷同一輛公交車的多個(gè)車站那個(gè)車站距離當(dāng)前位置最近。    * @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是百度地圖提供的計(jì)算兩個(gè)經(jīng)緯度坐標(biāo)之間的距離工具類;                  oldDistance=DistanceUtil.getDistance(nowLocation, oldLocation);                  //如果當(dāng)前的距離小于之前的距離,則更新該公交車的信息;         if(newDistance<oldDistance)         {           nearbyBuses.get(i).setStationLaction(newLocation);           nearbyBuses.get(i).setStationName(nearbyBus.getStationName());         }         return true;       }     }     return false;   }      /**    * 處理查詢后的結(jié)果是公交站點(diǎn)的情況;    * @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);           }             }       }     }      //搜索完了公交站點(diǎn)后則根據(jù)公交站點(diǎn)來(lái)搜索公交路線,由于搜索時(shí)間有可能會(huì)挺長(zhǎng),故查詢完站點(diǎn)后就調(diào)用周邊搜索監(jiān)聽(tīng)器      //來(lái)刷新數(shù)據(jù),UI線程實(shí)現(xiàn)了該監(jiān)聽(tīng)器,則可以直接刷新數(shù)據(jù)。      searchBusLine();     nearBySearchListener.onRefreshBusNearby(nearbyBuses);   }      /**    * 查詢公交線路;    */   private void searchBusLine(){     //nodeIndex表示當(dāng)前周邊站點(diǎn)的索引;          nodeIndex++;          mType=BUSLINE;          if(nearbyBuses.isEmpty()){       return;     }          //部分刷新;     if(nodeIndex%5==0){       nearBySearchListener.onRefreshBusNearby(nearbyBuses);     }          //如果此時(shí)返回表明查詢完畢;     if(nodeIndex >= nearbyBuses.size()){       LogUtils.i(TAG, "查詢完畢!");       nearBySearchListener.onRefreshBusNearby(nearbyBuses);       return;     }          //這里還是采用搜索周邊的方式,效率會(huì)更高;     double latitude=CustomApplication.mLastLocation.getLatitude();     double longtitude=CustomApplication.mLastLocation.getLongitude();     //獲取當(dāng)前節(jié)點(diǎn)下的周邊公交車的公交名稱;          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);                  //如果是第一次進(jìn)來(lái);         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中 通過(guò)該NearbySearchHelper對(duì)象可以快速的搜索到周邊的公交車信息,代碼如下:

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);      /**      * 創(chuàng)建周邊搜索幫助類,初始化該幫助類,并設(shè)置幫助類的監(jiān)聽(tīng)器;      */     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、對(duì)于上文中提到的保存周邊公交信息的bean對(duì)象,是自定義的數(shù)據(jù)對(duì)象,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;      /**    * 查到周圍的站點(diǎn)名稱,根據(jù)該名稱查到的公交線路;    */   private String stationName=null;      /**    * 站點(diǎn)位置;    */   private LatLng stationLaction=null;      /**    * 開(kāi)往的方向;    */   private String busDrection=null;      /**    * 構(gòu)造函數(shù);    */   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、最后的周邊公交查詢結(jié)果如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 义马市| 泰兴市| 黄大仙区| 紫阳县| 玉环县| 八宿县| 华容县| 贵德县| 大渡口区| 竹山县| 黎平县| 台州市| 当雄县| 宁阳县| 宁南县| 永春县| 本溪| 彭泽县| 阜阳市| 政和县| 大洼县| 左云县| 泽库县| 靖安县| 红原县| 洪湖市| 潼关县| 久治县| 鹤岗市| 贡觉县| 深泽县| 大渡口区| 麦盖提县| 五河县| 上高县| 双流县| 长顺县| 防城港市| 河东区| 扶余县| 当涂县|