这一篇文章主要解说的是百度地图的定位功能,然后还有MyLocationOverlay和PopupOverlay两个地图覆盖物的使用。Overlay是“图层”或“覆盖物”的意思,MyLocationOverlay从名字上面理解就是我的位置图层,他可以实如今地图上显示当前位置的图标以及指南针,MyLocationOverlay仅仅负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源。就可以创建MyLocationOverlay。PopupOverlay就是弹出窗体图层了,跟PopupWindow类似的东西,以下会介绍他们的用法

定位我们使用的是百度 Android 定位SDKv4.0。我们先了解下定位原理和定位精度

定位原理

使用百度Android定位SDK必须注冊GPS和网络使用权限。定位SDK採用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时。定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成对应定位根据进行定位。

用户能够设置满足自身需求的定位根据:

若用户设置GPS优先。则优先使用GPS进行定位,假设GPS定位未打开或者没有可用位置信息,且网络连接正常。定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。



定位精度

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhYW5taW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="400" height="240" alt="" style="border:none; max-width:100%">

了解了百度定位的原理和定位精度之后,接下来我们就来使用百度定位SDKv4.0吧

一 . 导入库文件

在使用百度定位SDKv4.0之前,我们要下载最新的库文件。下载地址:点击下载相关库文件。将liblocSDK4.so文件复制到libs/armeabi文件夹下。

将locSDK4.0.jar文件复制到project的libs文件夹下

二 . 布局文件。一个百度地图控件。加一个手动点击实现定位的button,放在一个相对布局里面,非常easy的布局

[html] view
plain
copy

  1. <?

    xml version="1.0" encoding="utf-8"?

    >

  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent" >
  5. <com.baidu.mapapi.map.MapView
  6. android:id="@+id/bmapView"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. android:clickable="true" />
  10. <Button
  11. android:id="@+id/request"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentRight="true"
  15. android:layout_alignParentTop="true"
  16. android:layout_marginRight="10dp"
  17. android:layout_marginTop="10dip"
  18. android:background="@drawable/custom_loc"  />
  19. </RelativeLayout>



三 . 界面MainActivity代码,先贴上,然后适当解说相关代码,我凝视也比較清楚

