上一篇文章介紹了如何在Android平臺(tái)上利用百度地圖進(jìn)行定位,接下來(lái)就介紹一下在獲取的定位功能的基礎(chǔ)上采用百度地圖來(lái)獲取周邊的公交信息。
創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)越秀,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575
這里采用如上文同樣的方式,單獨(dú)寫(xiě)一個(gè)類(lèi),該類(lèi)是對(duì)周邊搜索功能的封裝,NearbySearchHelper。該類(lèi)向外部只暴露一個(gè)函數(shù)SearchNearby()接口;
實(shí)現(xiàn)的主要流程時(shí),根據(jù)當(dāng)前的定位獲取周邊的公交車(chē)的信息,并排除了冗余的公交車(chē)線路信息,根據(jù)搜索到的公交線路信息,繼續(xù)搜索該公交車(chē)的uid(百度地圖的唯一標(biāo)示符),再根據(jù)具體的uid來(lái)搜索詳細(xì)的公交車(chē)信息,包括起始站點(diǎn)。具體代碼如下:
1、創(chuàng)建周邊公交搜索幫助類(lèi):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;
/**
* 周邊公交查詢(xún)幫助類(lèi);這里需要實(shí)現(xiàn)百度地圖的兩個(gè)接口,一個(gè)是Poi搜索監(jiān)聽(tīng)器,一個(gè)是公交路線搜索監(jiān)聽(tīng)器;
* @author Render;
*/
public class NearbySearchHelper implements OnGetPoiSearchResultListener,
OnGetBusLineSearchResultListener{
public static final String TAG = "NearbySearchHelper";
private final int BUSSTATION=0; // 先查詢(xún)周邊的公交站點(diǎn)信息;
private final int BUSLINE=1; // 站點(diǎn)的公交信息;
private PoiSearch mSearch = null; // Poi點(diǎn)搜索模塊;
private BusLineSearch mBusLineSearch = null; // 公交路線搜索模塊;
private int mType; // 查詢(xún)類(lèi)型;
private int nodeIndex=-1; // 查詢(xún)的索引;
private MrNearbySearchListener nearBySearchListener; //查詢(xún)結(jié)束監(jiān)聽(tīng)對(duì)象,該對(duì)象是為了封裝而重新的一個(gè)監(jiān)聽(tīng)器;
private List<MrNearbyBus> nearbyBuses=null; //查詢(xún)的結(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();
}
}
/**
* 銷(xiāo)毀函數(shù);
*/
public void Destory(){
mSearch.destroy();
mBusLineSearch.destroy();
}
/**
* 搜索的周邊的函數(shù);由外部程序直接調(diào)用;
*/
public void searchNearby(){
//設(shè)置當(dāng)前的搜索類(lèi)型是公交站點(diǎn)的搜索;
mType=BUSSTATION;
//獲取當(dāng)前位置的經(jīng)度與緯度,該值是通過(guò)上文的定位方式來(lái)獲取的;
double latitude=CustomApplication.mLastLocation.getLatitude();
double longtitude=CustomApplication.mLastLocation.getLongitude();
//查詢(xún)周邊公交線路;采用百度地圖的周邊搜索接口,并定義周邊點(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)前的搜索類(lèi)型來(lái)進(jìn)行判斷;
@Override
public void onGetPoiResult(PoiResult result) {
switch(mType)
{
case BUSSTATION:
{
//如果查詢(xún)失敗直接返回;
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)
{
LogUtils.i(TAG, "查詢(xún)站點(diǎn)失敗!");
nearBySearchListener.onRefreshBusNearby(nearbyBuses);
return;
}
//處理公交站點(diǎn)的搜索結(jié)果;
ProcessBusStation(result);
break;
}
case BUSLINE:
{
//如果查詢(xún)失敗直接返回;
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)
{
LogUtils.i(TAG, "查詢(xún)線路失敗!");
nearBySearchListener.onRefreshBusNearby(nearbyBuses);
return;
}
//處理公交線路的搜索結(jié)果;
ProcessBusLine(result);
break;
}
}
}
/**
* 主要是尋找該站點(diǎn)中是否存在相同的公交,如果存在則取兩趟公交距離當(dāng)前位置最近的點(diǎn);
* 由于是搜索周邊的公交站,可能會(huì)存在一趟公交車(chē)經(jīng)過(guò)周邊的兩個(gè)或者三個(gè)公交站,為了排除冗余的信息,
* 故需要判斷同一輛公交車(chē)的多個(gè)車(chē)站那個(gè)車(chē)站距離當(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++)
{
//如果存在名稱(chēng)相同的公交線路;
if(nearbyBuses.get(i).getBusName().equals(busName))
{
LatLng oldLocation=nearbyBuses.get(i).getStationLaction();
//DistanceUtil是百度地圖提供的計(jì)算兩個(gè)經(jīng)緯度坐標(biāo)之間的距離工具類(lèi);
oldDistance=DistanceUtil.getDistance(nowLocation, oldLocation);
//如果當(dāng)前的距離小于之前的距離,則更新該公交車(chē)的信息;
if(newDistance<oldDistance)
{
nearbyBuses.get(i).setStationLaction(newLocation);
nearbyBuses.get(i).setStationName(nearbyBus.getStationName());
}
return true;
}
}
return false;
}
/**
* 處理查詢(xún)后的結(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)來(lái)搜索公交路線,由于搜索時(shí)間有可能會(huì)挺長(zhǎng),故查詢(xún)完站點(diǎn)后就調(diào)用周邊搜索監(jiān)聽(tīng)器
//來(lái)刷新數(shù)據(jù),UI線程實(shí)現(xiàn)了該監(jiān)聽(tīng)器,則可以直接刷新數(shù)據(jù)。
searchBusLine();
nearBySearchListener.onRefreshBusNearby(nearbyBuses);
}
/**
* 查詢(xún)公交線路;
*/
private void searchBusLine(){
//nodeIndex表示當(dāng)前周邊站點(diǎn)的索引;
nodeIndex++;
mType=BUSLINE;
if(nearbyBuses.isEmpty()){
return;
}
//部分刷新;
if(nodeIndex%5==0){
nearBySearchListener.onRefreshBusNearby(nearbyBuses);
}
//如果此時(shí)返回表明查詢(xún)完畢;
if(nodeIndex >= nearbyBuses.size()){
LogUtils.i(TAG, "查詢(xún)完畢!");
nearBySearchListener.onRefreshBusNearby(nearbyBuses);
return;
}
//這里還是采用搜索周邊的方式,效率會(huì)更高;
double latitude=CustomApplication.mLastLocation.getLatitude();
double longtitude=CustomApplication.mLastLocation.getLongitude();
//獲取當(dāng)前節(jié)點(diǎn)下的周邊公交車(chē)的公交名稱(chēng);
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)來(lái);
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 { //否則是返程公交車(chē);
nearbyBus.setReverseUid(poi.uid);;
}
}
}
searchBusLine();
}
}
2、在UI中 通過(guò)該NearbySearchHelper對(duì)象可以快速的搜索到周邊的公交車(chē)信息,代碼如下:
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)建周邊搜索幫助類(lèi),初始化該幫助類(lèi),并設(shè)置幫助類(lèi)的監(jiān)聽(tīng)器;
*/
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;
/**
* 周邊的公交車(chē)信息;
* @author Render;
*/
public class MrNearbyBus {
/**
* 公交車(chē)名稱(chēng);
*/
private String busName=null;
/**
* 該公交線路的uid;
*/
private String uid=null;
/**
* 反向公交的Uid;
*/
private String reverseUid=null;
/**
* 查到周?chē)恼军c(diǎn)名稱(chēng),根據(jù)該名稱(chēng)查到的公交線路;
*/
private String stationName=null;
/**
* 站點(diǎn)位置;
*/
private LatLng stationLaction=null;
/**
* 開(kāi)往的方向;
*/
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、最后的周邊公交查詢(xún)結(jié)果如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)頁(yè)名稱(chēng):android實(shí)現(xiàn)查詢(xún)公交車(chē)還有幾站的功能
文章轉(zhuǎn)載:http://www.chinadenli.net/article16/iieogg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、定制網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)頁(yè)設(shè)計(jì)公司、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)