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