[java] view
plain
copy

  1. package com.example.baidumapdemo;
  2. import android.app.Activity;
  3. import android.graphics.Bitmap;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.MeasureSpec;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import com.baidu.location.BDLocation;
  14. import com.baidu.location.BDLocationListener;
  15. import com.baidu.location.LocationClient;
  16. import com.baidu.location.LocationClientOption;
  17. import com.baidu.mapapi.BMapManager;
  18. import com.baidu.mapapi.MKGeneralListener;
  19. import com.baidu.mapapi.map.LocationData;
  20. import com.baidu.mapapi.map.MKEvent;
  21. import com.baidu.mapapi.map.MapController;
  22. import com.baidu.mapapi.map.MapView;
  23. import com.baidu.mapapi.map.MyLocationOverlay;
  24. import com.baidu.mapapi.map.PopupClickListener;
  25. import com.baidu.mapapi.map.PopupOverlay;
  26. import com.baidu.platform.comapi.basestruct.GeoPoint;
  27. public class MainActivity extends Activity {
  28. private Toast mToast;
  29. private BMapManager mBMapManager;
  30. private MapView mMapView = null;
  31. private MapController mMapController = null;
  32. /**
  33. * 定位SDK的核心类
  34. */
  35. private LocationClient mLocClient;
  36. /**
  37. * 用户位置信息
  38. */
  39. private LocationData mLocData;
  40. /**
  41. * 我的位置图层
  42. */
  43. private LocationOverlay myLocationOverlay = null;
  44. /**
  45. * 弹出窗体图层
  46. */
  47. private PopupOverlay mPopupOverlay  = null;
  48. private boolean isRequest = false;//是否手动触发请求定位
  49. private boolean isFirstLoc = true;//是否首次定位
  50. /**
  51. * 弹出窗体图层的View
  52. */
  53. private View mPopupView;
  54. private BDLocation location;
  55. @Override
  56. protected void onCreate(Bundle savedInstanceState) {
  57. super.onCreate(savedInstanceState);
  58. //使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
  59. mBMapManager = new BMapManager(this);
  60. //第一个參数是API key,
  61. //第二个參数是经常使用事件监听,用来处理通常的网络错误。授权验证错误等。你也能够不加入这个回调接口
  62. mBMapManager.init("7ae13368159d6a513eaa7a17b9413b4b", new MKGeneralListenerImpl());
  63. setContentView(R.layout.activity_main);
  64. //点击button手动请求定位
  65. ((Button) findViewById(R.id.request)).setOnClickListener(new OnClickListener() {
  66. @Override
  67. public void onClick(View v) {
  68. requestLocation();
  69. }
  70. });
  71. mMapView = (MapView) findViewById(R.id.bmapView); //获取百度地图控件实例
  72. mMapController = mMapView.getController(); //获取地图控制器
  73. mMapController.enableClick(true);   //设置地图是否响应点击事件
  74. mMapController.setZoom(14);   //设置地图缩放级别
  75. mMapView.setBuiltInZoomControls(true);   //显示内置缩放控件
  76. mMapView.setTraffic(true);  //设置交通信息图
  77. //        mMapView.setSatellite(true);  //设置卫星图
  78. //        mMapController.setOverlooking(-45);  //设置地图鸟瞰角度 ,范围:0~ -45
  79. mPopupView = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
  80. //实例化弹出窗体图层
  81. mPopupOverlay = new PopupOverlay(mMapView ,new PopupClickListener() {
  82. /**
  83. * 点击弹出窗体图层回调的方法
  84. */
  85. @Override
  86. public void onClickedPopup(int arg0) {
  87. //隐藏弹出窗体图层
  88. mPopupOverlay.hidePop();
  89. }
  90. });
  91. //实例化定位服务。LocationClient类必须在主线程中声明
  92. mLocClient = new LocationClient(getApplicationContext());
  93. mLocClient.registerLocationListener(new BDLocationListenerImpl());//注冊定位监听接口
  94. /**
  95. * LocationClientOption 该类用来设置定位SDK的定位方式。
  96. */
  97. LocationClientOption option = new LocationClientOption();
  98. option.setOpenGps(true); //打开GPRS
  99. option.setAddrType("all");//返回的定位结果包括地址信息
  100. option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
  101. option.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
  102. option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms
  103. option.disableCache(false);//禁止启用缓存定位
  104. //      option.setPoiNumber(5);    //最多返回POI个数
  105. //      option.setPoiDistance(1000); //poi查询距离
  106. //      option.setPoiExtraInfo(true);  //是否须要POI的电话和地址等具体信息
  107. mLocClient.setLocOption(option);  //设置定位參数
  108. mLocClient.start();  // 调用此方法開始定位
  109. //定位图层初始化
  110. myLocationOverlay = new LocationOverlay(mMapView);
  111. //实例化定位数据。并设置在我的位置图层
  112. mLocData = new LocationData();
  113. myLocationOverlay.setData(mLocData);
  114. //加入定位图层
  115. mMapView.getOverlays().add(myLocationOverlay);
  116. //改动定位数据后刷新图层生效
  117. mMapView.refresh();
  118. }
  119. /**
  120. * 定位接口,须要实现两个方法
  121. * @author xiaanming
  122. *
  123. */
  124. public class BDLocationListenerImpl implements BDLocationListener {
  125. /**
  126. * 接收异步返回的定位结果,參数是BDLocation类型參数
  127. */
  128. @Override
  129. public void onReceiveLocation(BDLocation location) {
  130. if (location == null) {
  131. return;
  132. }
  133. StringBuffer sb = new StringBuffer(256);
  134. sb.append("time : ");
  135. sb.append(location.getTime());
  136. sb.append("\nerror code : ");
  137. sb.append(location.getLocType());
  138. sb.append("\nlatitude : ");
  139. sb.append(location.getLatitude());
  140. sb.append("\nlontitude : ");
  141. sb.append(location.getLongitude());
  142. sb.append("\nradius : ");
  143. sb.append(location.getRadius());
  144. if (location.getLocType() == BDLocation.TypeGpsLocation){
  145. sb.append("\nspeed : ");
  146. sb.append(location.getSpeed());
  147. sb.append("\nsatellite : ");
  148. sb.append(location.getSatelliteNumber());
  149. } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
  150. sb.append("\naddr : ");
  151. sb.append(location.getAddrStr());
  152. }
  153. Log.e("log", sb.toString());
  154. MainActivity.this.location = location;
  155. mLocData.latitude = location.getLatitude();
  156. mLocData.longitude = location.getLongitude();
  157. //假设不显示定位精度圈,将accuracy赋值为0就可以
  158. mLocData.accuracy = location.getRadius();
  159. mLocData.direction = location.getDerect();
  160. //将定位数据设置到定位图层里
  161. myLocationOverlay.setData(mLocData);
  162. //更新图层数据运行刷新后生效
  163. mMapView.refresh();
  164. if(isFirstLoc || isRequest){
  165. //将给定的位置点以动画形式移动至地图中心
  166. mMapController.animateTo(new GeoPoint(
  167. (int) (location.getLatitude() * 1e6), (int) (location
  168. .getLongitude() * 1e6)));
  169. showPopupOverlay(location);
  170. isRequest = false;
  171. }
  172. isFirstLoc = false;
  173. }
  174. /**
  175. * 接收异步返回的POI查询结果,參数是BDLocation类型參数
  176. */
  177. @Override
  178. public void onReceivePoi(BDLocation poiLocation) {
  179. }
  180. }
  181. //继承MyLocationOverlay重写dispatchTap方法
  182. private class LocationOverlay extends MyLocationOverlay{
  183. public LocationOverlay(MapView arg0) {
  184. super(arg0);
  185. }
  186. /**
  187. * 在“我的位置”坐标上处理点击事件。
  188. */
  189. @Override
  190. protected boolean dispatchTap() {
  191. //点击我的位置显示PopupOverlay
  192. showPopupOverlay(location);
  193. return super.dispatchTap();
  194. }
  195. }
  196. /**
  197. * 显示弹出窗体图层PopupOverlay
  198. * @param location
  199. */
  200. private void showPopupOverlay(BDLocation location){
  201. TextView popText = ((TextView)mPopupView.findViewById(R.id.location_tips));
  202. popText.setText("[我的位置]\n" + location.getAddrStr());
  203. mPopupOverlay.showPopup(getBitmapFromView(popText),
  204. new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)),
  205. 15);
  206. }
  207. /**
  208. * 手动请求定位的方法
  209. */
  210. public void requestLocation() {
  211. isRequest = true;
  212. if(mLocClient != null && mLocClient.isStarted()){
  213. showToast("正在定位......");
  214. mLocClient.requestLocation();
  215. }else{
  216. Log.d("log", "locClient is null or not started");
  217. }
  218. }
  219. /**
  220. * 显示Toast消息
  221. * @param msg
  222. */
  223. private void showToast(String msg){
  224. if(mToast == null){
  225. mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
  226. }else{
  227. mToast.setText(msg);
  228. mToast.setDuration(Toast.LENGTH_SHORT);
  229. }
  230. mToast.show();
  231. }
  232. /**
  233. * 将View转换成Bitmap的方法
  234. * @param view
  235. * @return
  236. */
  237. public static Bitmap getBitmapFromView(View view) {
  238. view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
  239. view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
  240. view.buildDrawingCache();
  241. Bitmap bitmap = view.getDrawingCache();
  242. return bitmap;
  243. }
  244. /**
  245. * 经常使用事件监听。用来处理通常的网络错误,授权验证错误等
  246. * @author xiaanming
  247. *
  248. */
  249. public class MKGeneralListenerImpl implements MKGeneralListener{
  250. /**
  251. * 一些网络状态的错误处理回调函数
  252. */
  253. @Override
  254. public void onGetNetworkState(int iError) {
  255. if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
  256. showToast("您的网络出错啦!

    ");

  257. }
  258. }
  259. /**
  260. * 授权错误的时候调用的回调函数
  261. */
  262. @Override
  263. public void onGetPermissionState(int iError) {
  264. if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
  265. showToast("API KEY错误, 请检查。");
  266. }
  267. }
  268. }
  269. @Override
  270. protected void onResume() {
  271. //MapView的生命周期与Activity同步。当activity挂起时需调用MapView.onPause()
  272. mMapView.onResume();
  273. super.onResume();
  274. }
  275. @Override
  276. protected void onPause() {
  277. //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
  278. mMapView.onPause();
  279. super.onPause();
  280. }
  281. @Override
  282. protected void onDestroy() {
  283. //MapView的生命周期与Activity同步。当activity销毁时需调用MapView.destroy()
  284. mMapView.destroy();
  285. //退出应用调用BMapManager的destroy()方法
  286. if(mBMapManager != null){
  287. mBMapManager.destroy();
  288. mBMapManager = null;
  289. }
  290. //退出时销毁定位
  291. if (mLocClient != null){
  292. mLocClient.stop();
  293. }
  294. super.onDestroy();
  295. }
  296. }

