最近的项目涉及到百度地图的使用,项目组通知使用天地图替代百度地图,一个原因是天地图是国家测绘地理信息局建设的,企业可以使用其公众版本进行开发以提供相关的地图信息服务,较其他地图具有权威性,当然天地图提供的服务是否较其他地图更具有权威性和实时性,这个作为普通开发者是不能确定的,另一个原因是减少运用成本,我觉得是否真能达到这样的目标真不一定,毕竟商业地图输出能力还是较免费版本更强。还是先来开始天地图 Android SDK 的学习之路吧,先从一下几个方面来学习:

  1. 引入天地图 SDK
  2. 地图显示
  3. 我的位置
  4. 定位图标的修改
  5. 获取位置信息
  6. 显示效果

引入天地图 SDK

首先下载天地图地图 SDK,然后添加相应的 Jar 包和 so 文件到 libs 文件夹中,在 module 的 build.gradle 文件中指定 so 文件的目录为 libs 目录,具体如下:

sourceSets {main {//指定so文件的查找目录是libs目录jniLibs.srcDir 'libs'}
}

按照官网指定的权限配置,使用过程中发现少了权限,下面是完整权限列表,具体如下:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果项目 targetSdkVersion 是 23 以上记得动态申请相关危险权限,此时,天地图地图 SDK 就引入到项目中了。

地图显示

首先在布局中引入 MapView,布局代码如下:

<com.tianditu.android.maps.MapView
    android:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/>

此时,地图就可以正常显示了,不需要额外的配置,当然可以初始化地图相关的一些参数,常用配置如下:

private void initMapView() {//启用内置的缩放组件mapView.setBuiltInZoomControls(true);//得到MapView的控制权,可以用它控制和驱动平移和缩放mMapController = mapView.getController();//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)GeoPoint point = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//设置地图中心点mMapController.setCenter(point);//设置地图缩放级别mMapController.setZoom(12);
}

天地图 Android SDK 的引入及地图显示相对百度地图、高德地图还是比较方便的。

我的位置

开发中常常需要定位当前位置,并且要从之前的位置动画移动到当前位置,获取我的位置的关键类是 MyLocationOverlay ,通过该类可以轻松获取我的位置,由于该类是 Overlay 的子类,在启用我的位置后要将该类的实例添加到 MapView 中,我的位置才会正确显示,至于移动到当前位置使用到 MapController 这个类,从MapView 中获取到地图控制器就可以移动到我的位置了,代码参考如下:

//创建MyLocationOverlay
myLocationOverlay = new MyLocationOverlay(this, mapView);
//启用指南针位置更新
myLocationOverlay.enableCompass();
//启用我的位置
myLocationOverlay.enableMyLocation();
mapView.addOverlay(myLocationOverlay);
//获得当前位置
mPoint = myLocationOverlay.getMyLocation();
//动画移动到当前位置
mMapController.animateTo(mPoint);

我的位置定位成功,那么如何修改默认的定位图标呢,下面告诉你如何修改默认的定位图标。

定位图标修改

天地图默认定位图标是一个蓝色的小圆点图标,很多时候都会遇到修改定位图标以及误差半径的修改,后者主要会显示一个带阴影的圆圈,以此来表示当前定位的误差范围,关于定位主要涉及到的类是 MyLocationOverlay,这个类是一个位置覆盖类,主要负责绘制、获取我的位置以及指南针的显示等,那么如何修改这个默认的定位图标呢,下面是一点思路:

  1. 在项目路径中找到默认定位图标;
  2. 在关键类中找到设置该默认图标的位置;
  3. 继承关键类,重写相关代码,替换原有的定位图标为新的定位图标;
  4. 使用新的类替换 MyLocationOverlay 类。

这种修改方式基本适用于类似的修改默认图标的场景,关键一点是找到相关类及相关位置然后做一下替换工作就 OK 了,当然这里对应的就是继承 MyLocationOverlay,重写 drawMyLocation 方法,然后替换相应图标,关键代码如下:

@Override
protected void drawMyLocation(GL10 gl, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {//获得屏幕坐标Point point = new Point();mapView.getProjection().toPixels(myLocation,point);//默认精度float accuracy = getAccuracy();//指定精度float accuracy = 500;//获得实际误差距离float distance = mapView.getProjection().metersToEquatorPixels(accuracy);AndroidJni.OpenglFillRound(point.x, point.y, (int)distance, 0, 360, 137, 170, 213, 77);//创建DrawableUtilTextureDrawable drawable = new UtilTextureDrawable(mContext, R.drawable.ic_location, BOUND_TYPE_CENTER);drawable.DrawTexture(gl,point,0.0F);
}

此时,使用自定义的 MLocationOverlay 替换 MyLocationOverlay 启用我的位置,定位图标已经被更改了,这里默认定位图标修改的另一种思路是获取到当前位置后,使用 Marker 设置标注来实现自己定义的定位图标,实践发现是没有问题的,但是这样误差范围就不能够轻松实现了,综上,还是上一种思路比较好,一劳永逸的解决自定义图标的修改。

获取位置信息

这里获取具体的位置信息,需要设置逆地理编码回调结果的监听获取详细地址信息,设置坐标位置,开始搜索地址,先实现逆地理编码结果监听器,代码如下:

/*** 逆地理编码回调结果监听*/
class OnGeoResultListener implements TGeoDecode.OnGeoResultListener {@Overridepublic void onGeoDecodeResult(TGeoAddress tGeoAddress, int errorCode) {if (TErrorCode.OK == errorCode) {// 查询点相关信息String str = "最近的 poi 名称:" + tGeoAddress.getPoiName() + "\n";str += "查询点 Poi 点的方位:" + tGeoAddress.getPoiDirection() + "\n";str += "查询点 Poi 点的距离:" + tGeoAddress.getPoiDistance() + "\n";str += "查询点行政区名称:" + tGeoAddress.getCity() + "\n";str += "查询点地理描述全称:" + tGeoAddress.getFullName() + "\n";str += "查询点的地址:" + tGeoAddress.getAddress() + "\n";str += "查询点的方位:" + tGeoAddress.getAddrDirection() + "\n";str += "查询点的距离:" + tGeoAddress.getAddrDistance() + "\n";str += "查询点道路名称:" + tGeoAddress.getRoadName() + "\n";str += "查询点与最近道路的距离:" + tGeoAddress.getRoadDistance();tvAddress.setText(tGeoAddress.getFullName());System.out.println(str);} else {System.out.println("查询出错:" + errorCode);}}
}

然后,设置对逆地理编码结果的监听,代码参考如下:

//逆地理编码类,根据输入的点坐标,返回相应的地理信息
TGeoDecode tGeoDecode = new TGeoDecode(new OnGeoResultListener());
tGeoDecode.search(mPoint);

如果前面都没有问题,那么具体的位置信息肯定没有问题,只是没有提供获取当前城市名称的方法,getCity() 返回的是行政区名称而不是当前城市名称,这一定对于只想定位当前城市的需求就不友好了,关于天地图的初次接触就到此为止了。

显示效果

注意两次修改前和修改后的图标以及误差范围的显示,下面是显示效果,具体如下:

实际上地图的使用大同小异,通过以上内容基本需求已经能够完成,当然地图开发中还有一块内容是地图标注,这一步内容陆续推送出来,可以添加我的微信 jamanu 互相交流学习。

转载于:https://www.cnblogs.com/jzmanu/p/10284773.html

天地图之定位信息详解相关推荐

  1. 快速实现ML302 GPS+4G发送定位信息详解

    ML302 GPS定位并TCP发送定位信息 一.本例程实现功能 二. Core提供的TCP/UDP功能介绍 三.模块介绍 四.接线图 六.完整代码 七.LIB_Cat1TcpUdpConfig初始化函 ...

  2. 冶金工业室内定位方案详解

    冶金工业作为典型的重工业行业,冶金生产的多个环节都存在安全隐患,因此,"安全"是保障冶金企业稳定发展的重要前提.EHIGH恒高将UWB室内定位应用于冶金厂区建设中,可以有效健全其安 ...

  3. Flutter开发之iOS后台定位开发详解

    Flutter开发之iOS后台定位开发详解 需求目的 开发一个功能持续获取用户的位置发送给后端,PC端会根据后端传来的移动端发送的位置信息,来绘制使用者的运动轨迹. 实现需求 是否实现 后台定位 ✅ ...

  4. HTTP协议的头信息详解

    HTTP协议的头信息详解 http://blog.csdn.net/guoguo1980/archive/2008/07/14/2649658.aspx HTTP协议的头信息详解 HTTP(Hyper ...

  5. crashdumpandroid_Android 中Crash时如何获取异常信息详解及实例

    Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android ...

  6. linux l显示详细信息,fdisk -l显示信息详解

    fdisk -l显示信息详解 [root@www.linuxidc.com ~]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 hea ...

  7. Debian操作系统的源配置信息详解--Source.list配置文件详解

    转载来源:https://wiki.debian.org/SourcesList#Repository_URL Debian操作系统的源配置信息详解--Source.list配置文件详解 Debian ...

  8. linux输出文件没有找到,Linux环境下标准输入、输出、错误信息详解

    Linux环境下标准输入.输出.错误信息详解 下面我们介绍在Linux环境下标准输入.输出.错误设备.标准输入设备代号为0, 用来显示输入信息,标准输出设备代号为1,用来显示正常信息,标准错误设备代号 ...

  9. python定位相邻节点_Python selenium 父子、兄弟、相邻节点定位方式详解

    今天跟大家分享下selenium中根据父子.兄弟.相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点. ...

最新文章

  1. python断点续传下载_Python版本,图片,视频断点续传下载
  2. 关于VS AddIn的注册
  3. C#Socket开发TCP详解(二)
  4. 一加7pro运动计步功能_测血压、心率、血氧、运动计步,来电微信消息等提醒,多种模式可选,这款智能手环功能实在是太全了吧!...
  5. 这可能是由于 CredSSP 加密 Oracle 修正。
  6. mysql select查询语句_mysql的select查询语句
  7. NYOJ-摆方格(贪心)
  8. oracle配置ipv6_配置 IPv6 接口
  9. hg255d php,hg255d强刷华硕rt-n13u官方固件果断中继成功
  10. Vue实例对象中的属性与方法---kalrry
  11. 计算机笔记--【JVM】
  12. ips 代理模式_IPS的完整形式是什么?
  13. 全球顶尖互联网公司谷歌都在使用的Mono-Repo单体仓库
  14. 深度学习——AI领域会议列表(以备准备和更新论文存储使用)
  15. 学习笔记(18):第一章:推荐系统架构与机器学习基础理论-80/20原则与长尾效应
  16. 手机安装pem_手机安装Charles证书
  17. C语言课设销售管理系统设计
  18. 线性规划在MATLAB中的表示,Matlab在线性规划中的应用
  19. Ubuntu应用---官方完美安装typora (.md文件编辑器)
  20. 大数据开发薪资水平怎么样?

热门文章

  1. xUtils网络超时设置configCurrentHttpCacheExpiry和SoTimeout和connectionTimeout的区别
  2. Unable to execute dex: Multiple dex files define Lcom
  3. Widget(桌面插件)
  4. 数据库性能优化—数据库连接池
  5. 接口自动化测试系列(一):HTTP状态码
  6. Luogu3092 [USACO13NOV]没有找零No Change (状压DP)
  7. CentOS7.2安装Python3.6.3
  8. 排球积分程序(三)——模型类的设计
  9. Core Data 迁移
  10. PhpStorm 对 AngularJS 的支持