【FAQ】关于华为地图服务定位存在偏差的原因及解决办法(二)——仅适用于Location 6.7.0.300及之后的版本

news2024/9/29 21:32:43

一、 问题描述:

华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。

具体差别可以查看下方的图片:

在这里插入图片描述

二、 偏差较大的原因:

  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_width="match_parent"
    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"
        class="com.huawei.hms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        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控件,从三张截图可以看出:“我的位置”与“用户实际所在位置”存在较大偏差。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  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坐标系),即可得到如下结果:

在这里插入图片描述

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坐标位置与用户实际所在位置无偏差:

在这里插入图片描述
在这里插入图片描述

  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. 效果展示:

通过下方两图可以看出,我的位置图层与用户实际所在位置一致,且无偏差。

在这里插入图片描述
在这里插入图片描述

六、 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 最新技术资讯~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YOLO系列】YOLOX(含代码解析)

文章目录 环境配置demo测试转换成onnx YOLOX数据增广decoupled headAnchor-free标签分配get_geometry_constraintSimOTA 总结参考 【YOLO系列】YOLO v3&#xff08;网络结构图代码&#xff09; 【YOLO 系列】YOLO v4-v5先验知识 【YOLO系列】YOLO v4&#xff08;网络结构图代码…

2023年MathorCup 高校数学建模挑战赛-A 题 量子计算机在信用评分卡组合优化中的应用-思路详解(模型代码答案)

一、题目简析 运筹优化类题目&#xff0c;不同于目标规划&#xff0c;该题限制了必须使用量子退火算法QUBO来进行建模与求解。本身题目并不难&#xff0c;但是该模型较生僻&#xff0c;给出的参考文献需要耗费大量时间去钻研。建议擅长运筹类题目且建模能力强的队伍选择。 二…

用C语言进行学生成绩排序(插入排序算法)

一.排序算法 1.排序 从今天开始我们就要开始学习排序算法啦&#xff01; 排序&#xff0c;就是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程。为了查找方便,通常希望计算机中的表是按关键字有序的。 2.稳定性 除了我们之前了解的时间复杂度和空间复…

基于springboot+Redis的前后端分离项目之分布式锁(四)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 分布式锁 分布式锁1 、基本原理和实现方式对比2 、Redis分布式锁的实现核心思路3 、实现分布式锁版本一4 、Redis分布式锁误删情况…

S3版本控制,复制和生命周期配置

Hello大家好&#xff61; 在本课时我们将讨论S3的三个功能特性&#xff0c;这三个特性有一些相关性&#xff0c;即版本控制&#xff0c;复制和生命周期配置。 S3版本控制 首先版本控制&#xff0c;是将对象的多个版本保存在同一存储桶的方法。换句话说&#xff0c;您上传一个对…

数据结构--顺序表的查找

数据结构–顺序表的查找 顺序表的按位查找 目标&#xff1a; GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。 代码实现 #define MaxSize 10 typedef struct {ElemType data[MaxSize];int len; }Sqlist;ElemType GetElem(Sqlist L, int i) {return L.data[i-1]…

海外问卷调查项目可靠吗?是违法的吗?

可靠。 最近&#xff0c;一个备受瞩目的创业项目在社会上引起了广泛关注&#xff0c;这个项目集创业、全职和兼职于一体&#xff0c;被称为"海外问卷调查项目"&#xff0c;成为了无数人追逐的新选择。 然而&#xff0c;自中美贸易摩擦以来&#xff0c;中国人对&quo…

使用CloudOS快速实现K8S容器化部署

关于容器技术 容器技术&#xff08;以docker和Kubernetes为代表&#xff09;呱呱坠地到如今&#xff0c;在国内经历了如下3个阶段&#xff1a; 婴儿期&#xff1a;2014-2016年的技术探索期&#xff1b; 少儿期&#xff1a;2017-2018年的行业试水期&#xff1b; 少年期&…

1.设计模式之七大原则和介绍

0.为什么我要学习设计模式呢? 我发现mysql的jdbc有factory有工厂模式(编程思想,不指定语言都可以用) mq有一个QueueBuilder().setArg().xxx().build建造者模式,单例模式貌似也遇到过,前端也遇到了好几个设计模式的问题,比如prototype深拷贝和浅拷贝 所以我决定系统的学习一下设…

TC8:SOMEIP_ETS_004-005

