主頁 > 移動端開發 > 【FAQ】關于華為地圖服務定位存在偏差的原因及解決辦法(二)——僅適用于Location 6.7.0.300及之后的版本

【FAQ】關于華為地圖服務定位存在偏差的原因及解決辦法(二)——僅適用于Location 6.7.0.300及之后的版本

2023-06-27 09:20:07 移動端開發

一、 問題描述:

華為地圖服務“我的位置”能力,在中國大陸地區,向用戶展示他們在地圖上的當前位置與用戶的實際位置存在較大的偏差,

具體差別可以查看下方的圖片:

image

二、 偏差較大的原因:

  1. 華為Map SDK在中國大陸使用的地理坐標系是GCJ02,

  2. 點擊“我的位置”控制元件,獲取的定位經緯度的地理坐標系是WGS-84,

  3. 因為以上兩個原因,即地圖View和“我的位置”定位源使用的地理坐標系不一致,所以才導致了“我的位置”定位不準確的問題,

三、 解決方案:

  1. 先使用華為Location SDK通過定位獲取用戶當前所在位置的經緯度資訊(GCJ02地理坐標系),

  2. 通過華為Map SDK提供的huaweiMap.setLocationSource(LocationSource locationSource)方法,設定“我的位置”圖層定位源,

四、 注意事項:

使用Location SDK直接獲取GCJ-02坐標系的經緯度僅適用于6.7.0.300及之后的SDK版本,因為Location SDK的6.7.0.300之前的版本暫不支持直接獲取GCJ-02坐標系的經緯度,

五、 具體的實作步驟:

  1. 創建已開啟“我的位置”功能的地圖實體

a. 在Activity的布局檔案中添加地圖控制元件且設定地圖屬性,

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_height="match_parent">
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mapfragment_mapfragmentdemo"
        
        android:layout_
        android:layout_height="match_parent"
        map:cameraTargetLat="48.893478"
        map:cameraTargetLng="2.334595"
        map:cameraZoom="16" />
</androidx.constraintlayout.widget.ConstraintLayout>

b. 在Activity中初始化SDK,并加載地圖,

public class HwMyLocationActivity extends AppCompatActivity implements OnMapReadyCallback {
    private HuaweiMap huaweiMap;
    private SupportMapFragment mSupportMapFragment;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化SDK
        MapsInitializer.initialize(this);
        setContentView(R.layout.activity_mylocation);
        mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_mapfragmentdemo);
        //加載地圖
        mSupportMapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(HuaweiMap huaweiMap) {
        //地圖資料加載完成,展示成功,
        this.huaweiMap = huaweiMap;
        huaweiMap.setMyLocationEnabled(true);
    }
}

c. 展示地圖并點擊我的位置UI控制元件,從三張截圖可以看出:“我的位置”與“用戶實際所在位置”存在較大偏差,

image
image
image

  1. 使用華為Location SDK獲取用戶當前所在位置

a. 宣告FusedLocationProviderClient物件,

// 宣告fusedLocationProviderClient物件

private FusedLocationProviderClient fusedLocationProviderClient;

b. 創建LocationCallback,用于位置更新的回呼,

/**
 * 定義位置更新回呼
 */
LocationCallback mLocationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        if (locationResult != null) {
            // TODO: 處理位置回呼結果
            Log.d("LOG_HwMyLocation", "Latitude" + locationResult.getLastHWLocation().getLatitude() +
                    " ; Longitude:" + locationResult.getLastHWLocation().getLongitude());
        }
    }
};

c. 初始化FusedLocationProviderClient物件,設定定位型別和GCJ02坐標型別并開啟定位,

private void initLocationClient() {
    // 實體化fusedLocationProviderClient物件
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    LocationRequest mLocationRequest = new LocationRequest();
    // 設定位置更新的間隔(單位:毫秒)
    mLocationRequest.setInterval(1000);
    // 設定定位型別
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    // 設定回呼次數為1
mLocationRequest.setNumUpdates(10);
//設定坐標型別,
//默認傳入COORDINATE_TYPE_WGS84回傳WGS84坐標位置,
//傳入COORDINATE_TYPE_GCJ02,回傳GCJ02坐標位置,
mLocationRequest.setCoordinateType(LocationRequest.COORDINATE_TYPE_GCJ02);
    //開啟定位
    fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    // TODO: 介面呼叫成功的處理
                    Log.d("LOG_HwMyLocation", "定位開啟成功");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {
                    // TODO: 介面呼叫失敗的處理
                    Log.d("LOG_HwMyLocation", "定位開啟失敗:"+e.getMessage());
                }
            });
}

d. 啟動定位獲得用戶當前所在位置(WGS-84坐標系),即可得到如下結果:

image

e. 創建Marker標記,標記Location的定位位置,可在LocationCallback回呼中呼叫此方法,

private Marker locationMarker;
//添加定位位置標記
public void addLocationMarker(double Latitude, double Longitude) {
    if (null != locationMarker) {
        locationMarker.remove();
    }
    MarkerOptions options = new MarkerOptions()
            .position(new LatLng(Latitude, Longitude))
            .title("定位位置")
            .snippet("定位所在位置");
    locationMarker = this.huaweiMap.addMarker(options);
}

