日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

天地图之定位信息详解

發(fā)布時(shí)間:2024/4/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 天地图之定位信息详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近的項(xiàng)目涉及到百度地圖的使用,項(xiàng)目組通知使用天地圖替代百度地圖,一個(gè)原因是天地圖是國(guó)家測(cè)繪地理信息局建設(shè)的,企業(yè)可以使用其公眾版本進(jìn)行開發(fā)以提供相關(guān)的地圖信息服務(wù),較其他地圖具有權(quán)威性,當(dāng)然天地圖提供的服務(wù)是否較其他地圖更具有權(quán)威性和實(shí)時(shí)性,這個(gè)作為普通開發(fā)者是不能確定的,另一個(gè)原因是減少運(yùn)用成本,我覺得是否真能達(dá)到這樣的目標(biāo)真不一定,畢竟商業(yè)地圖輸出能力還是較免費(fèi)版本更強(qiáng)。還是先來(lái)開始天地圖 Android SDK 的學(xué)習(xí)之路吧,先從一下幾個(gè)方面來(lái)學(xué)習(xí):

  • 引入天地圖 SDK
  • 地圖顯示
  • 我的位置
  • 定位圖標(biāo)的修改
  • 獲取位置信息
  • 顯示效果
  • 引入天地圖 SDK

    首先下載天地圖地圖 SDK,然后添加相應(yīng)的 Jar 包和 so 文件到 libs 文件夾中,在 module 的 build.gradle 文件中指定 so 文件的目錄為 libs 目錄,具體如下:

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

    按照官網(wǎng)指定的權(quán)限配置,使用過(guò)程中發(fā)現(xiàn)少了權(quán)限,下面是完整權(quán)限列表,具體如下:

    <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" />

    如果項(xiàng)目 targetSdkVersion 是 23 以上記得動(dòng)態(tài)申請(qǐng)相關(guān)危險(xiǎn)權(quán)限,此時(shí),天地圖地圖 SDK 就引入到項(xiàng)目中了。

    地圖顯示

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

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

    此時(shí),地圖就可以正常顯示了,不需要額外的配置,當(dāng)然可以初始化地圖相關(guān)的一些參數(shù),常用配置如下:

    private void initMapView() {//啟用內(nèi)置的縮放組件mapView.setBuiltInZoomControls(true);//得到MapView的控制權(quán),可以用它控制和驅(qū)動(dòng)平移和縮放mMapController = mapView.getController();//用給定的經(jīng)緯度構(gòu)造一個(gè)GeoPoint,單位是微度 (度 * 1E6)GeoPoint point = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//設(shè)置地圖中心點(diǎn)mMapController.setCenter(point);//設(shè)置地圖縮放級(jí)別mMapController.setZoom(12); }

    天地圖 Android SDK 的引入及地圖顯示相對(duì)百度地圖、高德地圖還是比較方便的。

    我的位置

    開發(fā)中常常需要定位當(dāng)前位置,并且要從之前的位置動(dòng)畫移動(dòng)到當(dāng)前位置,獲取我的位置的關(guān)鍵類是 MyLocationOverlay ,通過(guò)該類可以輕松獲取我的位置,由于該類是 Overlay 的子類,在啟用我的位置后要將該類的實(shí)例添加到 MapView 中,我的位置才會(huì)正確顯示,至于移動(dòng)到當(dāng)前位置使用到 MapController 這個(gè)類,從MapView 中獲取到地圖控制器就可以移動(dòng)到我的位置了,代碼參考如下:

    //創(chuàng)建MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mapView); //啟用指南針位置更新 myLocationOverlay.enableCompass(); //啟用我的位置 myLocationOverlay.enableMyLocation(); mapView.addOverlay(myLocationOverlay); //獲得當(dāng)前位置 mPoint = myLocationOverlay.getMyLocation(); //動(dòng)畫移動(dòng)到當(dāng)前位置 mMapController.animateTo(mPoint);

    我的位置定位成功,那么如何修改默認(rèn)的定位圖標(biāo)呢,下面告訴你如何修改默認(rèn)的定位圖標(biāo)。

    定位圖標(biāo)修改

    天地圖默認(rèn)定位圖標(biāo)是一個(gè)藍(lán)色的小圓點(diǎn)圖標(biāo),很多時(shí)候都會(huì)遇到修改定位圖標(biāo)以及誤差半徑的修改,后者主要會(huì)顯示一個(gè)帶陰影的圓圈,以此來(lái)表示當(dāng)前定位的誤差范圍,關(guān)于定位主要涉及到的類是 MyLocationOverlay,這個(gè)類是一個(gè)位置覆蓋類,主要負(fù)責(zé)繪制、獲取我的位置以及指南針的顯示等,那么如何修改這個(gè)默認(rèn)的定位圖標(biāo)呢,下面是一點(diǎn)思路:

  • 在項(xiàng)目路徑中找到默認(rèn)定位圖標(biāo);
  • 在關(guān)鍵類中找到設(shè)置該默認(rèn)圖標(biāo)的位置;
  • 繼承關(guān)鍵類,重寫相關(guān)代碼,替換原有的定位圖標(biāo)為新的定位圖標(biāo);
  • 使用新的類替換 MyLocationOverlay 類。
  • 這種修改方式基本適用于類似的修改默認(rèn)圖標(biāo)的場(chǎng)景,關(guān)鍵一點(diǎn)是找到相關(guān)類及相關(guān)位置然后做一下替換工作就 OK 了,當(dāng)然這里對(duì)應(yīng)的就是繼承 MyLocationOverlay,重寫 drawMyLocation 方法,然后替換相應(yīng)圖標(biāo),關(guān)鍵代碼如下:

    @Override protected void drawMyLocation(GL10 gl, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {//獲得屏幕坐標(biāo)Point point = new Point();mapView.getProjection().toPixels(myLocation,point);//默認(rèn)精度float accuracy = getAccuracy();//指定精度float accuracy = 500;//獲得實(shí)際誤差距離float distance = mapView.getProjection().metersToEquatorPixels(accuracy);AndroidJni.OpenglFillRound(point.x, point.y, (int)distance, 0, 360, 137, 170, 213, 77);//創(chuàng)建DrawableUtilTextureDrawable drawable = new UtilTextureDrawable(mContext, R.drawable.ic_location, BOUND_TYPE_CENTER);drawable.DrawTexture(gl,point,0.0F); }

    此時(shí),使用自定義的 MLocationOverlay 替換 MyLocationOverlay 啟用我的位置,定位圖標(biāo)已經(jīng)被更改了,這里默認(rèn)定位圖標(biāo)修改的另一種思路是獲取到當(dāng)前位置后,使用 Marker 設(shè)置標(biāo)注來(lái)實(shí)現(xiàn)自己定義的定位圖標(biāo),實(shí)踐發(fā)現(xiàn)是沒有問(wèn)題的,但是這樣誤差范圍就不能夠輕松實(shí)現(xiàn)了,綜上,還是上一種思路比較好,一勞永逸的解決自定義圖標(biāo)的修改。

    獲取位置信息

    這里獲取具體的位置信息,需要設(shè)置逆地理編碼回調(diào)結(jié)果的監(jiān)聽獲取詳細(xì)地址信息,設(shè)置坐標(biāo)位置,開始搜索地址,先實(shí)現(xiàn)逆地理編碼結(jié)果監(jiān)聽器,代碼如下:

    /*** 逆地理編碼回調(diào)結(jié)果監(jiān)聽*/ class OnGeoResultListener implements TGeoDecode.OnGeoResultListener {@Overridepublic void onGeoDecodeResult(TGeoAddress tGeoAddress, int errorCode) {if (TErrorCode.OK == errorCode) {// 查詢點(diǎn)相關(guān)信息String str = "最近的 poi 名稱:" + tGeoAddress.getPoiName() + "\n";str += "查詢點(diǎn) Poi 點(diǎn)的方位:" + tGeoAddress.getPoiDirection() + "\n";str += "查詢點(diǎn) Poi 點(diǎn)的距離:" + tGeoAddress.getPoiDistance() + "\n";str += "查詢點(diǎn)行政區(qū)名稱:" + tGeoAddress.getCity() + "\n";str += "查詢點(diǎn)地理描述全稱:" + tGeoAddress.getFullName() + "\n";str += "查詢點(diǎn)的地址:" + tGeoAddress.getAddress() + "\n";str += "查詢點(diǎn)的方位:" + tGeoAddress.getAddrDirection() + "\n";str += "查詢點(diǎn)的距離:" + tGeoAddress.getAddrDistance() + "\n";str += "查詢點(diǎn)道路名稱:" + tGeoAddress.getRoadName() + "\n";str += "查詢點(diǎn)與最近道路的距離:" + tGeoAddress.getRoadDistance();tvAddress.setText(tGeoAddress.getFullName());System.out.println(str);} else {System.out.println("查詢出錯(cuò):" + errorCode);}} }

    然后,設(shè)置對(duì)逆地理編碼結(jié)果的監(jiān)聽,代碼參考如下:

    //逆地理編碼類,根據(jù)輸入的點(diǎn)坐標(biāo),返回相應(yīng)的地理信息 TGeoDecode tGeoDecode = new TGeoDecode(new OnGeoResultListener()); tGeoDecode.search(mPoint);

    如果前面都沒有問(wèn)題,那么具體的位置信息肯定沒有問(wèn)題,只是沒有提供獲取當(dāng)前城市名稱的方法,getCity() 返回的是行政區(qū)名稱而不是當(dāng)前城市名稱,這一定對(duì)于只想定位當(dāng)前城市的需求就不友好了,關(guān)于天地圖的初次接觸就到此為止了。

    顯示效果

    注意兩次修改前和修改后的圖標(biāo)以及誤差范圍的顯示,下面是顯示效果,具體如下:

    實(shí)際上地圖的使用大同小異,通過(guò)以上內(nèi)容基本需求已經(jīng)能夠完成,當(dāng)然地圖開發(fā)中還有一塊內(nèi)容是地圖標(biāo)注,這一步內(nèi)容陸續(xù)推送出來(lái),可以添加我的微信 jamanu 互相交流學(xué)習(xí)。

    轉(zhuǎn)載于:https://www.cnblogs.com/jzmanu/p/10284773.html

    總結(jié)

    以上是生活随笔為你收集整理的天地图之定位信息详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。