SOMEIP_ETS_004: Burst_Test 目的 检查DUT是否可以在短时间内处理突发请求并返回所有请求的响应 测试步骤 Tester:新建有效SOME/IP消息Tester:使用method echoUINT8发送突发SOME/IP Request消息DUT:返回每个请求消息的响应消息期望结果 3、DUT:返回每个请求消息的响应消息…

学redis这一篇就够了

目录 1.下载安装启动 1.1 临时启动服务 2.2 默认服务安装 2.常用五大基本数据类型 2.1 key操作 2.2 字符串&#xff08;String&#xff09; 2.3 列表&#xff08;List&#xff09; 2.4 Set&#xff08;集合&#xff09; 2.5 Hash&#xff08;哈希&#xff09; 2.6 Zs…

分离表示学习:通用图像融合框架

IFSepR: A General Framework for Image Fusion Based on Separate Representation Learning &#xff08;IFSepR&#xff1a;一种基于分离表示学习的通用图像融合框架&#xff09; 提出了一种基于分离表示学习的图像融合框架IFSepR。我们认为&#xff0c;基于先验知识的共模…

Fast Segment Anything Model(FastSAM)

Fast Segment Anything Model&#xff08;FastSAM&#xff09; Fast Segment Anything Model&#xff08;FastSAM&#xff09;是一个仅使用SAM作者发布的SA-1B数据集的2%进行训练的CNN Segment Anything模型。FastSAM在50倍的运行速度下实现了与SAM方法相当的性能。 SAM代码&a…

pubg 依赖安装

一、安装python 1、进入官网 https://www.python.org/ 2、勾选Add python.exe to PTHA 3、自定义下载 测试和文档不需要勾选&#xff0c;然后next 4、自定义安装路径 点击install安装 安装成功&#xff0c;点击close。 5、测试 windr键&#xff0c;输入cmd 输入python回…

基于SSM的餐厅点餐系统设计与实现(Java+MySQL)

目 录 第一章 绪论 1 1.1系统研究背景和意义 1 1.2研究现状 1 1.3论文结构 2 第二章 相关技术说明 3 2.1 JSP(Java Server Page)简介 3 2.2 Spring框架简介 4 2.3 Spring MVC框架简介 5 2.4 MyBatis 框架简介 5 2.4 MySql数据库简介 5 2.6 Tomcat简介 6 2.7 jQuery简介 7 2.8系…

计算机毕业论文内容参考|基于大数据的信息物理融合系统的分析与设计方法

文章目录 导文摘要前言绪论课题背景国内外现状与趋势:课题内容:相关技术与方法介绍:系统架构设计:数据采集与处理:数据存储与管理:数据分析与挖掘:系统优化与调试:应用场景:挑战与机遇:研究方向:系统分析:系统设计:系统实现:系统测试:总结与展望:

SpringBoot原理(1)--@SpringBootApplication注解使用和原理/SpringBoot的自动配置原理详解

文章目录 前言主启动类的配置SpringBootConfiguration注解验证启动类是否被注入到spring容器中 ComponentScan 注解ComponentScan 注解解析与路径扫描 EnableAutoConfiguration注解 问题解答1.AutoConfigurationPackage和ComponentScan的作用是否冲突起因回答 2.为什么能实现自…

WIN10上必不可少的5款优质软件

噔噔噔噔&#xff0c;作为一个黑科技软件爱好者&#xff0c;电脑里肯定是不会缺少这方面的东西&#xff0c;今天的5款优质软件闪亮登场了。 颜色拾取器——ColorPix ​ ColorPix是一个颜色拾取器工具&#xff0c;可以让你快速地获取屏幕上任意位置的颜色值&#xff0c;如RGB、…

ivshmem-plain设备原理分析

文章目录 前言基本原理共享内存协议规范 具体实现设备模型数据结构设备初始化 测试验证方案流程Libvirt配置Qemu配置测试步骤 前言 ivshmem-plain设备是Qemu提供的一种特殊设备&#xff0c;通过这个设备&#xff0c;可以实现虚机内存和主机上其它进程共存共享&#xff0c;应用…

618美妆个护28个榜单:欧莱雅稳住冠军?珀莱雅大爆发第二?

存量时代的购物造节大竞争&#xff0c;作为消费复苏后的首场大促&#xff0c;今年的618堪称史上最“卷”&#xff0c;也承载着消费振兴、经济复苏等希望。 不过&#xff0c;今年所有平台都未公布具体GMV&#xff0c;某种程度说明大促造节的时代俨然已成过去式了。 5月18日&am…