您好,登錄后才能下訂單哦!
上一篇文章介紹了如何在Android平臺上利用百度地圖進行定位,接下來就介紹一下在獲取的定位功能的基礎上采用百度地圖來獲取周邊的公交信息。
這里采用如上文同樣的方式,單獨寫一個類,該類是對周邊搜索功能的封裝,NearbySearchHelper。該類向外部只暴露一個函數SearchNearby()接口;
實現的主要流程時,根據當前的定位獲取周邊的公交車的信息,并排除了冗余的公交車線路信息,根據搜索到的公交線路信息,繼續搜索該公交車的uid(百度地圖的唯一標示符),再根據具體的uid來搜索詳細的公交車信息,包括起始站點。具體代碼如下:
1、創建周邊公交搜索幫助類: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; /** * 周邊公交查詢幫助類;這里需要實現百度地圖的兩個接口,一個是Poi搜索監聽器,一個是公交路線搜索監聽器; * @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; //查詢結束監聽對象,該對象是為了封裝而重新的一個監聽器; private List<MrNearbyBus> nearbyBuses=null; //查詢的結果; public NearbySearchHelper(){ } public void setNearBySearchListener(MrNearbySearchListener nearBySearchListener) { this.nearBySearchListener = nearBySearchListener; } /** * 初始化函數,主要是初始化百度地圖的搜索對象以及存放周邊公交信息的鏈表,至于Bean實體對象MrNearbyBus下文繼續介紹; */ 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(); } } /** * 銷毀函數; */ public void Destory(){ mSearch.destroy(); mBusLineSearch.destroy(); } /** * 搜索的周邊的函數;由外部程序直接調用; */ public void searchNearby(){ //設置當前的搜索類型是公交站點的搜索; mType=BUSSTATION; //獲取當前位置的經度與緯度,該值是通過上文的定位方式來獲取的; 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 } //該函數是百度地圖的周邊興趣點搜索回調函數;該函數在兩處都進行了回調,所以需要根據當前的搜索類型來進行判斷; @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; } //處理公交站點的搜索結果; ProcessBusStation(result); break; } case BUSLINE: { //如果查詢失敗直接返回; if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { LogUtils.i(TAG, "查詢線路失敗!"); nearBySearchListener.onRefreshBusNearby(nearbyBuses); return; } //處理公交線路的搜索結果; ProcessBusLine(result); break; } } } /** * 主要是尋找該站點中是否存在相同的公交,如果存在則取兩趟公交距離當前位置最近的點; * 由于是搜索周邊的公交站,可能會存在一趟公交車經過周邊的兩個或者三個公交站,為了排除冗余的信息, * 故需要判斷同一輛公交車的多個車站那個車站距離當前位置最近。 * @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是百度地圖提供的計算兩個經緯度坐標之間的距離工具類; oldDistance=DistanceUtil.getDistance(nowLocation, oldLocation); //如果當前的距離小于之前的距離,則更新該公交車的信息; if(newDistance<oldDistance) { nearbyBuses.get(i).setStationLaction(newLocation); nearbyBuses.get(i).setStationName(nearbyBus.getStationName()); } return true; } } return false; } /** * 處理查詢后的結果是公交站點的情況; * @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); } } } } //搜索完了公交站點后則根據公交站點來搜索公交路線,由于搜索時間有可能會挺長,故查詢完站點后就調用周邊搜索監聽器 //來刷新數據,UI線程實現了該監聽器,則可以直接刷新數據。 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(); //獲取當前節點下的周邊公交車的公交名稱; 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); /** * 創建周邊搜索幫助類,初始化該幫助類,并設置幫助類的監聽器; */ 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對象,是自定義的數據對象,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; /** * 查到周圍的站點名稱,根據該名稱查到的公交線路; */ private String stationName=null; /** * 站點位置; */ private LatLng stationLaction=null; /** * 開往的方向; */ private String busDrection=null; /** * 構造函數; */ 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、最后的周邊公交查詢結果如下圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。