使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航

Use GoogleMap or MapBox Direction API implement my own navigation in my app

我想在我的 Android 应用程序中为司机实施导航地图。我不想使用 URL 方案打开 google 地图应用程序来导航它。我更喜欢在我的应用程序中实现此导航功能,就像 Google 地图所做的那样。

我的要求很简单。将用户从 PlaceA 导航到 PlaceB。

我阅读了 google 和 MapBox 网站上的文档后。有方向 api 供用户获取路线等所有信息。

1 Google地图方向 API: https://developers.google.com/maps/documentation/directions/intro?hl=en

2 MapBox 方向 API: https://www.mapbox.com/developers/api/directions/

我的问题如下: 1 我怎么知道什么时候是提示用户他应该转向 right/left 的适当时间? 2 我怎么知道从我当前位置到下一个 maneuver/Steps 有多远?由于我的位置总是在变化,所以我的位置更改后是否需要重新计算距离? 3 我怎么知道用户做了错误的操作?例如,它应该向右转,但用户向左转。我需要请求你的服务器重新计算路由

有什么建议吗? 提前致谢。

我将在下面回答您的问题,就像您使用的是新版 Android Mapbox Directions API 一样。

1.我怎么知道什么时候提示用户他应该转向 right/left?

首先,如您所知,您必须在 MapboxDirections.Builder() 中调用 .setSteps(true)。这将 return 指示包含您需要的所有信息。现在,为了提示用户在正确位置的步骤,您需要获取列表中给出的步骤操作坐标。这是发生一步的绝对坐标,因此用户很少会在穿越路线时实际操纵通过该点。因此,最好测量从用户位置到下一步坐标的距离,如果用户在给定距离内(比如 0.0189394 英里,大约 100 英尺),则提示用户下一步。要测量距离,我将在下面提供一个可靠的方法,您可以使用:

private double computeDistance(Waypoint from, Waypoint to) {
    double dLat = Math.toRadians(to.getLatitude() - from.getLatitude());
    double dLon = Math.toRadians(to.getLongitude() - from.getLongitude());
    double lat1 = Math.toRadians(from.getLatitude());
    double lat2 = Math.toRadians(to.getLatitude());

    double a = Math.pow(Math.sin(dLat/2), 2) + Math.pow(Math.sin(dLon/2), 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

    double R = 3960;

    double distance = R * c;
    return distance;
}

使用此方法,您只需将距离 returned(以英里为单位)与您的阈值(在我们的示例中为 0.0189394 英里)进行比较,如果距离 returned 小于阈值,我们就会知道用户在下一步的范围内。

2。我怎么知道从我当前位置到下一个 maneuver/Steps 有多远?因为我的位置总是在变化,所以我的位置改变后需要重新计算距离吗?

您的问题的第一部分已在问题 1 中得到回答。要回答第二部分,您可以调用 mapView.setOnMyLocationChangeListener 并创建一个新的 MapView.OnMyLocationChangeListener()。在其中,您需要重新计算用户坐标和下一步坐标之间的距离,就像问题 1 中的示例一样。

3。我怎么知道用户做了错误的操作?例如,它应该向右转,但用户向左转。我需要请求你们的服务器重新计算路由

您可以使用 isOffRoute() 方法来完成此操作,该方法将计算提供的 userLocation 与路线中每个航路点之间的距离,如果距离始终为偏离路线状态大于阈值(当前为 0.1 英里)。因此,在您的情况下,由于您希望在用户偏离路线时重新计算新路线,因此我会创建一个类似于此示例的 if 语句:

if (route.isOffRoute(userLocation)) {
    Toast.makeText(this, "You are off-route.", Toast.LENGTH_SHORT).show();
}

我不会向用户显示消息,而是请求一条新路线。请务必注意,该方法中目前存在一个错误,该错误将在 1.1 版中修复,并且还允许您自己设置阈值。一旦发布并修复错误,我将尝试更新此答案。

希望我回答了你所有的问题,欢迎在下方提问,我会尽快回答。

我还建议您尝试查看 Mapzen 的 Open。

这里有一个 link 到博客 post https://mapzen.com/blog/we-made-an-app and a video https://vimeo.com/112231821 以获得一些见解。