怀着激动、兴奋的心情,在这个漫天柳絮的季节写下了这片博文,为什么呢,因为困扰我很久的一个技术性的问题得到了解决,发次博文,供大家参观、学习,同时,也以慰藉我长期困扰的心情,好了,废话不再,言归正传,看看这到底是个什么东西?

首先,简单地介绍一下功能:1、离线地图的加载;2、GPS的定位与显示。文字比较模糊,看看实际的效果图:

功能其实很简单,下面解释一下实现思路:

1、布局

  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.  
  6. <com.esri.android.map.MapView
  7. android:id="@+id/map"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent">
  10. </com.esri.android.map.MapView>
  11. <Button
  12. android:id="@+id/btnStartGps"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_alignParentLeft="true"
  16. android:layout_alignParentTop="true"
  17. android:layout_marginLeft="10dp"
  18. android:layout_marginTop="10dp"
  19. android:text="GPS定位" />
  20. </RelativeLayout>

布局很简单,一个mapView,用来显示地图;一个button,用来触发GPS开始定位。

2、配置文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.esri.arcgis.android.samples.localtiledlayer"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk android:minSdkVersion="10" />
  8.  
  9. <uses-feature
  10. android:glEsVersion="0x00020000"
  11. android:required="true" />
  12.  
  13. <uses-permission android:name="android.permission.INTERNET" />
  14. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  15. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  16.  
  17. <application
  18. android:icon="@drawable/icon"
  19. android:label="@string/app_name" >
  20. <activity
  21. android:name="com.esri.arcgis.android.samples.localtiledlayer.LocalTiledLayer"
  22. android:configChanges="orientation"
  23. android:label="@string/app_name" >
  24. <intent-filter>
  25. <action android:name="android.intent.action.MAIN" />
  26.  
  27. <category android:name="android.intent.category.LAUNCHER" />
  28. </intent-filter>
  29. </activity>
  30. <service
  31. android:name="com.baidu.location.f"
  32. android:enabled="true"
  33. android:process=":remote" >
  34. </service>
  35. </application>
  36. <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  37. <uses-permission android:name="android.permission.USE_CREDENTIALS" />
  38. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
  39. <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
  40.  
  41. <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  42. </permission>
  43.  
  44. <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
  45. </uses-permission>
  46. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
  47. </uses-permission>
  48. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
  49. </uses-permission>
  50. <uses-permission android:name="android.permission.INTERNET" >
  51. </uses-permission>
  52. <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
  53. </uses-permission>
  54. <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
  55. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
  56. </uses-permission>
  57. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  58. <uses-permission android:name="android.permission.WAKE_LOCK" >
  59. </uses-permission>
  60. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  61. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  62. <uses-permission android:name="android.permission.ACCESS_GPS" />
  63. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  64. <uses-permission android:name="android.permission.READ_CONTACTS" />
  65. <uses-permission android:name="android.permission.CALL_PHONE" />
  66. <uses-permission android:name="android.permission.READ_SMS" />
  67. <uses-permission android:name="android.permission.SEND_SMS" />
  68. <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
  69. <uses-permission android:name="android.permission.GET_TASKS" />
  70. <uses-permission android:name="android.permission.CAMERA" >
  71. </uses-permission>
  72. <uses-permission android:name="android.permission.RECORD_AUDIO" >
  73. </uses-permission>
  74. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
  75. </uses-permission>
  76. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  77. <uses-permission android:name="android.permission.BROADCAST_STICKY" />
  78. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  79. <!-- 来电消音 -->
  80. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
  81. </uses-permission>
  82. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  83. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  84.  
  85. <supports-screens
  86. android:anyDensity="true"
  87. android:largeScreens="true"
  88. android:normalScreens="false"
  89. android:resizeable="true"
  90. android:smallScreens="true" />
  91. </manifest>

具体啥意思,自己去看看相关的资料吧,我在此不多做解释。