f. 從下方2圖可以看出,Location SDK定位獲取的GCJ02坐標位置與用戶實際所在位置無偏差:

image
image

  1. 將Location SDK獲取的GCJ-02坐標系的經緯度通過huaweiMap.setLocationSource(LocationSouce locationSouce)方法設定為我的位置圖層的定位源,具體實作如下:

  2. 新建MyLocationSouce類,定義定位源,

private class MyLocationSouce implements LocationSource {
    private OnLocationChangedListener listener;

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        listener = onLocationChangedListener;
    }

    @Override
    public void deactivate() {

    }

    /**
     * 改變我的位置圖層的定位源
     * @param lat_gcj02 GCJ-02
     * @param log_gcj02 GCJ-02
     */
    public void changeMyLocationSouce(double lat_gcj02, double log_gcj02) {
        Location location = new Location("Provider");

        location.setLatitude(lat_gcj02);
        location.setLongitude(log_gcj02);
        //設定精度
        location.setAccuracy(200);
        //當獲取到新的用戶位置時,呼叫此方法,設定定位源
        listener.onLocationChanged(location);
    }
}
  1. 初始化MyLocationSouce類 并 將MyLocationSouce設定為我的位置圖層的定位源:
private MyLocationSouce myLocationSouce;
@Override
public void onMapReady(HuaweiMap huaweiMap) {
    this.huaweiMap = huaweiMap;
    huaweiMap.setMyLocationEnabled(true);
    //初始化LocationSouce并設定我的位置圖層的位置源
    if (null == myLocationSouce){
        myLocationSouce = new MyLocationSouce();
    }
    huaweiMap.setLocationSource(myLocationSouce);
}
  1. 在LocationCallback回呼方法中 將GCJ-02坐標系的經緯度 設定為定位源,
/**
     * 定義位置更新回呼
     */
    LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult != null) {
                // TODO: 處理位置回呼結果
                Log.d("LOG_HwMyLocation", "Latitude" + locationResult.getLastHWLocation().getLatitude() +
                        " ; Longitude:" + locationResult.getLastHWLocation().getLongitude());
                //將Location SDK獲取的GCJ02坐標系的經緯度 標記在地圖上
                addLocationMarker(locationResult.getLastHWLocation().getLatitude(), locationResult.getLastHWLocation().getLongitude());
                //設定定位源
                if (null != myLocationSouce) {
                    myLocationSouce.changeMyLocationSouce(locationResult.getLastHWLocation().getLatitude(), locationResult.getLastHWLocation().getLongitude());
                }
            }
        }
    };
  1. 效果展示:

通過下方兩圖可以看出,我的位置圖層與用戶實際所在位置一致,且無偏差,

image
image

六、 Map SDK和Location SDK所需的權限串列有:

  1. Map SDK需要添加的權限串列:
<!-- 您呼叫地圖服務能力,必須在“AndroidManifest”中為您的應用添加下列權限: -->
<!--允許程式訪問網路連接-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--允許程式獲取網路資訊狀態-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--自定義權限,允許程式讀取公共資料-->
<uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA"/>
<!--允許改變WLAN狀態的開關-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

<!-- 獲取設備當前位置需要在“AndroidManifest”中增加以下權限,且Android 6.0以后需動態申請: -->
<!--允許程式通過Wi-Fi或移動基站的方式獲取用戶粗略的經緯度資訊-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--允許程式通過GPS芯片接收衛星的定位資訊-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  1. Location SDK需要添加的權限串列(部分權限串列):
<!-- Android提供了兩種位置權限: ACCESS_COARSE_LOCATION(粗略的位置權限)和ACCESS_FINE_LOCATION(精確的位置權限),
需要在“AndroidManifest.xml”檔案中配置權限,且Android 6.0以后需動態申請: -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

七、 參考資料:

  1. 華為Map SDK接入指南:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-sdk-brief-introduction-0000001061991343?ha_source=hms1

  1. 創建地圖實體:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-sdk-map-instance-creation-0000001062881706?ha_source=hms1

  1. 開啟我的位置功能:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-sdk-my-location-0000001061775973?ha_source=hms1

  1. 創建并設定Marker標記:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-sdk-map-instance-creation-0000001062881706?ha_source=hms1

  1. 設定我的位置圖層的位置源:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/huaweimap-0000001050151757#section1664916820220?ha_source=hms1

  1. 華為Location SDK接入指南:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-introduction-0000001121930588?ha_source=hms1

  1. 融合定位開發,獲取用戶當前所在位置:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/location-develop-steps-0000001050746143?ha_source=hms1

  1. Location定位設定坐標型別

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/locationrequest-0000001050986189#section17806162191712?ha_source=hms1

了解更多詳情>>

訪問地圖服務聯盟官網

獲取地圖服務開發指導檔案

訪問HMS Core 聯盟官網

獲取HMS Core 開發指導檔案

關注我們,第一時間了解 HMS Core 最新技術資訊~

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/556084.html

