android實(shí)現(xiàn)查詢公交車還有幾站的功能
上一篇文章介紹了如何在Android平臺(tái)上利用百度地圖進(jìn)行定位,接下來就介紹一下在獲取的定位功能的基礎(chǔ)上采用百度地圖來獲取周邊的公交信息。
這里采用如上文同樣的方式,單獨(dú)寫一個(gè)類,該類是對(duì)周邊搜索功能的封裝,NearbySearchHelper。該類向外部只暴露一個(gè)函數(shù)SearchNearby()接口;
實(shí)現(xiàn)的主要流程時(shí),根據(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; /** * 周邊公交查詢幫助類;這里需要實(shí)現(xiàn)百度地圖的兩個(gè)接口,一個(gè)是Poi搜索監(jiān)聽器,一個(gè)是公交路線搜索監(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)聽對(duì)象,該對(duì)象是為了封裝而重新的一個(gè)監(jiān)聽器; 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)度與緯度,該值是通過上文的定位方式來獲取的; 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)前的搜索類型來進(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)過周邊的兩個(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)來搜索公交路線,由于搜索時(shí)間有可能會(huì)挺長(zhǎng),故查詢完站點(diǎn)后就調(diào)用周邊搜索監(jiān)聽器 //來刷新數(shù)據(jù),UI線程實(shí)現(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); } //如果此時(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)來; 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對(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)聽器; */ 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; /** * 開往的方向; */ 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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Android應(yīng)用中使用TabHost組件進(jìn)行布局的基本方法
這篇文章主要介紹了Android應(yīng)用中使用TabHost組件進(jìn)行布局的基本方法,不繼承TabActivity并以最基本的布局文件方式進(jìn)行布局,需要的朋友可以參考下2016-04-04Android Accessibility 輔助功能簡(jiǎn)單介紹
這篇文章主要介紹了Android Accessibility 輔助功能簡(jiǎn)單介紹的相關(guān)資料,文字轉(zhuǎn)語音,觸覺反饋,手勢(shì)操作,軌跡球和手柄操作,需要的朋友可以參考下2016-11-11使用RecylerView完成拖動(dòng)排序高仿qq側(cè)滑刪除功能
最近在做一個(gè)android項(xiàng)目,使用到Recylerview完成拖動(dòng)排序,側(cè)滑刪除功能,今天小編把思路分享到腳本之家平臺(tái),供大家學(xué)習(xí)2016-10-10Android開發(fā)之拼音轉(zhuǎn)換工具類PinyinUtils示例
這篇文章主要介紹了Android開發(fā)之拼音轉(zhuǎn)換工具類PinyinUtils,涉及Android基于pinyin4j-2.5.0.jar包文件實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android編程實(shí)現(xiàn)監(jiān)控各個(gè)程序流量的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)監(jiān)控各個(gè)程序流量的方法,涉及Android針對(duì)應(yīng)用包的遍歷,權(quán)限控制及相關(guān)屬性操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android優(yōu)化提升應(yīng)用啟動(dòng)速度及Splash頁面的設(shè)計(jì)
這篇文章主要介紹了Android性能優(yōu)化的一些相關(guān)資料,文章圍繞提升應(yīng)用啟動(dòng)速度及Splash頁面的設(shè)計(jì)的內(nèi)容展開介紹,需要的朋友可以參考一下,希望對(duì)你有所幫助2021-12-12Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果(附demo源碼)
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果的方法,較為詳細(xì)的分析了Android實(shí)現(xiàn)旋轉(zhuǎn)菜單的布局與功能實(shí)現(xiàn)技巧,并附帶完整的demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12Flutter onTap中讓你脫穎而出的5條規(guī)則
這篇文章主要為大家介紹了Flutter onTap中讓你脫穎而出的5條規(guī)則,小事情決定了你的熟練程度,這些小細(xì)節(jié)的有趣之處在于它們的豐富性2023-11-11