<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在" />
<EditText
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="北京" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="市内找" />
<EditText
android:id="@+id/searchkey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="717" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="公交车" />
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_weight="1"
android:background="@drawable/button_style"
android:onClick="searchButtonProcess"
android:text="开始" />
<Button
android:id="@+id/nextline"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_weight="1"
android:background="@drawable/button_style"
android:onClick="SearchNextBusline"
android:text="下一条" />
</LinearLayout>
</LinearLayout>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.baidu.mapapi.map.SupportMapFragment"
android:clickable="true" />
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignWithParentIfMissing="false"
android:layout_centerHorizontal="true"
android:layout_centerVertical="false"
android:layout_marginBottom="10dip" >
<Button
android:id="@+id/pre"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_weight="1.0"
android:background="@drawable/pre_"
android:onClick="nodeClick" />
<Button
android:id="@+id/next"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_weight="1.0"
android:background="@drawable/next_"
android:onClick="nodeClick" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
package baidumapsdk.demo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.SupportMapFragment;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.overlayutil.BusLineOverlay;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
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.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
/**
* 此demo用来展示如何进行公交线路详情检索,并使用RouteOverlay在地图上绘制 同时展示如何浏览路线节点并弹出泡泡
*
* 介绍查询公交线路功能
*/
public class BusLineSearchDemo extends FragmentActivity implements
OnGetPoiSearchResultListener, OnGetBusLineSearchResultListener,
BaiduMap.OnMapClickListener {
private Button mBtnPre = null;// 上一个节点
private Button mBtnNext = null;// 下一个节点
private int nodeIndex = -2;// 节点索引,供浏览节点时使用
/**
* 公共交通信息查询结果
* */
private BusLineResult route = null;// 保存驾车/步行路线数据的变量,供浏览节点时使用
private List<String> busLineIDList = null;
private int busLineIndex = 0;
/**
* POI检索接口
* */
private PoiSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
/**
* 城市公交信息(包含地铁信息)查询,该接口用于查询整条公交线路信息
* 公交换乘路线查询请参看 RoutePlanSearch
* */
private BusLineSearch mBusLineSearch = null;
private BaiduMap mBaiduMap = null;
/**
* 用于显示一条公交详情结果的Overlay
* */
BusLineOverlay overlay;//公交路线绘制对象
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_busline);
CharSequence titleLable = "公交线路查询功能";
setTitle(titleLable);
mBtnPre = (Button) findViewById(R.id.pre);
mBtnNext = (Button) findViewById(R.id.next);
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
mBaiduMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.bmapView)).getBaiduMap();
/**
* public final void setOnMapClickListener(BaiduMap.OnMapClickListener listener)
* 设置地图单击事件监听者
* @param listener - 地图单击事件监听者
* 需要实现BaiduMap.OnMapClickListener接口的
* onMapClick(LatLng point)和onMapPoiClick(MapPoi poi)方法
* */
mBaiduMap.setOnMapClickListener(this);
/**
* public static PoiSearch newInstance()
* 创建PoiSearch实例
* @return PoiSearch实例
* */
mSearch = PoiSearch.newInstance();
/**
* public void setOnGetPoiSearchResultListener(OnGetPoiSearchResultListener listener)
* 设置poi检索监听者
* @param listener - 监听者
* 需要实现onGetPoiDetailResult(PoiDetailResult result)和 onGetPoiResult(PoiResult result)方法
* */
mSearch.setOnGetPoiSearchResultListener(this);
/**
* public static BusLineSearch newInstance()
* 获取一个新的检索实例
* @param 检索实例
* */
mBusLineSearch = BusLineSearch.newInstance();
/**
* public void setOnGetBusLineSearchResultListener(OnGetBusLineSearchResultListener listener)
* 设置公交详情检索结果监听者
* @param listener - 公交详情检索结果监听者
*
* 需要实现OnGetBusLineSearchResultListener接口的 onGetBusLineResult方法
* */
mBusLineSearch.setOnGetBusLineSearchResultListener(this);
busLineIDList = new ArrayList<String>();
/**
* public BusLineOverlay(BaiduMap baiduMap)
* 构造函数
* @param baiduMap - 该BusLineOverlay所引用的 BaiduMap 对象
* */
overlay = new BusLineOverlay(mBaiduMap);
/**
* 设置地图 Marker 覆盖物点击事件监听者
* */
mBaiduMap.setOnMarkerClickListener(overlay);
}
/**
* 开始查询按钮点击事件
* 发起检索
*
* @param v
*/
public void searchButtonProcess(View v) {
busLineIDList.clear();
busLineIndex = 0;
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
EditText editCity = (EditText) findViewById(R.id.city);
EditText editSearchKey = (EditText) findViewById(R.id.searchkey);
//发起poi检索,从得到所有poi中找到公交线路类型的poi,再使用该poi的uid进行公交详情搜索
/**
* public boolean searchInCity(PoiCitySearchOption option)
* 城市内检索
* @param option - 请求参数
* @return 成功发起检索返回true , 失败返回false
*
* public PoiCitySearchOption city(java.lang.String city)
* 检索城市
* @param city - 检索城市
* @return 该poi城市内检索参数对象
*
* public PoiCitySearchOption keyword(java.lang.String key)
* 搜索关键字
* @param key - 搜索关键字
* @return 该poi城市内检索参数对象
* */
mSearch.searchInCity((new PoiCitySearchOption())
.city(editCity.getText().toString())
.keyword(editSearchKey.getText().toString()));
}
/**
* 下一条按钮点击事件
* */
public void SearchNextBusline(View v) {
if (busLineIndex >= busLineIDList.size()) {
busLineIndex = 0;
}
if (busLineIndex >= 0 && busLineIndex < busLineIDList.size()
&& busLineIDList.size() > 0) {
/**
* public boolean searchBusLine(BusLineSearchOption option)
* 公交检索入口
* @param option - 请求参数
* @return 成功发起检索返回true , 失败返回false*
* */
/**
* BusLineSearchOption:城市公交信息查询参数
*
* public BusLineSearchOption city(java.lang.String city)
* 设置查询城市
* @param city - 查询城市
* @return 该公交信息查询参数对象
*
* public BusLineSearchOption uid(java.lang.String uid)
* 设置公交路线uid.
* @param uid - uid 可以由poi检索时传入公交路线关键字得到
* @return 该公交信息查询参数对象
* */
mBusLineSearch.searchBusLine((new BusLineSearchOption()
.city(((EditText) findViewById(R.id.city)).getText().toString())
.uid(busLineIDList.get(busLineIndex))));
busLineIndex++;
}
}
/**
* 节点浏览示例
*
* @param v
*/
public void nodeClick(View v) {
if (nodeIndex < -1 || route == null
|| nodeIndex >= route.getStations().size())
return;
TextView popupText = new TextView(this);
popupText.setBackgroundResource(R.drawable.popup);
popupText.setTextColor(0xff000000);
// 上一个节点
if (mBtnPre.equals(v) && nodeIndex > 0) {
// 索引减
nodeIndex--;
}
// 下一个节点
if (mBtnNext.equals(v) && nodeIndex < (route.getStations().size() - 1)) {
// 索引加
nodeIndex++;
}
if(nodeIndex >= 0){
// 移动到指定索引的坐标
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(route
.getStations().get(nodeIndex).getLocation()));
// 弹出泡泡
popupText.setText(route.getStations().get(nodeIndex).getTitle());
mBaiduMap.showInfoWindow(new InfoWindow(popupText, route.getStations()
.get(nodeIndex).getLocation(), 0));
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
/**
* 释放检索对象
* */
mSearch.destroy();
/**
* 释放检索对象资源
* */
mBusLineSearch.destroy();
super.onDestroy();
}
//OnGetBusLineSearchResultListener
@Override
public void onGetBusLineResult(BusLineResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
return;
}
mBaiduMap.clear();
route = result;
nodeIndex = -1;
/**
* OverlayManager:
* removeFromMap():将所有Overlay从 地图上消除
* */
overlay.removeFromMap();
/**
* public void setData(BusLineResult result)
* 设置公交线数据
* @param result - 公交线路结果数据
* */
overlay.setData(result);
/**
* public final void addToMap()
* 将所有Overlay 添加到地图上
* */
overlay.addToMap();
/**
* public void zoomToSpan()
* 缩放地图,使所有Overlay都在合适的视野内
* 注: 该方法只对Marker类型的overlay有效
* */
overlay.zoomToSpan();
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
Toast.makeText(BusLineSearchDemo.this, result.getBusLineName(),
Toast.LENGTH_SHORT).show();
}
//OnGetPoiSearchResultListener
@Override
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
return;
}
// 遍历所有poi,找到类型为公交线路的poi
busLineIDList.clear();
/**
*public java.util.List<PoiInfo> getAllPoi()
*获取Poi检索结果
*@return Poi检索结果
**/
for (PoiInfo poi : result.getAllPoi()) {
/**
* public PoiInfo.POITYPE type
* poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路,
* */
if (poi.type == PoiInfo.POITYPE.BUS_LINE
|| poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
/**
* poi id 如果为isPano为true,可用此参数调用街景组件PanoramaService类的
* requestPanoramaWithPoiUId方法检索街景数据
* */
busLineIDList.add(poi.uid);
}
}
SearchNextBusline(null);
route = null;
}
@Override
public void onGetPoiDetailResult(PoiDetailResult result) {
}
//BaiduMap.OnMapClickListener
@Override
public void onMapClick(LatLng point) {
/**
* 隐藏当前 InfoWindow
* */
mBaiduMap.hideInfoWindow();
}
@Override
public boolean onMapPoiClick(MapPoi poi) {
return false;
}
}