根据 mapbox 地图上的用户导航旋转标记(箭头)android

Rotate marker(arrow) as per user navigation on mapbox maps android

我正在开发一个必须根据用户导航旋转箭头的应用程序。

我正在使用最新的 Mapbox SDK。

我尝试过使用障碍(使用纬度和经度计算)但未能成功。

我不知道如何实现它。

它(箭头标记)应在预定义的多边形路径上导航。

1- 首先您需要输入 - 您需要从位置对象中获取 getBearing()

2- 您需要正确的输出 - 您可以通过两种方式实现 -

一个。如果你使用 png 图标,你可以每 10 度创建一个箭头,(36 个箭头)并用正确的图标更新标记,如果当前方位与旧方位不同。

b。更好的选择,但我不知道这是否有效:mapbox 的标记有 options.rotation option. But in android, Mapbx moved to Mapbox annotation plugin, see also here

SymbolManager 有一个函数 setIconRotationAlignment。所以如果你会用这个class,我相信你可以通过方位来设置图标的旋转。

您还可以在this demo中看到其中一个选项是“将图标旋转设置为 45”

3- 还有一件事 - 您可能还想获得 getBearingAccuracyDegrees 的输入,以了解何时没有足够好的方位精度,并向用户发出指示。

我使用以下方法成功计算方位并根据用户导航旋转箭头:

float bearingBetweenLocations(LatLng latLng1, LatLng latLng2) {
        double PI = 3.14159;
        double lat1 = latLng1.getLatitude() * PI / 180;
        double long1 = latLng1.getLongitude() * PI / 180;
        double lat2 = latLng2.getLatitude() * PI / 180;
        double long2 = latLng2.getLongitude() * PI / 180;
        double dLon = (long2 - long1);
        double y = Math.sin(dLon) * Math.cos(lat2);
        double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
                * Math.cos(lat2) * Math.cos(dLon);
        double brng = Math.atan2(y, x);
        brng = Math.toDegrees(brng);
        brng = (brng + 360) % 360;

        return (float) brng;
    }

注意:箭头要朝上,如下图。 如果不是,那么您必须按照箭头的方向设置方向 +/-。

如果您更喜欢使用库而不是您建议的方法,那么我建议使用 Turf 。 “Turf android”是一个由 mapbox 家伙创建的库,它有很多有用的方法,包括这个。

/*
Takes two {@link Point}s and finds the geographic bearing between them.
*/
TurfMeasurement.bearing(@NonNull Point point1, @NonNull Point point2) 

图书馆主页: https://docs.mapbox.com/android/java/guides/turf/