3、activity实现

  1. package com.esri.arcgis.android.samples.localtiledlayer;
  2.  
  3. import android.app.Activity;
  4. import android.graphics.Color;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.Toast;
  11.  
  12. import com.baidu.location.BDLocation;
  13. import com.baidu.location.BDLocationListener;
  14. import com.baidu.location.LocationClient;
  15. import com.baidu.location.LocationClientOption;
  16. import com.baidu.mapapi.BMapManager;
  17. import com.baidu.mapapi.MKGeneralListener;
  18. import com.baidu.mapapi.map.MKEvent;
  19. import com.esri.android.map.GraphicsLayer;
  20. import com.esri.android.map.MapView;
  21. import com.esri.android.map.ags.ArcGISLocalTiledLayer;
  22. import com.esri.core.geometry.GeometryEngine;
  23. import com.esri.core.geometry.Point;
  24. import com.esri.core.geometry.SpatialReference;
  25. import com.esri.core.map.Graphic;
  26. import com.esri.core.symbol.SimpleMarkerSymbol;
  27. import com.esri.core.symbol.SimpleMarkerSymbol.STYLE;
  28.  
  29. public class LocalTiledLayer extends Activity {
  30. private MapView map = null;
  31. private ArcGISLocalTiledLayer local;
  32. //提示信息
  33. private Toast toast;
  34. /**
  35. * GPS定位
  36. */
  37. private GraphicsLayer gLayerGps;
  38. private Point wgspoint;
  39. private Point mapPoint;
  40. private Button btnGPS;
  41.  
  42. //定位SDK的核心类
  43. private LocationClient mLocClient;
  44. //是否手动触发请求定位
  45. private boolean isRequest = true;
  46. //是否首次定位
  47. private boolean isFirstLoc = true;
  48. //地图显示
  49. private BMapManager mBMapMan = null;
  50. private int requestTime=0;
  51.  
  52. /** Called when the activity is first created. */
  53. @Override
  54. public void onCreate(Bundle savedInstanceState) {
  55. super.onCreate(savedInstanceState);
  56. setContentView(R.layout.main);
  57. map = (MapView) findViewById(R.id.map);
  58.  
  59. mLocClient = new LocationClient(getApplicationContext());
  60. mLocClient.registerLocationListener(new BDLocationListenerImpl());//注册定位监听接口
  61.  
  62. /**
  63. * LocationClientOption 该类用来设置定位SDK的定位方式。
  64. */
  65. LocationClientOption option = new LocationClientOption();
  66. option.setOpenGps(true); //打开GPRS
  67. option.setAddrType("all");//返回的定位结果包含地址信息
  68. option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
  69. option.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
  70. option.setScanSpan(1000); //设置发起定位请求的间隔时间为1s
  71. option.disableCache(true);//启用缓存定位
  72. mLocClient.setLocOption(option); //设置定位参数
  73.  
  74. local = new ArcGISLocalTiledLayer("file:///storage/sdcard0/arcgis/base_map.tpk");
  75. map.addLayer(local);
  76.  
  77. gLayerGps = new GraphicsLayer();
  78. map.addLayer(gLayerGps);
  79.  
  80. //开始定位按钮
  81. btnGPS=(Button)findViewById(R.id.btnStartGps);
  82. btnGPS.setOnClickListener(new OnClickListener(){
  83. @Override
  84. public void onClick(View v) {
  85. mLocClient.start();//调用此方法开始定位
  86. requestLocation();
  87. }
  88. });
  89. }
  90.  
  91. public void requestLocation()
  92. {
  93. isRequest = true;
  94. if(mLocClient != null && mLocClient.isStarted())
  95. {
  96. showToast("GPS正在定位……");
  97. mLocClient.requestLocation();
  98. }
  99. else
  100. {
  101. Log.d("log", "locClient is null or not started");
  102. }
  103. }
  104.  
  105. public class MKGeneralListenerImpl implements MKGeneralListener
  106. {
  107. /**
  108. * 一些网络状态的错误处理回调函数
  109. */
  110. @Override
  111. public void onGetNetworkState(int iError)
  112. {
  113. if (iError == MKEvent.ERROR_NETWORK_CONNECT)
  114. {
  115. showToast("您的网络出错啦!");
  116. }
  117. }
  118.  
  119. /**
  120. * 授权错误的时候调用的回调函数
  121. */
  122. @Override
  123. public void onGetPermissionState(int iError)
  124. {
  125. if (iError == MKEvent.ERROR_PERMISSION_DENIED)
  126. {
  127. showToast("API KEY错误, 请检查!");
  128. }
  129. }
  130. }
  131.  
  132. private void showToast(String msg)
  133. {
  134. if(toast == null)
  135. {
  136. toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
  137. }
  138. else
  139. {
  140. toast.setText(msg);
  141. toast.setDuration(Toast.LENGTH_SHORT);
  142. }
  143. toast.show();
  144. }
  145. /**
  146. * 将GPS点标注在地图上
  147. * @param 纬度
  148. * @param 经度
  149. */
  150. public void ShowGpsOnMap(double lon,double lat){
  151. //清空定位图层
  152. gLayerGps.removeAll();
  153. //接收到的GPS的信号X(lat),Y(lon)
  154. double locx = lon;
  155. double locy = lat;
  156. wgspoint = new Point(locx, locy);
  157. mapPoint = (Point) GeometryEngine.project(wgspoint,SpatialReference.create(4326),map.getSpatialReference());
  158. //图层的创建
  159. Graphic graphic = new Graphic(mapPoint,new SimpleMarkerSymbol(Color.RED,18,STYLE.CIRCLE));
  160. gLayerGps.addGraphic(graphic);
  161. }
  162. public class BDLocationListenerImpl implements BDLocationListener
  163. {
  164. /**
  165. * 接收异步返回的定位结果,参数是BDLocation类型参数
  166. */
  167. @Override
  168. public void onReceiveLocation(BDLocation location)
  169. {
  170. if (location == null)
  171. {
  172. return;
  173. }
  174.  
  175. StringBuffer sb = new StringBuffer(256);
  176. sb.append("time : ");
  177. sb.append(location.getTime());
  178. sb.append("\nerror code : ");
  179. sb.append(location.getLocType());
  180. sb.append("\nlatitude : ");
  181. sb.append(location.getLatitude());
  182. sb.append("\nlontitude : ");
  183. sb.append(location.getLongitude());
  184. sb.append("\nradius : ");
  185. sb.append(location.getRadius());
  186. if (location.getLocType() == BDLocation.TypeGpsLocation)
  187. {
  188. sb.append("\nspeed : ");
  189. sb.append(location.getSpeed());
  190. sb.append("\nsatellite : ");
  191. sb.append(location.getSatelliteNumber());
  192.  
  193. }
  194. else if (location.getLocType() == BDLocation.TypeNetWorkLocation)
  195. {
  196. sb.append("\naddr : ");
  197. sb.append(location.getAddrStr());
  198.  
  199. }
  200.  
  201. Log.e("log", sb.toString());
  202.  
  203. if(isFirstLoc || isRequest)
  204. {
  205. isRequest = false;
  206. }
  207. isFirstLoc = false;
  208. double lat=location.getLatitude();
  209. double lon=location.getLongitude();
  210. ShowGpsOnMap(lon,lat);
  211. }
  212.  
  213. @Override
  214. public void onReceivePoi(BDLocation arg0) {
  215. // TODO Auto-generated method stub
  216.  
  217. }
  218. }
  219. }
  1.  

