草庐IT

手绘地图制作的关键点之“实时导航”

轻轻的烟雾 2023-03-28 原文
接上文《手绘地图制作的关键点之“图层覆盖”》,继续来聊聊手绘地图另外一个关键点。
那就是“实时导航”。
作者:轻轻的烟雾(z281099678)
之前在《景区手绘地图(电子地图、智慧导览系统)如何制作》说过:

如果说手绘图本身是面子,让人对地图有第一印象和直观感受,那么实时导航功能则是地图的灵魂和里子。没有实时定位和动态路径规划导航功能的地图,只是一个可观而不可用的花瓶,没有使用价值。没有准确的而高效的实时导航算法,就不能把地图价值在游客手里发挥到最大。

实时导航的手绘地图

 

一、实时导航的最短路径算法

但凡与地图相关的产品,都有一个重要的核心,那就是最短路径的计算。手绘地图当然也不例外,甚至说更是其中的典型。
最短路径问题,是图论研究中的一个经典算法问题。这里的“图”的概念,和通常意义的图不一样,而是由结点和路径组成的一组数据,而最短路径则旨在寻找图中两结点之间的最短路径。
最短路算法常见的几种:bellman-ford、、spfa、floyd。每种算法的思想都有所差异甚至完全不同,适用的场景也各不相同。这里简略聊聊各自的特点。
bellman-ford:可以用于边权为负的图,图中如果有负环,算法会检测出负环。时间复杂度O(VE)。
spfa:bellman-ford的优化算法,本质是bellman-ford,所以适用性和bellman-ford一样。时间复杂度O(KE)。
dijkstra:只能用于边权都为正的图中。时间复杂度O(n2)。

floyd:也可以用于有负权的图中,即使有负环,算法也可以检测出来。可以求任意点的最短路径,有向图和无向图的最小环和最大环。时间复杂度O(n3)。

带权图
 
我们的手绘地图的路径规划算法,则主要用到了dijkstra和floyd。因为dijkstra算法较为高效,而地图里的点,每两个点的距离,一定是正数,不可能两点之间的距离为负。而floyd算法虽然效率较慢,但是他很强大,他可以直接计算出一个地图里所有点之间的路径。
所以针对不同场景,我们采取了两者结合的方案。

二、实时导航的方向指引

在手绘地图里,用户的实时方向,是导航的基础。
用户根据自己面对的方向,才能确定导航点位的方向。换言之,才知道当前应该往哪个方向前进。
而这一点至关重要的功能的实现,则需要接触HTML5的陀螺仪接口。现在绝大部分的设备都支持此接口。当然,是细节上,安卓设备和苹果设备有一些差异,我们在实现的时候注意兼容即可。

实现了方向的指引,则手绘地图导航功能的基础已经具备。


指北针指示方向

三、实时导航的路径信息

当前实时的道路信息主要包括:前方的转向以及距离。

类似于地图APP的导航功能,直行、转向等方向提示可以极大的增加导航的使用体验和实用效果。对于这一点,也可以通过设计算法实现。简单来说,可以通过用户前进的方向,结合规划的路径,来判断前方应当如何转向。当然,这里的细节比较复杂,就不展开赘述。而还需要注意的一点就是,判断用户是否已经偏移路线。


 导航提示信息

四、实时导航的智能纠偏

手机的定位不可能十分精确,总是在一个区间范围内随机的跳跃。如果按照手机返回的经纬度来定位,则用户会非常活跃的在一个范围内跳跃。这容易让人感觉很迷茫,也非常影响体验,降低实用效果。
因此,我们这里需要设计方案来进行智能纠偏。结合导航的规划路径,以及当前的定位,还参考前进的速度、方向等参数,把用户的位置控制在比较真实而友好的位置。

当然,对于确实偏移过大的情况,也不能强行纠偏。因为这种情况,我们其实是不知道到底是用户确实已经偏离太大,还是手机定位出现的较大误差。这时可以根据实际情况提示用户已经偏移路线,或者待手机定位自动恢复正常。


 纠偏信息

五、演示案例

 

展示一个示例。

有关手绘地图制作的关键点之“实时导航”的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  3. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  4. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  5. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  6. ruby - 在 Ruby 中跳过额外的关键字参数 - 2

    我定义了一个方法:defmethod(one:1,two:2)[one,two]end当我这样调用它时:methodone:'one',three:'three'我得到:ArgumentError:unknownkeyword:three我不想从散列中一个一个地提取所需的键或排除额外的键。除了像这样定义方法之外,有没有办法规避这种行为:defmethod(one:1,two:2,**other)[one,two,other]end 最佳答案 如果不想写**other中的other,可以省略。defmethod(one:1,two:2

  7. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  8. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  9. ruby - 如何在ruby中制作动态多维数组? - 2

    我有一个关于多维数组的初学者ruby​​问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu

  10. ruby - 如何在不使用 HERE-DOCUMENT 语法的情况下在 Ruby 中制作多行字符串文字? - 2

    问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub

随机推荐