【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

一、 问题描述:【【FAQ】关于华为地图服务定位存在偏差的原因及解决办法】华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差 。
具体差别可以查看下方的图片:

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

文章插图
二、 偏差较大的原因:
  1. 华为Map SDK在中国大陆使用的地理坐标系是GCJ02 。
  2. 点击“我的位置”控件,获取的定位经纬度的地理坐标系是WGS-84 。
  3. 因为以上两个原因,即地图View和“我的位置”定位源使用的地理坐标系不一致,所以才导致了“我的位置”定位不准确的问题 。
三、 解决方案:
  1. 先使用华为Location SDK通过定位获取用户当前所在位置,华为Location SDK使用的地理坐标系也是WGS-84 。
  2. 将华为Location SDK获取的定位经纬度转换为GCJ02地理坐标系 。
  3. 通过华为Map SDK提供的huaweiMap.setLocationSource(LocationSource locationSource)方法,设置“我的位置”图层定位源 。
四、 注意事项:使用Location SDK获取用户当前所在位置信息 和 WGS84转GCJ02坐标系的章节仅适用于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);    }}

经验总结扩展阅读