Android 百度地图开发(二)的更多相关文章

  1. Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

      标签: Android百度地图API Key  分类: Android 百度地图开发(2)    最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...

  2. Android百度地图(二)结合方向传感器我们自己定位哪里走

    Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步改动.有 ...

  3. C#的百度地图开发(二)转换JSON数据为相应的类

    原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON ...

  4. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  5. [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

    一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...

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

        近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...

  7. Android 百度地图开发之一(Hello BaiDu Map)

    之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...

  8. Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11380619 这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOv ...

  9. Android百度地图开发(二)地图覆盖物

    上一篇文章写道如何在一个mapview中简单的显示地图:本次学习一下如何在地图上添加一些覆盖物. 1.设置显示交通地图: // 显示交通地图 mapView.setTraffic(true); 2.设 ...

随机推荐

  1. 【转】Unity 游戏存档 PlayerPrefs类的用法

    http://www.cnblogs.com/qiaogaojian/p/5969855.html unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs.工作原理非常简单,以 ...

  2. 历史Linux镜像的问题修复方案

    历史Linux镜像创建的ECS云服务器,可能存在NTP没有配置,YUM没有配置,还可能存在最近暴漏较高的安全漏洞,请按照以下步骤进行修复,可以让您的云服务器更加安全,还可以使用阿里云提供的YUM服务进 ...

  3. Python脚本获取Linux系统信息

    # -*- coding:utf-8 -*- import os import subprocess import re import hashlib #对字典取子集 def sub_dict(for ...

  4. NOIP试题解析

    NOIP试题解析           by QTY_YTQ noip2010关押罪犯(并查集) 题意是有n个罪犯关在两个监狱中,其中有m对罪犯有仇恨关系,如果有仇恨的罪犯关在一起会产生一定影响力的事件 ...

  5. JS 处理json数据

    $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 JSON.parse(jsonstr); //可以将js ...

  6. 【Luogu】P2173网络(LCT)

    题目链接 这次坑我的是与或的结合顺序…… 开十个LCT记录一下即可.以上. #include<cstdio> #include<cstring> #include<cst ...

  7. ZOJ 3874 Permutation Graph ——分治 NTT

    发现每一块一定是按照一定的顺序的. 然后与标号无关,并且相同大小的对答案的影响相同. 然后列出递推式,上NTT+分治就可以了. 然后就可以与输入同阶处理答案了. #include <map> ...

  8. BZOJ3998 [TJOI2015]弦论 【后缀自动机】

    题目 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入格式 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...

  9. 集成 Union Pay - 银联支付--ios

    请看这个网址,谢谢谢 http://www.cnblogs.com/oc-bowen/p/6000389.html

  10. Window下安装使用RabbitMQ

    RabbitMQ官网 http://www.rabbitmq.com 下载地址 http://www.rabbitmq.com/download.html 一 Windows下安装RabbitMq 1 ...