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; /** * 構造函數(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應用中使用TabHost組件進行布局的基本方法
這篇文章主要介紹了Android應用中使用TabHost組件進行布局的基本方法,不繼承TabActivity并以最基本的布局文件方式進行布局,需要的朋友可以參考下2016-04-04Android Accessibility 輔助功能簡單介紹
這篇文章主要介紹了Android Accessibility 輔助功能簡單介紹的相關資料,文字轉(zhuǎn)語音,觸覺反饋,手勢操作,軌跡球和手柄操作,需要的朋友可以參考下2016-11-11使用RecylerView完成拖動排序高仿qq側(cè)滑刪除功能
最近在做一個android項目,使用到Recylerview完成拖動排序,側(cè)滑刪除功能,今天小編把思路分享到腳本之家平臺,供大家學習2016-10-10Android開發(fā)之拼音轉(zhuǎn)換工具類PinyinUtils示例
這篇文章主要介紹了Android開發(fā)之拼音轉(zhuǎn)換工具類PinyinUtils,涉及Android基于pinyin4j-2.5.0.jar包文件實現(xiàn)漢字轉(zhuǎn)拼音功能的相關操作技巧,需要的朋友可以參考下2017-11-11Android編程實現(xiàn)監(jiān)控各個程序流量的方法
這篇文章主要介紹了Android編程實現(xiàn)監(jiān)控各個程序流量的方法,涉及Android針對應用包的遍歷,權限控制及相關屬性操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12Android優(yōu)化提升應用啟動速度及Splash頁面的設計
這篇文章主要介紹了Android性能優(yōu)化的一些相關資料,文章圍繞提升應用啟動速度及Splash頁面的設計的內(nèi)容展開介紹,需要的朋友可以參考一下,希望對你有所幫助2021-12-12Android編程實現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果(附demo源碼)
這篇文章主要介紹了Android編程實現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果的方法,較為詳細的分析了Android實現(xiàn)旋轉(zhuǎn)菜單的布局與功能實現(xiàn)技巧,并附帶完整的demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12Flutter onTap中讓你脫穎而出的5條規(guī)則
這篇文章主要為大家介紹了Flutter onTap中讓你脫穎而出的5條規(guī)則,小事情決定了你的熟練程度,這些小細節(jié)的有趣之處在于它們的豐富性2023-11-11