实例介绍
【实例简介】android 百度地图 源码
【实例截图】
【核心代码】
package baidumapsdk.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MKMapTouchListener;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.PopupClickListener;
import com.baidu.mapapi.map.PopupOverlay;
import com.baidu.mapapi.map.RouteOverlay;
import com.baidu.mapapi.map.TransitOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPlanNode;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKRoute;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
* 此demo用来展示如何进行驾车、步行、公交路线搜索并在地图使用RouteOverlay、TransitOverlay绘制
* 同时展示如何进行节点浏览并弹出泡泡
*
*/
public class RoutePlanDemo extends Activity {
//UI相关
Button mBtnDrive = null; // 驾车搜索
Button mBtnTransit = null; // 公交搜索
Button mBtnWalk = null; // 步行搜索
Button mBtnCusRoute = null; //自定义路线
Button mBtnCusIcon = null ; //自定义起终点图标
//浏览路线节点相关
Button mBtnPre = null;//上一个节点
Button mBtnNext = null;//下一个节点
int nodeIndex = -2;//节点索引,供浏览节点时使用
MKRoute route = null;//保存驾车/步行路线数据的变量,供浏览节点时使用
TransitOverlay transitOverlay = null;//保存公交路线图层数据的变量,供浏览节点时使用
RouteOverlay routeOverlay = null;
boolean useDefaultIcon = false;
int searchType = -1;//记录搜索的类型,区分驾车/步行和公交
private PopupOverlay pop = null;//弹出泡泡图层,浏览节点时使用
private TextView popupText = null;//泡泡view
private View viewCache = null;
//地图相关,使用继承MapView的MyRouteMapView目的是重写touch事件实现泡泡处理
//如果不处理touch事件,则无需继承,直接使用MapView即可
MapView mMapView = null; // 地图View
//搜索相关
MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 使用地图sdk前需先初始化BMapManager.
* BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
* 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
*/
DemoApplication app = (DemoApplication)this.getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(getApplicationContext());
/**
* 如果BMapManager没有初始化则初始化BMapManager
*/
app.mBMapManager.init(new DemoApplication.MyGeneralListener());
}
setContentView(R.layout.routeplan);
CharSequence titleLable="路线规划功能";
setTitle(titleLable);
//初始化地图
mMapView = (MapView)findViewById(R.id.bmapView);
mMapView.setBuiltInZoomControls(false);
mMapView.getController().setZoom(12);
mMapView.getController().enableClick(true);
//初始化按键
mBtnDrive = (Button)findViewById(R.id.drive);
mBtnTransit = (Button)findViewById(R.id.transit);
mBtnWalk = (Button)findViewById(R.id.walk);
mBtnPre = (Button)findViewById(R.id.pre);
mBtnNext = (Button)findViewById(R.id.next);
mBtnCusRoute = (Button)findViewById(R.id.custombutton);
mBtnCusIcon = (Button)findViewById(R.id.customicon);
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
//按键点击事件
OnClickListener clickListener = new OnClickListener(){
public void onClick(View v) {
//发起搜索
SearchButtonProcess(v);
}
};
OnClickListener nodeClickListener = new OnClickListener(){
public void onClick(View v) {
//浏览路线节点
nodeClick(v);
}
};
OnClickListener customClickListener = new OnClickListener(){
public void onClick(View v) {
//自设路线绘制示例
intentToActivity();
}
};
OnClickListener changeRouteIconListener = new OnClickListener(){
@Override
public void onClick(View arg0) {
changeRouteIcon();
}
};
mBtnDrive.setOnClickListener(clickListener);
mBtnTransit.setOnClickListener(clickListener);
mBtnWalk.setOnClickListener(clickListener);
mBtnPre.setOnClickListener(nodeClickListener);
mBtnNext.setOnClickListener(nodeClickListener);
mBtnCusRoute.setOnClickListener(customClickListener);
mBtnCusIcon.setOnClickListener(changeRouteIconListener);
//创建 弹出泡泡图层
createPaopao();
//地图点击事件处理
mMapView.regMapTouchListner(new MKMapTouchListener(){
@Override
public void onMapClick(GeoPoint point) {
//在此处理地图点击事件
//消隐pop
if ( pop != null ){
pop.hidePop();
}
}
@Override
public void onMapDoubleClick(GeoPoint point) {
}
@Override
public void onMapLongClick(GeoPoint point) {
}
});
// 初始化搜索模块,注册事件监听
mSearch = new MKSearch();
mSearch.init(app.mBMapManager, new MKSearchListener(){
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
//起点或终点有歧义,需要选择具体的城市列表或地址列表
if (error == MKEvent.ERROR_ROUTE_ADDR){
//遍历所有地址
// ArrayList<MKPoiInfo> stPois = res.getAddrResult().mStartPoiList;
// ArrayList<MKPoiInfo> enPois = res.getAddrResult().mEndPoiList;
// ArrayList<MKCityListInfo> stCities = res.getAddrResult().mStartCityList;
// ArrayList<MKCityListInfo> enCities = res.getAddrResult().mEndCityList;
return;
}
// 错误号可参考MKEvent中的定义
if (error != 0 || res == null) {
Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
return;
}
searchType = 0;
routeOverlay = new RouteOverlay(RoutePlanDemo.this, mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0).getRoute(0));
//清除其他图层
mMapView.getOverlays().clear();
//添加路线图层
mMapView.getOverlays().add(routeOverlay);
//执行刷新使生效
mMapView.refresh();
// 使用zoomToSpan()绽放地图,使路线能完全显示在地图上
mMapView.getController().zoomToSpan(routeOverlay.getLatSpanE6(), routeOverlay.getLonSpanE6());
//移动地图到起点
mMapView.getController().animateTo(res.getStart().pt);
//将路线数据保存给全局变量
route = res.getPlan(0).getRoute(0);
//重置路线节点索引,节点浏览时使用
nodeIndex = -1;
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
}
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
//起点或终点有歧义,需要选择具体的城市列表或地址列表
if (error == MKEvent.ERROR_ROUTE_ADDR){
//遍历所有地址
// ArrayList<MKPoiInfo> stPois = res.getAddrResult().mStartPoiList;
// ArrayList<MKPoiInfo> enPois = res.getAddrResult().mEndPoiList;
// ArrayList<MKCityListInfo> stCities = res.getAddrResult().mStartCityList;
// ArrayList<MKCityListInfo> enCities = res.getAddrResult().mEndCityList;
return;
}
if (error != 0 || res == null) {
Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
return;
}
searchType = 1;
transitOverlay = new TransitOverlay (RoutePlanDemo.this, mMapView);
// 此处仅展示一个方案作为示例
transitOverlay.setData(res.getPlan(0));
//清除其他图层
mMapView.getOverlays().clear();
//添加路线图层
mMapView.getOverlays().add(transitOverlay);
//执行刷新使生效
mMapView.refresh();
// 使用zoomToSpan()绽放地图,使路线能完全显示在地图上
mMapView.getController().zoomToSpan(transitOverlay.getLatSpanE6(), transitOverlay.getLonSpanE6());
//移动地图到起点
mMapView.getController().animateTo(res.getStart().pt);
//重置路线节点索引,节点浏览时使用
nodeIndex = 0;
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
}
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
//起点或终点有歧义,需要选择具体的城市列表或地址列表
if (error == MKEvent.ERROR_ROUTE_ADDR){
//遍历所有地址
// ArrayList<MKPoiInfo> stPois = res.getAddrResult().mStartPoiList;
// ArrayList<MKPoiInfo> enPois = res.getAddrResult().mEndPoiList;
// ArrayList<MKCityListInfo> stCities = res.getAddrResult().mStartCityList;
// ArrayList<MKCityListInfo> enCities = res.getAddrResult().mEndCityList;
return;
}
if (error != 0 || res == null) {
Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
return;
}
searchType = 2;
routeOverlay = new RouteOverlay(RoutePlanDemo.this, mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0).getRoute(0));
//清除其他图层
mMapView.getOverlays().clear();
//添加路线图层
mMapView.getOverlays().add(routeOverlay);
//执行刷新使生效
mMapView.refresh();
// 使用zoomToSpan()绽放地图,使路线能完全显示在地图上
mMapView.getController().zoomToSpan(routeOverlay.getLatSpanE6(), routeOverlay.getLonSpanE6());
//移动地图到起点
mMapView.getController().animateTo(res.getStart().pt);
//将路线数据保存给全局变量
route = res.getPlan(0).getRoute(0);
//重置路线节点索引,节点浏览时使用
nodeIndex = -1;
mBtnPre.setVisibility(View.VISIBLE);
mBtnNext.setVisibility(View.VISIBLE);
}
public void onGetAddrResult(MKAddrInfo res, int error) {
}
public void onGetPoiResult(MKPoiResult res, int arg1, int arg2) {
}
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
}
@Override
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
}
@Override
public void onGetPoiDetailSearchResult(int type, int iError) {
// TODO Auto-generated method stub
}
@Override
public void onGetShareUrlResult(MKShareUrlResult result, int type,
int error) {
// TODO Auto-generated method stub
}
});
}
/**
* 发起路线规划搜索示例
* @param v
*/
void SearchButtonProcess(View v) {
//重置浏览节点的路线数据
route = null;
routeOverlay = null;
transitOverlay = null;
mBtnPre.setVisibility(View.INVISIBLE);
mBtnNext.setVisibility(View.INVISIBLE);
// 处理搜索按钮响应
EditText editSt = (EditText)findViewById(R.id.start);
EditText editEn = (EditText)findViewById(R.id.end);
// 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索
MKPlanNode stNode = new MKPlanNode();
stNode.name = editSt.getText().toString();
MKPlanNode enNode = new MKPlanNode();
enNode.name = editEn.getText().toString();
// 实际使用中请对起点终点城市进行正确的设定
if (mBtnDrive.equals(v)) {
mSearch.drivingSearch("北京", stNode, "北京", enNode);
} else if (mBtnTransit.equals(v)) {
mSearch.transitSearch("北京", stNode, enNode);
} else if (mBtnWalk.equals(v)) {
mSearch.walkingSearch("北京", stNode, "北京", enNode);
}
}
/**
* 节点浏览示例
* @param v
*/
public void nodeClick(View v){
viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);
popupText =(TextView) viewCache.findViewById(R.id.textcache);
if (searchType == 0 || searchType == 2){
//驾车、步行使用的数据结构相同,因此类型为驾车或步行,节点浏览方法相同
if (nodeIndex < -1 || route == null || nodeIndex >= route.getNumSteps())
return;
//上一个节点
if (mBtnPre.equals(v) && nodeIndex > 0){
//索引减
nodeIndex--;
//移动到指定索引的坐标
mMapView.getController().animateTo(route.getStep(nodeIndex).getPoint());
//弹出泡泡
popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(route.getStep(nodeIndex).getContent());
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
route.getStep(nodeIndex).getPoint(),
5);
}
//下一个节点
if (mBtnNext.equals(v) && nodeIndex < (route.getNumSteps()-1)){
//索引加
nodeIndex ;
//移动到指定索引的坐标
mMapView.getController().animateTo(route.getStep(nodeIndex).getPoint());
//弹出泡泡
popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(route.getStep(nodeIndex).getContent());
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
route.getStep(nodeIndex).getPoint(),
5);
}
}
if (searchType == 1){
//公交换乘使用的数据结构与其他不同,因此单独处理节点浏览
if (nodeIndex < -1 || transitOverlay == null || nodeIndex >= transitOverlay.getAllItem().size())
return;
//上一个节点
if (mBtnPre.equals(v) && nodeIndex > 1){
//索引减
nodeIndex--;
//移动到指定索引的坐标
mMapView.getController().animateTo(transitOverlay.getItem(nodeIndex).getPoint());
//弹出泡泡
popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(transitOverlay.getItem(nodeIndex).getTitle());
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
transitOverlay.getItem(nodeIndex).getPoint(),
5);
}
//下一个节点
if (mBtnNext.equals(v) && nodeIndex < (transitOverlay.getAllItem().size()-2)){
//索引加
nodeIndex ;
//移动到指定索引的坐标
mMapView.getController().animateTo(transitOverlay.getItem(nodeIndex).getPoint());
//弹出泡泡
popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(transitOverlay.getItem(nodeIndex).getTitle());
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
transitOverlay.getItem(nodeIndex).getPoint(),
5);
}
}
}
/**
* 创建弹出泡泡图层
*/
public void createPaopao(){
//泡泡点击响应回调
PopupClickListener popListener = new PopupClickListener(){
@Override
public void onClickedPopup(int index) {
Log.v("click", "clickapoapo");
}
};
pop = new PopupOverlay(mMapView,popListener);
}
/**
* 跳转自设路线Activity
*/
public void intentToActivity(){
//跳转到自设路线演示demo
Intent intent = new Intent(this, CustomRouteOverlayDemo.class);
startActivity(intent);
}
/**
* 切换路线图标,刷新地图使其生效
* 注意: 起终点图标使用中心对齐.
*/
protected void changeRouteIcon() {
Button btn = (Button)findViewById(R.id.customicon);
if ( routeOverlay == null && transitOverlay == null){
return ;
}
if ( useDefaultIcon ){
if ( routeOverlay != null){
routeOverlay.setStMarker(null);
routeOverlay.setEnMarker(null);
}
if ( transitOverlay != null){
transitOverlay.setStMarker(null);
transitOverlay.setEnMarker(null);
}
btn.setText("自定义起终点图标");
Toast.makeText(this,
"将使用系统起终点图标",
Toast.LENGTH_SHORT).show();
}
else{
if ( routeOverlay != null){
routeOverlay.setStMarker(getResources().getDrawable(R.drawable.icon_st));
routeOverlay.setEnMarker(getResources().getDrawable(R.drawable.icon_en));
}
if ( transitOverlay != null){
transitOverlay.setStMarker(getResources().getDrawable(R.drawable.icon_st));
transitOverlay.setEnMarker(getResources().getDrawable(R.drawable.icon_en));
}
btn.setText("系统起终点图标");
Toast.makeText(this,
"将使用自定义起终点图标",
Toast.LENGTH_SHORT).show();
}
useDefaultIcon = !useDefaultIcon;
mMapView.refresh();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
mMapView.destroy();
mSearch.destory();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论