当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用GoogleMap或MapBoxDirectionAPI在我的应用中实现我自己的导航》经验,为你挑选了1个好方法。

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

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

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

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

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

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

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



1> cammace..:

我将在下面回答您的问题,就好像您正在使用新的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版中修复的错误,并且还允许您自己设置阈值.一旦它被释放并且错误得到修复,我会尝试更新这个答案.

我希望我回答你所有的问题,并随时提出问题,我会尽快回答.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有