我想在我的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我如何知道用户做出了错误的操作?例如,它应该向右转,但用户向左转.我需要请求您的服务器重新计算路由.
有什么建议吗?提前致谢.
我将在下面回答您的问题,就好像您正在使用新的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版中修复的错误,并且还允许您自己设置阈值.一旦它被释放并且错误得到修复,我会尝试更新这个答案.
我希望我回答你所有的问题,并随时提出问题,我会尽快回答.