我将在下面回答您的问题,就好像您正在使用新的一样Android Mapbox 路线 API https://github.com/mapbox/mapbox-directions-android.
1. 我如何知道什么时候是提示用户应该右转/左转的合适时间?
首先,如您所知,您必须致电.setSteps(true)
在你的MapboxDirections.Builder()
。这将返回包含您需要的所有信息的路线。现在,为了提示用户在正确的位置迈出一步,您需要获取列表中给出的迈步操作坐标。这是发生步骤的绝对坐标,因此,用户在穿越路线时实际上很少会通过该点。因此,最好测量从用户位置到下一步坐标的距离,如果用户在给定距离内(例如 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. 我如何知道距离当前位置到下一个操作/步骤还有多远?由于我的位置总是在变化,因此位置更改后是否需要重新计算距离?
您问题的第一部分已在问题 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 版本中修复,并且还允许您自行设置阈值。一旦发布并修复了错误,我将尝试更新此答案。
我希望我回答了您所有的问题,请随时在下面提出问题,我会尽快回答。