开发百度地图之实现

在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。

新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView 。设计代码如下:

Xml代码 [url=]

[/url]

1.<?xml version="1.0" encoding="utf-8"?>
2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:layout_width="fill_parent"
4. android:layout_height="fill_parent"
5. android:orientation="vertical" >
6. <FrameLayout
7. android:id="@+id/map_layout"
8. android:layout_width="fill_parent"
9. android:layout_height="fill_parent"
10. android:orientation="vertical" >
11. <!-- 百度MapView控件 -->
12. <com.baidu.mapapi.MapView
13. android:id="@+id/map_view"
14. android:layout_width="fill_parent"
15. android:layout_height="fill_parent"
16. android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw"
17. android:clickable="true"
18. android:enabled="true" />
19. <LinearLayout
20. android:layout_width="wrap_content"
21. android:layout_height="wrap_content"
22. android:layout_gravity="center"
23. android:orientation="vertical"
24. android:paddingBottom="105dip" >
25. <!-- 地址信息显示TextView -->
26. <TextView
27. android:id="@+id/map_bubbleText"
28. android:layout_width="wrap_content"
29. android:layout_height="wrap_content"
30. android:background="@drawable/location_tips"
31. android:gravity="left|center"
32. android:maxEms="12"
33. android:paddingLeft="12dip"
34. android:paddingRight="10dip"
35. android:text="@string/load_tips"
36. android:textColor="#cfcfcf"
37. android:textSize="14sp" />
38. </LinearLayout>
39. <LinearLayout
40. android:layout_width="wrap_content"
41. android:layout_height="wrap_content"
42. android:layout_gravity="center"
43. android:orientation="vertical" >
44. <!-- 位置指标显示ImageView -->
45. <ImageView
46. android:id="@+id/point_image"
47. android:layout_width="wrap_content"
48. android:layout_height="wrap_content"
49. android:layout_gravity="center"
50. android:layout_marginBottom="30dip"
51. android:src="@drawable/point_start" />
52. </LinearLayout>
53. </FrameLayout>
54.</LinearLayout>

三:创建覆盖整个地图捕捉触控事件的MyMapOverlay继承Overlay

Java代码 [url=]

[/url]

1.import android.view.MotionEvent;
2.import com.baidu.mapapi.GeoPoint;
3.import com.baidu.mapapi.MapView;
4.import com.baidu.mapapi.Overlay;
5.//覆盖整个地图捕捉触控事件的OverLay
6.public abstract class MyMapOverlay extends Overlay{
7.private int point_X;
8.private int point_Y;
9.private GeoPoint newPoint;
10.public MyMapOverlay(int x,int y){
11.point_X = x;
12.point_Y = y;
13.}
14.boolean flagMove=false;
15.//这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标
16. @Override
17. public boolean onTouchEvent(MotionEvent event, MapView mapView) {
18. System.out.println("X->"+event.getX()+":"+point_X);
19. System.out.println("Y->"+event.getY()+":"+point_Y);
20. if(event.getAction() == MotionEvent.ACTION_DOWN){
21. changePoint(newPoint,1);
22. }else if(event.getAction() == MotionEvent.ACTION_UP){
23. newPoint = mapView.getProjection().fromPixels(point_X,point_Y);
24. changePoint(newPoint,2);
25. }
26. return false;
27. }
28.
29. public abstract void changePoint(GeoPoint newPoint,int type);
30.}

四:LocationActivity类继承百度库的MapActivity以及实现LocationListener接口,代码如下:
package com.location.activity;Java代码 [url=]

[/url]

