使用GoogleMap或MapBox Direction API在我的应用

时间:2016-01-07 19:43:00

标签: android google-maps mapbox direction

我想在我的Android应用中为驱动程序实现导航地图。我不想使用网址方案打开谷歌地图应用程序进行导航。我更喜欢在我的应用程序中实现此导航功能,就像谷歌地图一样。

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

我从谷歌和MapBox网站上阅读文件后。有方向api供用户获取路线等所有信息。

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

<强> 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版中修复的错误,并且还允许您自己设置阈值。一旦它被释放并且修复了错误,我会尝试更新这个答案。

我希望我回答了您的所有问题并随时提出以下问题,我会尽快回答。

答案 1 :(得分:0)

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

以下是指向博文https://mapzen.com/blog/we-made-an-app和视频https://vimeo.com/112231821的链接,以获取一些见解。