一、 问题描述:
华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。
具体差别可以查看下方的图片:
二、 偏差较大的原因:
-
华为Map SDK在中国大陆使用的地理坐标系是GCJ02。
-
点击“我的位置”控件,获取的定位经纬度的地理坐标系是WGS-84。
-
因为以上两个原因,即地图View和“我的位置”定位源使用的地理坐标系不一致,所以才导致了“我的位置”定位不准确的问题。
三、 解决方案:
-
先使用华为Location SDK通过定位获取用户当前所在位置,华为Location SDK使用的地理坐标系也是WGS-84。
-
将华为Location SDK获取的定位经纬度转换为GCJ02地理坐标系。
-
通过华为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);
}
}
c. 展示地图并点击我的位置UI控件,从三张截图可以看出:“我的位置”与“用户实际所在位置”存在较大偏差。
2. 使用华为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对象,设置定位类型并开启定位。
private void initLocationClient() {
// 实例化fusedLocationProviderClient对象
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
LocationRequest mLocationRequest = new LocationRequest();
// 设置位置更新的间隔(单位:毫秒)
mLocationR