1.import java.io.IOException;
2.import java.util.List;
3.import java.util.Locale;
4.
5.import android.content.Intent;
6.import android.location.Address;
7.import android.location.Geocoder;
8.import android.location.Location;
9.import android.os.Bundle;
10.import android.os.Handler;
11.import android.os.Message;
12.import android.view.View;
13.import android.view.Window;
14.import android.widget.TextView;
15.
16.import com.android.map.MyMapOverlay;
17.import com.baidu.mapapi.BMapManager;
18.import com.baidu.mapapi.GeoPoint;
19.import com.baidu.mapapi.LocationListener;
20.import com.baidu.mapapi.MKAddrInfo;
21.import com.baidu.mapapi.MKBusLineResult;
22.import com.baidu.mapapi.MKDrivingRouteResult;
23.import com.baidu.mapapi.MKLocationManager;
24.import com.baidu.mapapi.MKPoiResult;
25.import com.baidu.mapapi.MKSearch;
26.import com.baidu.mapapi.MKSearchListener;
27.import com.baidu.mapapi.MKSuggestionResult;
28.import com.baidu.mapapi.MKTransitRouteResult;
29.import com.baidu.mapapi.MKWalkingRouteResult;
30.import com.baidu.mapapi.MapActivity;
31.import com.baidu.mapapi.MapController;
32.import com.baidu.mapapi.MapView;
33.import com.baidu.mapapi.Overlay;
34.
35.public class LocationActivity extends MapActivity implements LocationListener {
36.
37. private MapView mapView;
38. private MapController mMapCtrl;
39. private List<Overlay> mapOverlays;
40. public GeoPoint locPoint;
41. private MyMapOverlay mOverlay;
42. private TextView desText;
43. private String lost_tips;
44. private int point_X;
45. private int point_Y;
46.
47. public final int MSG_VIEW_LONGPRESS = 10001;
48. public final int MSG_VIEW_ADDRESSNAME = 10002;
49. public final int MSG_GONE_ADDRESSNAME = 10003;
50. private Intent mIntent;
51. private int mLatitude;
52. private int mLongitude;
53. private String name;
54. private BMapManager mapManager;
55. private MKLocationManager mLocationManager = null;
56. private boolean isLoadAdrr = true;
57. private MKSearch mMKSearch;
58.
59. @Override
60. public void onCreate(Bundle savedInstanceState) {
61. super.onCreate(savedInstanceState);
62. requestWindowFeature(Window.FEATURE_NO_TITLE);
63. setContentView(R.layout.main);
64. initMap();
65. mIntent = getIntent();
66. mLatitude = mIntent.getIntExtra("latitude", 0);
67. mLongitude = mIntent.getIntExtra("longitude", 0);
68. name = mIntent.getStringExtra("name");
69. mapView = (MapView) findViewById(R.id.map_view);
70. desText = (TextView) this.findViewById(R.id.map_bubbleText);
71. lost_tips = getResources().getString(R.string.load_tips);
72. if (mLatitude != 0 && mLongitude != 0) {
73. locPoint = new GeoPoint((int) (mLatitude * 1E6),
74. (int) (mLongitude * 1E6));
75. desText.setText(name);
76. }
77. mapView.setBuiltInZoomControls(true);
78. mapView.setClickable(true);
79. mMapCtrl = mapView.getController();
80. point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;
81. point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;
82. mOverlay = new MyMapOverlay(point_X, point_Y) {
83. @Override
84. public void changePoint(GeoPoint newPoint, int type) {
85. if (type == 1) {
86. mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);
87. } else {
88. locPoint = newPoint;
89. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
90. }
91.
92. }
93. };
94. mapOverlays = mapView.getOverlays();
95. if (mapOverlays.size() > 0) {
96. mapOverlays.clear();
97. }
98. mapOverlays.add(mOverlay);
99. mMapCtrl.setZoom(20);
100.
101. }
102.
103. private void initMap() {
104.
105. // 初始化MapActivity
106. mapManager = new BMapManager(getApplication());
107. // init方法的第一个参数需填入申请的API Key
108. mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null);
109. super.initMapActivity(mapManager);
110. // 实例化搜索地址类
111. mMKSearch = new MKSearch();
112. // 初始化搜索地址实例
113. mMKSearch.init(mapManager, new MySearchListener());
114. mLocationManager = mapManager.getLocationManager();
115. // 注册位置更新事件
116. mLocationManager.requestLocationUpdates(this);
117. // 使用GPS定位
118. mLocationManager
119. .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);
120. }
121.
122. @Override
123. protected void onResume() {
124. if (mapManager != null) {
125. mapManager.start();
126. }
127. super.onResume();
128.
129. }
130.
131. @Override
132. protected void onPause() {
133. isLoadAdrr = false;
134. if (mapManager != null) {
135. mapManager.stop();
136. }
137. super.onPause();
138. }
139.
140. @Override
141. protected boolean isRouteDisplayed() {
142. // TODO Auto-generated method stub
143. return false;
144. }
145.
146.
147. /**
148. * 通过经纬度获取地址
149. *
150. * @param point
151. * @return
152. */
153. private String getLocationAddress(GeoPoint point) {
154. String add = "";
155. Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
156. try {
157. List<Address> addresses = geoCoder.getFromLocation(
158. point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,
159. 1);
160. Address address = addresses.get(0);
161. int maxLine = address.getMaxAddressLineIndex();
162. if (maxLine >= 2) {
163. add = address.getAddressLine(1) + address.getAddressLine(2);
164. } else {
165. add = address.getAddressLine(1);
166. }
167. } catch (IOException e) {
168. add = "";
169. e.printStackTrace();
170. }
171. return add;
172. }
173.
174.
175. private Handler mHandler = new Handler() {
176. @Override
177. public void handleMessage(Message msg) {
178. switch (msg.what) {
179. case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息
180. {
181. if (null == locPoint)
182. return;
183. mMKSearch.reverseGeocode(locPoint);
184. desText.setVisibility(View.VISIBLE);
185. desText.setText(lost_tips);
186. mMapCtrl.animateTo(locPoint);
187. mapView.invalidate();
188. }
189. break;
190. case MSG_VIEW_ADDRESSNAME:
191. desText.setText((String) msg.obj);
192. desText.setVisibility(View.VISIBLE);
193. break;
194. case MSG_GONE_ADDRESSNAME:
195. desText.setVisibility(View.GONE);
196. break;
197. }
198. }
199. };
200.
201. // 关闭程序也关闭定位
202. @Override
203. protected void onDestroy() {
204. if (mapManager != null) {
205. mapManager.destroy();
206. mapManager = null;
207. }
208. super.onDestroy();
209. }
210.
211. /**
212. * 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置
213. */
214. @Override
215. protected boolean isLocationDisplayed() {
216. return false;
217. }
218.
219. /**
220. * 当位置发生变化时触发此方法
221. *
222. * @param location
223. * 当前位置
224. */
225. public void onLocationChanged(Location location) {
226. if (location != null) {
227. locPoint = new GeoPoint((int) (location.getLatitude()* 1E6),
228. (int) (location.getLongitude()* 1E6));
229. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
230. }
231. }
232.
233. /**
234. * 内部类实现MKSearchListener接口,用于实现异步搜索服务
235. *
236. * @author liufeng
237. */
238. public class MySearchListener implements MKSearchListener {
239. /**
240. * 根据经纬度搜索地址信息结果
241. *
242. * @param result
243. * 搜索结果
244. * @param iError
245. * 错误号(0表示正确返回)
246. */
247. public void onGetAddrResult(MKAddrInfo result, int iError) {
248. if (result == null) {
249. return;
250. }
251. Message msg = new Message();
252. msg.what = MSG_VIEW_ADDRESSNAME;
253. msg.obj = result.strAddr;
254. mHandler.sendMessage(msg);
255.
256. }
257.
258. /**
259. * 驾车路线搜索结果
260. *
261. * @param result
262. * 搜索结果
263. * @param iError
264. * 错误号(0表示正确返回)
265. */
266. public void onGetDrivingRouteResult(MKDrivingRouteResult result,
267. int iError) {
268. }
269.
270. /**
271. * POI搜索结果(范围检索、城市POI检索、周边检索)
272. *
273. * @param result
274. * 搜索结果
275. * @param type
276. * 返回结果类型(11,12,21:poi列表 7:城市列表)
277. * @param iError
278. * 错误号(0表示正确返回)
279. */
280. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
281. }
282.
283. /**
284. * 公交换乘路线搜索结果
285. *
286. * @param result
287. * 搜索结果
288. * @param iError
289. * 错误号(0表示正确返回)
290. */
291. public void onGetTransitRouteResult(MKTransitRouteResult result,
292. int iError) {
293. }
294.
295. /**
296. * 步行路线搜索结果
297. *
298. * @param result
299. * 搜索结果
300. * @param iError
301. * 错误号(0表示正确返回)
302. */
303. public void onGetWalkingRouteResult(MKWalkingRouteResult result,
304. int iError) {
305. }
306.
307. public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
308. // TODO Auto-generated method stub
309.
310. }
311.
312. public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
313. // TODO Auto-generated method stub
314.
315. }
316. }
317.
318.}