標籤:Android

上一篇:iOS 微信、支付寶、銀聯支付組件的進一步設計

下一篇:返回列表

標籤雲
其他(161692) Python(38254) JavaScript(25515) Java(18265) C(15238) 區塊鏈(8273) C#(7972) AI(7469) 爪哇(7425) MySQL(7270) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4607) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1973) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 【FAQ】關于華為地圖服務定位存在偏差的原因及解決辦法(二)——僅

    ### 一、 問題描述: 華為地圖服務“我的位置”能力,在中國大陸地區,向用戶展示他們在地圖上的當前位置與用戶的實際位置存在較大的偏差。 具體差別可以查看下方的圖片: ![image](https://img2023.cnblogs.com/blog/2396482/202306/2396482-2 ......

    uj5u.com 2023-06-27 09:20:07 more
  • iOS 微信、支付寶、銀聯支付組件的進一步設計

    原文地址:https://zhanglei.blog.csdn.net/article/details/121376500 ## 前言 有段時間沒寫技術文章了,一是因為作業太忙,再者因為本人文筆實在一般。最近終于閑下來,本著分享的目的將一些組件設計上的心得與大家分享。 本篇文章是基于原有一篇關于支付 ......

    uj5u.com 2023-06-24 08:14:13 more
  • iOS 微信、支付寶、銀聯支付組件的進一步設計

    原文地址:https://zhanglei.blog.csdn.net/article/details/121376500 ## 前言 有段時間沒寫技術文章了,一是因為作業太忙,再者因為本人文筆實在一般。最近終于閑下來,本著分享的目的將一些組件設計上的心得與大家分享。 本篇文章是基于原有一篇關于支付 ......

    uj5u.com 2023-06-24 08:14:00 more
  • Flutter狀態管理新的實踐

    宣告式UI其實并不是近幾年的新技術,但是近幾年宣告式UI框架非常的火熱。單說移動端,跨平臺方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到宣告式UI是以后的前端發展趨勢。而狀態管理是宣告式UI框架的重要組成部分。 ......

    uj5u.com 2023-06-21 08:53:40 more
  • Android Studio中SQLite的使用,主要介紹sqlite插入和讀出圖片(View

    sqlite簡介 本人最近在寫一個小的安卓專案,開發app程序中用到了安卓自帶的sqlite。本文主要對sqlite圖片操作進行介紹,其他存入文本之類的操作和普通資料庫一樣,眾所周知,sqlite是一款輕型的資料庫,以下先簡單介紹一下sqlite,為后續做鋪墊,有了解的大佬可以跳過此部分: SQLi ......

    uj5u.com 2023-06-20 09:33:03 more
  • Android程式員成長之路

    # 一、Android程式員需要具備的素養 1. 應該熱愛學習Android知識 2. 具備基本的自學能力和解決問題的能力 3. 具備實踐能力 # 二、Android程式員最終需要熟練掌握的語言 1. Java(基本) 2. C/C++(進階) 3. Kotlin(基本) 4. Python(可選) ......

    uj5u.com 2023-06-20 09:32:56 more
  • Airtest影像識別測驗工具原理解讀&最佳實踐

    Airtest是一個跨平臺的、基于影像識別的UI自動化測驗框架,適用于游戲和App,支持平臺有Windows、Android和iOS。Airtest框架基于一種圖形腳本語言Sikuli,參考該框架后,不再需要一行行的寫代碼,通過截取按鈕或輸入框的圖片,用圖片組成測驗場景,這種方式學習成本低,簡單易上... ......

    uj5u.com 2023-06-20 09:32:51 more
  • Android Studio中SQLite的使用,主要介紹sqlite插入和讀出圖片(View

    sqlite簡介 本人最近在寫一個小的安卓專案,開發app程序中用到了安卓自帶的sqlite。本文主要對sqlite圖片操作進行介紹,其他存入文本之類的操作和普通資料庫一樣,眾所周知,sqlite是一款輕型的資料庫,以下先簡單介紹一下sqlite,為后續做鋪墊,有了解的大佬可以跳過此部分: SQLi ......

    uj5u.com 2023-06-20 09:32:29 more
  • Android程式員成長之路

    # 一、Android程式員需要具備的素養 1. 應該熱愛學習Android知識 2. 具備基本的自學能力和解決問題的能力 3. 具備實踐能力 # 二、Android程式員最終需要熟練掌握的語言 1. Java(基本) 2. C/C++(進階) 3. Kotlin(基本) 4. Python(可選) ......

    uj5u.com 2023-06-20 09:32:23 more
  • Airtest影像識別測驗工具原理解讀&最佳實踐

    Airtest是一個跨平臺的、基于影像識別的UI自動化測驗框架,適用于游戲和App,支持平臺有Windows、Android和iOS。Airtest框架基于一種圖形腳本語言Sikuli,參考該框架后,不再需要一行行的寫代碼,通過截取按鈕或輸入框的圖片,用圖片組成測驗場景,這種方式學習成本低,簡單易上... ......

    uj5u.com 2023-06-20 09:32:16 more