成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)越秀,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

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

實現(xiàn)的主要流程時,根據(jù)當(dāng)前的定位獲取周邊的公交車的信息,并排除了冗余的公交車線路信息,根據(jù)搜索到的公交線路信息,繼續(xù)搜索該公交車的uid(百度地圖的唯一標(biāo)示符),再根據(jù)具體的uid來搜索詳細(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; 
 
/** 
 * 周邊公交查詢幫助類;這里需要實現(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;          // 先查詢周邊的公交站點(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)聽對象,該對象是為了封裝而重新的一個監(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(){    
 
    //設(shè)置當(dāng)前的搜索類型是公交站點(diǎn)的搜索;    
 
    mType=BUSSTATION; 
 
    //獲取當(dāng)前位置的經(jīng)度與緯度,該值是通過上文的定位方式來獲取的;     
 
    double latitude=CustomApplication.mLastLocation.getLatitude(); 
    double longtitude=CustomApplication.mLastLocation.getLongitude(); 
     
    //查詢周邊公交線路;采用百度地圖的周邊搜索接口,并定義周邊點(diǎn)搜索選項,其中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)前的搜索類型來進(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); 
   * 由于是搜索周邊的公交站,可能會存在一趟公交車經(jīng)過周邊的兩個或者三個公交站,為了排除冗余的信息, 
   * 故需要判斷同一輛公交車的多個車站那個車站距離當(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ī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)來搜索公交路線,由于搜索時間有可能會挺長,故查詢完站點(diǎn)后就調(diào)用周邊搜索監(jiān)聽器 
 
    //來刷新數(shù)據(jù),UI線程實現(xiàn)了該監(jiān)聽器,則可以直接刷新數(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); 
    } 
     
    //如果此時返回表明查詢完畢; 
    if(nodeIndex >= nearbyBuses.size()){ 
      LogUtils.i(TAG, "查詢完畢!"); 
      nearBySearchListener.onRefreshBusNearby(nearbyBuses); 
      return; 
    } 
     
    //這里還是采用搜索周邊的方式,效率會更高; 
    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)來; 
        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)建周邊搜索幫助類,初始化該幫助類,并設(shè)置幫助類的監(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; 
   
  /** 
   * 查到周圍的站點(diǎn)名稱,根據(jù)該名稱查到的公交線路; 
   */ 
  private String stationName=null; 
   
  /** 
   * 站點(diǎn)位置; 
   */ 
  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é)果如下圖:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁名稱:android實現(xiàn)查詢公交車還有幾站的功能
文章轉(zhuǎn)載:http://jinyejixie.com/article16/iieogg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、定制網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)頁設(shè)計公司、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
张北县| 娱乐| 云林县| 宁晋县| 广西| 丁青县| 开封县| 舟曲县| 邢台市| 锦州市| 平定县| 福鼎市| 乐至县| 游戏| 沧州市| 西藏| 高雄市| 达州市| 确山县| 高淳县| 克什克腾旗| 福建省| 蕲春县| 平定县| 威远县| 汽车| 红安县| 兴和县| 台北县| 利辛县| 保靖县| 津南区| 修武县| 恭城| 东丽区| 鹤岗市| 辽阳县| 南通市| 濮阳县| 崇明县| 江都市|