您的位置:首页 > 大数据 > 人工智能

BaiduMap---百度地图官方Demo之公交线路查询功能(介绍查询公交线路功能)

2015-07-02 11:54 621 查看
<?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;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