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

2024-01-04

我想在我的 Android 应用程序中为驾驶员实现导航地图。我不想使用 URL 方案打开 google 地图应用程序来导航。我更喜欢在我的应用程序中实现此导航功能,就像 Google 地图一样。

我的要求很简单。将用户从一个地方导航到另一个地方。

在我阅读了 google 和 MapBox 网站上的文档后。有路线 API 可供用户获取所有信息,如路线。

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

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

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

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


我将在下面回答您的问题,就好像您正在使用新的一样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 版本中修复,并且还允许您自行设置阈值。一旦发布并修复了错误,我将尝试更新此答案。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航 的相关文章

  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • fetchUuidsWithSdp 的奇怪 UUID 逆转

    我有一个在树莓派上运行的 python 蓝牙服务器 使用 PyBluez 我在服务器中使用的uuid是 8f86d132 4ab8 4c15 b8df 0b70cf10ea56 我正在打电话device fetchUuidsWithSdp
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