五:在AndroidManifest.xml住添加相关的访问权限

<!-- 访问网络的权限 -->
Xml代码 [url=]

[/url]

1. <uses-permission android:name="android.permission.INTERNET" />
2. <!-- 访问精确位置的权限 -->
3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
4. <!-- 访问网络状态的权限 -->
5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
6. <!-- 访问WIFI网络状态的权限 -->
7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
8. <!-- 改变WIFI网络状态的权限 -->
9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
10. <!-- 读写存储卡的权限 -->
11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
12. <!-- 读取电话状态的权限 -->
13.<uses-permission android:name="android.permission.READ_PHONE_STATE" />

时间: 2024-11-08 20:17:20

开发百度地图之实现的相关文章

iOS开发百度地图常见问题及解决办法

1.64bit模拟器不能正常工作 解决:请将Xcode5 的 Project -> Edit Active Target -> Build Settings -> Linking -> Other Linker Flags 中的"-ObjC"修改为"-all_load" 2.程序死在 _mapView = [[BMKMapView alloc] init]; 解决:很可能是由于没有在appDelegate里面初始化_mapManager 3.

iOS开发 - 百度地图后台持续定位

之前有做一个定位的项目,类似嘀嘀打车那样. 需要后台持续定位. 这里选择了百度地图,不过在后台持续定位方面, 之前只是简单的设置如下: 不过经测试发现, 这样设置完,在后台运行大概30分钟,又会被crash掉. 重新打开应用则自动恢复定位. 当然,这不是我们想要的效果,所以折腾了下,实现了后台持续定位. 总的来说,就是利用进入后台后我们可操控的10分钟,来完成一些事情. 为达到持续定位,每10分钟.自动重新开启定位.这样就解决问题了. 具体如下: AppDelegate.h @property

