上一篇文章介紹了如何在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é)果如下圖:
以上就是本文的全部內(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)