天地图之定位信息详解

最近的项目涉及到百度地图的使用,项目组通知使用天地图替代百度地图,一个原因是天地图是国家测绘地理信息局建设的,企业可以使用其公众版本进行开发以提供相关的地图信息服务,较其他地图具有权威性,当然天地图提供的服务是否较其他地图更具有权威性和实时性,这个作为普通开发者是不能确定的,另一个原因是减少运用成本,我觉得是否真能达到这样的目标真不一定,毕竟商业地图输出能力还是较免费版本更强。还是先来开始天地图 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);
    //创建Drawable
    UtilTextureDrawable 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 {

    @Override
    public 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() 返回的是行政区名称而不是当前城市名称,这一定对于只想定位当前城市的需求就不友好了,关于天地图的初次接触就到此为止了。

显示效果

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

MapWorld1.gif

实际上地图的使用大同小异,通过以上内容基本需求已经能够完成,当然地图开发中还有一块内容是地图标注,这一步内容陆续推送出来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容