相对来说,注释也是很清楚地,就不做多解释,思路大概是:

显示地图——》接收位置信息,获取经纬度——》将经纬度转换为点在地图上标绘

源码下载



文章列表



欢迎关注lzugis,Arcgis for android QQ群:337469080

Arcgis andoid开发之应用百度地图接口实现精准定位与显示的更多相关文章

  1. 我的Android开发之路——百度地图开源工具获取定位信息

    定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...

  2. Arcgis for js加载百度地图

    看转:https://blog.csdn.net/qq_41046162/article/details/80248281 通过学习了一段时间的arcgis for js,让我来讲一下如何在arcgi ...

  3. Winform调用百度地图接口

    using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using ...

  4. js调用百度地图接口

    原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...

  5. Winform调用百度地图接口简单示例

    1.首先用一个html文件调用百度地图接口(主要注册一个序列号):   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  6. 如何利用【百度地图API】进行定位?非GPS定位

    原文:如何利用[百度地图API]进行定位?非GPS定位 如果你可以上网,如果你有火狐浏览器,那么恭喜你.你能很容易使用以下代码进行定位! ------------------------------- ...

  7. HTML5调用百度地图API进行地理定位实例

    自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...

  8. Android 开发之集成百度地图的定位与地图展示

    app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...

  9. iOS开发之引用百度地图SDK(一)-----------SDK开发指南

    (void)viewWillAppear:(BOOL)animated { [_mapView viewWillAppear]; _mapView.delegate = self; // 此处记得不用 ...

随机推荐

  1. web应用与web框架(Day65)

    Web应用 对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 import socket def handle_request(client): ...

  2. go——函数

    1.定义 函数是结构化编程的最小单元模式.它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护.函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果 ...

  3. PAT 天梯赛 L1-003. 个位数统计

    题目链接 https://www.patest.cn/contests/gplt/L1-003 题意 计算每个不同数字出现的次数 思路 可以用 MAP标记, 也可以直接用数字 存 AC代码 #incl ...

  4. 自动化测试管理平台ATMS(V1.0.1_7.29)下载

    自动化测试管理平台ATMS(V1.0.1_7.29)下载http://automationqa.com/forum.php?mod=viewthread&tid=2582&fromui ...

  5. python 课堂笔记-while

    #Author:zyl age_of_oldboy = 56 count = 0 while count < 3: guess_age = int(input("guess age:& ...

  6. 多种数据库之间 update的不同

    sql server update a set a.gqdltks=b.gqdltks,a.bztks=b.bztks from landleveldata a,gdqlpj b where a.GE ...

  7. 【Java Web】入门资源整理

    [网站] 1.Java Web Application Tutorial for Beginners - JournalDev Google top1 除Java Web还有很多其他教程 2.Intr ...

  8. java鲁棒性(健壮性)

    java能检测编译和运行时的错误 java自己操作内存减少了内存出错的可能 java实现了真数组,避免了覆盖数据的可能 Java不支持指针操作,大大减少了错误发生的可能性 ... 备注: Java能运 ...

  9. Madplay移植到mini2440开发板【转】

    本文转载自:https://blog.csdn.net/simanstar/article/details/24035379 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1 ...

  10. COS-4进程及进程管理

    操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...