最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年05月22日 17:10:43   作者:mr_jianrong  
這篇文章主要為大家詳細介紹了android實現(xiàn)查詢公交車還有幾站的功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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; 
 
/** 
 * 周邊公交查詢幫助類;這里需要實現(xiàn)百度地圖的兩個接口,一個是Poi搜索監(jiān)聽器,一個是公交路線搜索監(jiān)聽器; 
 * @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; //查詢結(jié)束監(jiān)聽對象,該對象是為了封裝而重新的一個監(jiān)聽器; 
   
  private List<MrNearbyBus> nearbyBuses=null;     //查詢的結(jié)果; 
   
  public NearbySearchHelper(){ 
   
  } 
 
  public void setNearBySearchListener(MrNearbySearchListener nearBySearchListener) { 
    this.nearBySearchListener = nearBySearchListener; 
  } 
 
  /** 
   * 初始化函數(shù),主要是初始化百度地圖的搜索對象以及存放周邊公交信息的鏈表,至于Bean實體對象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(){    
 
    //設置當前的搜索類型是公交站點的搜索;    
 
    mType=BUSSTATION; 
 
    //獲取當前位置的經(jīng)度與緯度,該值是通過上文的定位方式來獲取的;     
 
    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 
     
  } 
 
  //該函數(shù)是百度地圖的周邊興趣點搜索回調(diào)函數(shù);該函數(shù)在兩處都進行了回調(diào),所以需要根據(jù)當前的搜索類型來進行判斷; 
 
  @Override 
  public void onGetPoiResult(PoiResult result) { 
     
    switch(mType) 
    { 
      case BUSSTATION: 
      { 
        //如果查詢失敗直接返回; 
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) 
        { 
          LogUtils.i(TAG, "查詢站點失??!"); 
          nearBySearchListener.onRefreshBusNearby(nearbyBuses); 
          return; 
        } 
        //處理公交站點的搜索結(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; 
      } 
    } 
  } 
 
  /** 
   * 主要是尋找該站點中是否存在相同的公交,如果存在則取兩趟公交距離當前位置最近的點; 
   * 由于是搜索周邊的公交站,可能會存在一趟公交車經(jī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īng)緯度坐標之間的距離工具類;         
 
        oldDistance=DistanceUtil.getDistance(nowLocation, oldLocation); 
         
        //如果當前的距離小于之前的距離,則更新該公交車的信息; 
        if(newDistance<oldDistance) 
        { 
          nearbyBuses.get(i).setStationLaction(newLocation); 
          nearbyBuses.get(i).setStationName(nearbyBus.getStationName()); 
        } 
        return true; 
      } 
    } 
    return false; 
  } 
   
  /** 
   * 處理查詢后的結(jié)果是公交站點的情況; 
   * @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); 
          }     
        } 
      } 
    } 
 
    //搜索完了公交站點后則根據(jù)公交站點來搜索公交路線,由于搜索時間有可能會挺長,故查詢完站點后就調(diào)用周邊搜索監(jiān)聽器 
 
    //來刷新數(shù)據(jù),UI線程實現(xiàn)了該監(jiān)聽器,則可以直接刷新數(shù)據(jù)。 
 
    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(); 
    //獲取當前節(jié)點下的周邊公交車的公交名稱;     
 
    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); 
 
    /** 
     * 創(chuàng)建周邊搜索幫助類,初始化該幫助類,并設置幫助類的監(jiān)聽器; 
     */ 
    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對象,是自定義的數(shù)據(jù)對象,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; 
   
  /** 
   * 查到周圍的站點名稱,根據(jù)該名稱查到的公交線路; 
   */ 
  private String stationName=null; 
   
  /** 
   * 站點位置; 
   */ 
  private LatLng stationLaction=null; 
   
  /** 
   * 開往的方向; 
   */ 
  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é)果如下圖:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android隱私彈框功能的實現(xiàn)

    Android隱私彈框功能的實現(xiàn)

    最近做app類的項目,現(xiàn)在發(fā)布app都需要在發(fā)布前生成一個用戶隱私彈框讓用戶點擊,這個功能看似簡單,到底怎么實現(xiàn)的呢?下面小編給大家?guī)砹薃ndroid隱私彈框功能的實現(xiàn)代碼,一起看看吧
    2021-10-10
  • Android熱修復及插件化原理示例詳解

    Android熱修復及插件化原理示例詳解

    這篇文章主要為大家介紹了Android熱修復及插件化原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android中的Shape和Selector的結(jié)合使用實例

    Android中的Shape和Selector的結(jié)合使用實例

    這篇文章主要介紹了Android中的Shape和Selector的結(jié)合使用實例,本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • Android代碼混淆的寫法總結(jié)

    Android代碼混淆的寫法總結(jié)

    本篇文章主要介紹了Android代碼混淆的寫法總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 基于android背景選擇器selector的用法匯總

    基于android背景選擇器selector的用法匯總

    本篇文章是對android背景選擇器selector的用法進行了詳細的總結(jié)與分析,需要的朋友參考下
    2013-06-06
  • Android布局(RelativeLayout、TableLayout等)使用方法

    Android布局(RelativeLayout、TableLayout等)使用方法

    這篇文章主要介紹了Android布局使用方法及各種屬性介紹,包括RelativeLayout、TableLayout等,感興趣的朋友可以參考一下
    2016-03-03
  • Android三種雙屏異顯實現(xiàn)方法介紹

    Android三種雙屏異顯實現(xiàn)方法介紹

    現(xiàn)在越來越多的Android設備有多個屏幕,雙屏異顯應用場景最多的應該就是類似于收銀平臺那種設備,在主屏上店員能夠?qū)c商品進行選擇錄入,副屏則是展示給我們的賬單詳情,但是它只通過了一個軟件系統(tǒng)就實現(xiàn)了雙屏異顯這個功能,而Presentation正是這其中的關鍵
    2023-01-01
  • Android ListView實現(xiàn)單選及多選等功能示例

    Android ListView實現(xiàn)單選及多選等功能示例

    這篇文章主要介紹了Android ListView實現(xiàn)單選及多選等功能的方法,結(jié)合實例形式分析了ListView單選、多選及長按多選等功能相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • Kotlin之自定義 Live Templates詳解(模板代碼)

    Kotlin之自定義 Live Templates詳解(模板代碼)

    這篇文章主要介紹了Kotlin之自定義 Live Templates詳解(模板代碼),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android Studio 配置忽略文件的方法實現(xiàn)

    Android Studio 配置忽略文件的方法實現(xiàn)

    這篇文章主要介紹了Android Studio 配置忽略文件的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論

沛县| 定襄县| 内江市| 南宁市| 商丘市| 新宾| 沧州市| 怀柔区| 乌拉特中旗| 刚察县| 泰安市| 勃利县| 灵寿县| 教育| 勐海县| 都安| 东方市| 龙胜| 青浦区| 永年县| 独山县| 武宁县| 鹰潭市| 礼泉县| 灵璧县| SHOW| 岳池县| 五台县| 于田县| 德惠市| 陵水| 津市市| 丹东市| 桂东县| 佛坪县| 聊城市| 金塔县| 上饶市| 台北县| 武邑县| 肥东县|