(收藏)微信公众平台开发 百度地图导航

一.获取目的地坐标 打开百度地图API 鼠标点击拾取坐标网页,http://developer.baidu.com/map/jsdemo/demo/a6_3.htm,通过先缩小再放大,定位到拾取坐标的建筑物. 以深圳市飞亚达科技大厦为例,定位如下: 鼠标点击大厦名称,获得坐标: 113.962182, 22.544976 这分别表示经度和纬度. 二.百度地图公交.驾车.步行导航 导航接口为 http://api.map.baidu.com/direction //PC&Webapp服务地址 参数

android开发 百度地图 定位小圆点不在当前位置

注意经纬度要定义为全局变量,且此处不能直接使用location.getAttitude()和location.getLongitude 否则地图小圆点将显示在经纬度(0,0)位置.

android studio 开发百度地图 获取 sha1

cmd "E:\Java\jre7\bin\keytool.exe" -list -v -keystore "G:\Users\ylh\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android "E:\Java\jre7\bin\keytool.exe":jdk安装路径,自己找找 "G:\Users\ylh\.android\d

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

[android] 百度地图开发 (二).定位城市位置和城市POI搜索

一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么如何在百度地图上定位某一个位置呢?       通过类GeoPoint可以定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法可以获取Location对象,再定位经纬度设置其为地图中心即可显示当

[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

    最近做android百度地图,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--只显示网格而没有显示地图,网络连接和APIKey申请都是正确的,就是不知道为什么不能显示,网上也有很多人遇到这个问题,有的是SDK更新不兼容.而且网上很多百度地图都是使用V2.3.1版本,后来没有办法只有通过baidumapapi_v2_4_1.jar完成显示地图. 其中需要注意的是使用2.3.1时调用manager.init(

百度地图基础开发

因为项目的需要,最近接触了一下百度地图Android开发,遇到很多问题,相信很多博友也遇到到过这些问题,现在把我的实践经验给大家分享一下. 开发百度地图,第一步:你需要首先登录百度地图开放平台,注册一个开发者身份,通过这个身份你可以查看到百度最新的开发文档,为我们的开发提供便利.有了开发者身份后,你就可以开始为开发百度地图做准备了. 打开Android开发工具,新建一个开发项目.然后利用你在百度注册的开发者身份申请密钥,申请密钥的方法百度文档说的很清楚,给了两钟申请方法,建议使用后一种.有了密钥