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

标签 android google-maps mapbox direction

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

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

在我阅读了谷歌和 MapBox 网站的文档之后。有 directions api 供用户获取所有信息,如路线。

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

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

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

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

最佳答案

我将在下面回答您的问题,就好像您正在使用新的 Android Mapbox Directions API .

<强>1。我怎么知道什么时候是提示用户应该右转/左转的合适时间?

首先,您可能知道,您必须在 MapboxDirections.Builder() 中调用 .setSteps(true)。这将返回包含您需要的所有信息的方向。现在,为了提示用户在正确位置的步骤,您需要获取列表中给出的步骤操作坐标。这是发生一步的绝对坐标,因此用户很少会在穿越路线时实际操纵通过该点。因此,最好测量从用户位置到下一步坐标的距离,如果用户在给定距离内(比如 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;
}

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

<强>2。我怎么知道从我当前位置到下一个 Action /步骤有多远?由于我的位置总是在变化,所以我的位置更改后是否需要重新计算距离?

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

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

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

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

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

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

关于android - 使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34663793/

相关文章:

javascript - 如何使用javascript调用google map具体位置

Leaflet Markercluster - 关于悬停问题的工具提示

javascript - 使用一些 map API 突出显示整条街道

angular - Mapbox-gl.js map 在加载事件的 angular-cli 项目中未定义

java - 如何在 map View 上显示自定义信息窗口

java - Loopj Android Async Http - onFailure 未触发

android - Activity 从 Fragment 启动时未调用 onActivityResult()

android - 我想将 textview 中的数据添加到 sqlite 数据库

java - 如何使具有多个整数和字符串的类可解析?

javascript - 谷歌地图 API JS : trying to convert the address to Lat Long