android实现查询公交车还有几站的功能

上一篇文章介绍了如何在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、最后的周边公交查询结果如下图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android百度地图之公交线路详情搜索

    本篇文章可以实现百度公交线路搜索,可以选择多条线路,具体实现代码如下: 一.公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公交线路详情. 1.获取公交线路的Uid: /* * 获得公交线路图的Uid,并且根据系Uid发起公交线路详情的检索 * * @see * com.baidu.mapapi.MKSearchListener#onGetPoiResult(com.baidu.mapapi * .MKPoiResult, int, int) */

  • Android百度地图自定义公交路线导航

    一.问题描述 基于百度地图实现检索指定城市指定公交的交通路线图,效果如图所示 二.通用组件Application类,主要创建并初始化BMapManager public class App extends Application { static App mDemoApp; //百度MapAPI的管理类 public BMapManager mBMapMan = null; // 授权Key // 申请地址:http://dev.baidu.com/wiki/static/imap/key/ p

  • android实现查询公交车还有几站的功能

    上一篇文章介绍了如何在Android平台上利用百度地图进行定位,接下来就介绍一下在获取的定位功能的基础上采用百度地图来获取周边的公交信息. 这里采用如上文同样的方式,单独写一个类,该类是对周边搜索功能的封装,NearbySearchHelper.该类向外部只暴露一个函数SearchNearby()接口; 实现的主要流程时,根据当前的定位获取周边的公交车的信息,并排除了冗余的公交车线路信息,根据搜索到的公交线路信息,继续搜索该公交车的uid(百度地图的唯一标示符),再根据具体的uid来搜索详细的公

  • Android基于自带的DownloadManager实现下载功能示例

    本文实例讲述了Android基于自带的DownloadManager实现下载功能.分享给大家供大家参考,具体如下: DownloadManager.Request request = new DownloadManager.Request(Uri.parse(APK_URL)); request.setDestinationInExternalPublicDir(DOWNLOAD_FOLDER_NAME, DOWNLOAD_FILE_NAME); request.setTitle(getStri

  • Android多线程+单线程+断点续传+进度条显示下载功能

    效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum

  • Android编程实现变化的双重选择框功能示例

    本文实例讲述了Android编程实现变化的双重选择框功能.分享给大家供大家参考,具体如下: 原理:定义四个RadioGroup,通过第一个RadioGroup的选择来控制其余几个radiogroup的显隐 布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

  • Android中的Bmob移动后端云服务器功能

    源码下载:http://xiazai.jb51.net/201801/yuanma/BmobTest1.rar PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己用servlet作为服务端来实现过滤没有注册过的用户,但是太麻烦,而且不是随时都可以用的.这里介绍一个移动后端云服务器平台bmob,这不仅可以实现云数据库储存,还可以获取手机验证等,随时随地都很轻松,下面写一个小demo,实现一个登陆注册功能,认识增删查改.下面我稍微写一个例子,简单实现注册登录功能.

  • 使用Laravel中的查询构造器实现增删改查功能

    引言 上一篇介绍了如何在windows环境下跑一个 laravel 项目,这一篇写如何使用 laravel 中的 查询构造器 实现增删改查. 读这篇文章时我默认你已拥有如下知识: 了解php的基础语法 了解数据库设计 了解常用的sql查询 正文 实现增删改查前, 我们先准备一些步骤: php, nginx, mysql 服务正确启用 新建一个数据库及其数据表 开启服务我们打开上篇文章介绍的 Wnmp.exe -> Start all 然后cmd上键入命令: D:/wnmp/Wnmp/php/ph

  • Android中RecyclerView拖拽、侧删功能的实现代码

    废话不多说,下面展示一下效果. 这是GridView主文件实现. public class GridViewActivity extends AppCompatActivity { RecyclerView mRecyclerView; List<String> mStringList; RecyclerAdapter mRecyAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { s

  • Android编程实现的首页左右滑动切换功能示例

    本文实例讲述了Android编程实现的首页左右滑动切换功能.分享给大家供大家参考,具体如下: 很多软件会选择左右滑动的主界面,实现方式也很多,这里的仅供参考,勿喷. 不多说什么了,相信大家看看代码就明白,自己也不善言辞,望大家谅解. 自定义接口,监听滑动翻页事件: /** 滑动后翻页事件 */ public interface OnViewChangedListener { public void OnViewChanged(int viewId); } 滑动翻页view(滑动翻页不是很灵敏):

  • Android实现文件上传和下载倒计时功能的圆形进度条

    screenshot 截图展示 import step1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } step2. Add the dependency dependencies { compile 'com.github.yanjiabin:ExtendsRingPrigr

  • Android编程实现对电池状态的监视功能示例

    本文实例讲述了Android编程实现对电池状态的监视功能.分享给大家供大家参考,具体如下: 最近在开发一个与GPS相关的项目,因为其中涉及到了GPS的使用,众所周知,GPS是相当耗电的,因此就想着怎么能知道当前的电量,并且在电量达到一个下限的时候,及时提醒给用户,以根据情况关闭GPS,节省电量,以备电话急用,后来查资料,看API,终于找到了方法,怎么来监视电量,根据电量的变化来获取当前的电量多少,并且根据其它状态综合对手机进行管理,以达到管理最优的状态. 下面是代码: private Broad

随机推荐