看看这个利用百度地图定位并实现目的地导航的Demo。
首先看实现效果:
进 入后首先会得到当前位置,在地图上显示出来。在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、 步行线路,在代码中都有具体凝视。另外,在控制台还输出了线路上每个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。例如以下 图:
接下来就看怎样实现了,首先。注冊百度开发人员账号,并进入百度地图API查看相关资料百度地图API,然后就是为须要增加地图的应用注冊APP
KEY,注冊完后,下载百度地图jar文件。新建project。并导入就可以。以下看实现具体代码,在代码中有具体凝视:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
public
extends
private
"注冊自己的key" ;
private
null ;
private
null ;
private
null ;
private
null ;
private
null ;
//onResume时注冊此listener,onPause时须要Remove,注意此listener不是Android自带的,是百度API中的
private
private
GeoPoint
@Override public
super .onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
destinationEditText this .findViewById(R.id.et_destination);
startNaviButton this .findViewById(R.id.btn_navi);
mMapManager new
mMapManager.init(mMapKey, new
super .initMapActivity(mMapManager);
mapView this .findViewById(R.id.bmapsView);
//设置启用内置的缩放控件
mapView.setBuiltInZoomControls( true );
//设置在缩放动画过程中也显示overlay,默觉得不绘制
//
//获取当前位置层
myLocationOverlay new
this ,
//将当前位置的层加入到地图底层中
mapView.getOverlays().add(myLocationOverlay);
//
locationListener new
@Override public
if
null ){
//生成GEO类型坐标并在地图上定位到该坐标标示的地点
pt new
int )(location.getLatitude()*1e6),
( int )(location.getLongitude()*1e6));
//
mapView.getController().animateTo(pt);
}
}
};
//初始化搜索模块
searchModel new
//设置路线策略为最短距离
searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);
searchModel.init(mMapManager, new
//获取驾车路线回调方法
@Override public
int
//
if
0
null )
Toast.makeText(NavigationDemoActivity. this , "抱歉,未找到结果" ,
return ;
}
RouteOverlay new
this ,
//
MKRoute 0 ).getRoute( 0 );
int
String 1000 ) "." +String.valueOf(distanceM 1000 );
System.out.println( "距离:" +distanceKm+ "公里---节点数量:" +route.getNumSteps());
for
int
0 ;
MKStep
System.out.println( "节点信息:" +step.getContent());
}
routeOverlay.setData(route);
mapView.getOverlays().clear();
mapView.getOverlays().add(routeOverlay);
mapView.invalidate();
mapView.getController().animateTo(res.getStart().pt);
}
//下面两种方式和上面的驾车方案实现方法一样
@Override public
int
//获取步行路线
}
@Override public
int
//获取公交线路
}
@Override public
int
}
@Override public
int
}
@Override public
int
}
@Override public
int
int
}
});
startNaviButton.setOnClickListener( new
@Override public
String
//设置起始地(当前位置)
MKPlanNode new
startNode.pt
//设置目的地
MKPlanNode new
endNode.name
//展开搜索的城市
String
//
searchModel.drivingSearch(city,
//步行路线
//
//公交路线
//
}
});
}
@Override protected
mMapManager.getLocationManager().requestLocationUpdates(locationListener);
myLocationOverlay.enableMyLocation();
myLocationOverlay.enableCompass(); //
mMapManager.start();
super .onResume();
}
@Override protected
mMapManager.getLocationManager().removeUpdates(locationListener);
myLocationOverlay.disableMyLocation(); //显示当前位置
myLocationOverlay.disableCompass(); //
mMapManager.stop();
super .onPause();
}
@Override protected
//
return
;
}
//
class
implements
@Override public
int
Log.d( "MyGeneralListener" , "onGetNetworkState +
Toast.makeText(NavigationDemoActivity. this , "您的网络出错啦!
,
Toast.LENGTH_LONG).show();
}
@Override public
int
Log.d( "MyGeneralListener" , "onGetPermissionState +
if
//
Toast.makeText(NavigationDemoActivity. this ,
"请在BMapApiDemoApp.java文件输入正确的授权Key!
,
Toast.LENGTH_LONG).show();
}
}
}
}
|
然后是布局文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<? xml
= "1.0"
= "utf-8" ?>
< LinearLayout
= "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical"
< LinearLayout 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:textSize = "18sp" android:text = "Destination:"
< EditText android:id = "@+id/et_destination" android:layout_width = "fill_parent" android:layout_height = "wrap_content"
</ LinearLayout >
< Button android:id = "@+id/btn_navi" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "Start />
< com.baidu.mapapi.MapView android:id = "@+id/bmapsView" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:clickable = "true"
</ LinearLayout >
|
AndroidMainifest.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<? xml
= "1.0"
= "utf-8" ?>
< manifest
= "http://schemas.android.com/apk/res/android" package = "com.ericssonlabs" android:versionCode = "1" android:versionName = "1.0"
< uses-sdk
= "8"
< uses-permission
= "android.permission.ACCESS_NETWORK_STATE" ></ uses-permission >
< uses-permission
= "android.permission.ACCESS_FINE_LOCATION" ></ uses-permission >
< uses-permission
= "android.permission.INTERNET" ></ uses-permission >
< uses-permission
= "android.permission.WRITE_EXTERNAL_STORAGE" ></ uses-permission >
< uses-permission
= "android.permission.ACCESS_WIFI_STATE" ></ uses-permission >
< uses-permission
= "android.permission.CHANGE_WIFI_STATE" ></ uses-permission >
< uses-permission
= "android.permission.READ_PHONE_STATE" ></ uses-permission >
< supports-screens
= "true" android:normalScreens = "true"
= "true" android:resizeable = "true"
= "true" />
< uses-sdk
= "3" ></ uses-sdk >
< application android:icon = "@drawable/ic_launcher" android:label = "@string/app_name"
< activity android:name = ".NavigationDemoActivity" android:label = "@string/app_name"
< intent-filter >
< action
= "android.intent.action.MAIN"
< category
= "android.intent.category.LAUNCHER"
</ intent-filter >
</ activity >
</ application >
</ manifest >
|