粉丝26获赞131


好,如何实现地图的更新?什么叫地图的更新呢?就是地图上啊,这些元素啊,你会发现了他的一些信息呢,在变化,比方说这个飞机他在不断的变动,对吧?他的位置在变动,然后呢他这个路径呢,在不断的拉长,你看这些飞机也是,那么对这两个飞机是如此,对地图上的所有的飞机呢,都是如此啊,你随便选中一个飞机,那么你会发现了他的位置呢? 啊,这个飞机没动了,是吧?啊?随便选一个,好,你看一下这个飞机,那么这个飞机是在动的,是吧?那么他的信息呢,是在不断的变化的, 那么像以后啊,你们做地图应用的时候,地图上任何元素的一些信息的变化都可以使用。我们这节课所提到的内容啊,就是如何来实现地图更新。 那么目前呢,我们做到的效果呢?是有飞机了,有地图了,但是呢这些飞机的信息呢,是静止的,没有任何的变化,我们随便点一个飞机啊,你看他的信息是静止的,他没有任何变化,是吧?那么现在呢,我们要不断的去更新地图上的元素,这里边会遇到很多很多细节上的问题啊,那么这些细节问题呢,不仅仅是我们这个地图应用会遇到,那么将来的同学们做其他的地图应用都会遇到, 那么都可以用类似我们这节课的做法去处理好。我们首先呢在代码里边呢,去新建一个模块叫做 update, 这个模块呢专门用于处理地图更新的,我们导出一个函数啊, update, 给我传一个 map 进来啊,给我传一个就是地图进来,我负责呢不断的对这个地图更新 好,然后导出个函数过后呢,我们就可以在入口这里呢去应用它啊。呃,这里不是有地图了吗?对不对?我们导入这个 update 啊,然后呢去掉个 update 来更新地图,好,那么这个模块的使用就建立好了,那么接下来我们目光就集中在这个 update 函数里边,给我一个地图,我负责不断的对这个地图呢进行更新。 由于我希望更新的尽量的平滑,所以呢,我们肯定不能使用什么 set interval, set timeout 这种东西啊,我们应该使用什么 request animation free 啊,不断地去注册更新,然后呢在这里呢去写个更新逻辑,好,这一块没问题吧?好,那么接下来呢,就要处理很多的细节问题了啊。好,首先第一个问题就是更新的频率是多少, 有人说那不遗血了吧,对吧?每一次渲染真我都要去更新啊,你不能这么看,我这里的意思是每一次渲染真我都要去触发更新逻辑,但是在更新逻辑这一块到底要不要更新是需要进行判断的。我再说一次啊,我指的是每一次渲染真 我都要去处理一下更新逻辑,但是更新逻辑里边到底要不要更新是需要经过判断的,为什么需要经过判断?如果说你每一次渲染真都去进行一次更新的话, 你看一下这个地图上这么多飞机,我就问你卡不卡就完事了?肯定要卡呀,而且呢,有必要吗?其实没有什么必要,你看啊,比如我们这里呢,进入到一个放大的地图,那么这个时候呢,这个飞机要平滑的往前移动,对吧?那么这个时候呢,更新的频率肯定要高一些, 而反之呢,如果说我们缩放这个地图啊,把这地图缩小说小过后,你看这个飞机你有必要那么快的更新吗?是不是感觉不到啊?你不断的更新它干啥呀? 所以说它更新频率呢,应该随着这个地图的缩放而进行变动,地图放大的越大,那么它的更新频率呢就越高,是不是这个道理?那么这是一个优化措施啊,在很多地图应用里面,特别是那种会涉及到地图的放大缩小,这是很常见的是吧,反而是会涉及到放大缩小的时候,更新频率你是必须要考虑进去的,因此呢,我们这里呢, 需要处理一下更新频率的问题,就是在不同的地图缩放级别里边呢,我们的更新频率是不一样的,那于是呢,我就写出来了这么一个函数啊,叫做 get interval, 这是根据不同的地图缩放级别获取更新的时间间隔, 这个代码应该很好懂吧。啊,我这里呢就写了这么一个数值啊,用数值的下标了作为缩放倍率啊,比方说下标为零的位置,没有缩放为零的地图,是吧,所以说这一块空着啊,地图的缩放倍率为一的话,就是全图的情况下,那么我就是五秒钟一更新,地图缩放为二的时候呢,我就是四秒一更新啊,一次性 啊,我写到了几个了,一二三四五六七八啊,超过了八个过后呢,我就使用默认值十六,每次六毫秒一次更新,这个好理解吧,那么到时候使用的时候呢,我们来测试一下吧啊, get 指令 into, 把它挂在到文档里边去测试一下啊。 好,你看一下 get interval 啊,如果说我说话倍率为一,那么得到五秒钟说话倍率为二,就是四秒钟说话倍率为十,那么就是十六毫秒,懂这意思吧?好,我们一会呢,要通过这个东西来得到当前的更新频率。于是呢,在更新逻辑这一块,是不是有这么一个逻辑,就是我要得到 当前的地图的缩放倍率啊,这些 a p i 层面的东西啊,就不用那么去关注啊,只需要知道那个,到时候你去查 a p i 文档也好,还是你去问 ai 也好,都非常容易得到这个 a p i 相关的信息。关键是我们代码结构该怎么去写啊? 好,于是呢,我通过这里啊,拿到这个更新的一个频率,那这里是不是要判断是否到达更新时间,是不是要记录一下上一次的更新时间啊,对吧,因此呢,我们这里呢,需要一些全剧变量啊。 呃,有一个 last update time, 表示上一次更新的时间。好,那么有了这个时间过后,是不是很简单呢?我们在这里呢,拿到当前时间啊, now, this now, 然后呢,用这个 now 减去上一次的更新时间,看是不是大于等于 interval。 如果说大于等于的话,那么就要执行更新, 这里要仔细更新操作,更新操作,然后呢,再重新设置上一次的更新时间,这个代码结构没问题吧?我们重点啊,是要关注代码结构,不要去关注这些玩意的细节啊,这些都不重要。那么如何来执行更新操作呢?我们这里呢可以把这个逻辑呢放到另一个函数里面去执行啊,尽量的 分函数,分模块,我们这里就写另外一个函数吧,叫 updates layers。 好, 把地图传给我啊,然后呢,我来负责更新地图里边的数据,这才是真正的去执行。更新好,看一下这代码结构啊,首先保证同学们对这一部分代码结构没有问题,其实这里我们可以验证一下啊。呃,我们这里打印一下 update 吧, 看一下打印的频率是多少啊,然后到这边来看一下啊,控制台,好,这里打印的太快了,对吧?这里出了问题,我们打印一下这个 room 和打印一下这个 interval, 看得到这两个东西正不正确啊? 刷新看一下啊。好的,可以看到这里有问题了,是吧?因为我们得到的算法倍率呢是一点五,一点五,它带有小数点,它有小数点去取这个数值里边东西呢,是取不到的,是吧?所以说我们这一块呢,我们可以对它进行一个 max flow 啊,就把这些细节问题解决了啊,好,保存,你看一下,这样子,用整数去取,才能从数值里边取得到,你看现在就是不是就没有更新那么频繁了,对吧?一次更新,因为我们拿到的是一秒钟,一秒钟的话得到的时间间隔是五秒钟,你看五秒钟一次更新,看到没 啊?再等一下啊,是不是第三次更新,然后呢,随着我们地图的缩放倍率变大,你会发现了更新的频率就变快了,我们把这个打印去掉啊,这个打印就去掉了, 再来一次啊,好,我们在这种缩放级别下呢,是五秒钟一次更新,然后呢不断的去放大地图啊,放大地图,你会发现他明显的更新频率变快了,看到没?更新频率变快了,然后继续放大地图,你看更新频率就更快了是不是?那么这更新频率的控制呢?我们就做到了啊,那么除了这个效果之外,以后呢,能做其他的图效果,经常都会使用到这样的一个技巧,控制更新频率 啊,就用这种代码格式去写啊,没问题的。好,接下来就是下一个问题,我们到时候更新的时候是远程更新还是本地更新呢?什么意思?就是这些飞机它的实时位置,我们肯定需要通过远程来获取,拿到一个最新的实时位置,但是你每一次更新真的需要从远程去获取吗?如果说你每一次更新都要从远程去获取的话,这个有点夸张哦,比方说你放大到这种级别的话, 他更新的速度太快了啊,他是不断的进行更新的,那么这个时候你每一次更新都要从远程获取。首先我还是问你那句话,你卡不卡?那肯定要卡呀,而且需要那么的实时吗?如果说你真的需要那么实时的话,那你没办法,你只能通过远程去更新,尽量的去优化个网络传输。但是很多时候啊,实际上没必要的, 我们往往会怎么做呢?我们往往会在大部分时候都使用本地更新。什么叫本地更新呢?因为目前呢,我们在本地可以拿到这个飞机的什么性质?他的速度,他当时所处在的位置, 那么其实位置、速度、方向,还有包括时间那些信息都能获取,是不是可以通过一个简单的公式就可以算出他新的位置应该在哪?对不对?我们完全没必要那么频繁的去请求服务器,所以 说我们大部分时候呢使用本地更新,但是呢有可能这个飞机飞着飞着他可能拐弯了,这个你说不好啊,所以说我们隔段时间呢,去问一下服务器,哎,你的新的位置在哪?然后呢去修正当前的位置,所以说我们往往这种地图的做法呢,就都是这样子啊, 本地更新加上远程获取去修正。因此第二个问题他答案就是远程和本地都要本地呢频繁一些,远程呢?隔一段时间去问一下,对吧?不断的去修正。那么到代码层面的话,我们该怎么来处理本地和远程的这种操作呢?那有些同学呢,就可能会写成这么一种代码机构,什么情况下?比如说远程获取的时间到了啊?那么我们就会进行这个 远程更新,通过远程数据去更新位置。 else, 如果说远程更新的时间没到了,我们就进行本地更新啊,你想一想,你是不是会写成这么一种代码结构,这种代码结构行不行呢?如果说你写成这种代码结构的话,你就会遇到一个问题,什么问题呢?我给你举个例子啊, 比方说我们在最大的放大倍率里边,他是按照那个十六毫秒一次更新的,对吧?那么我们现在呢画一个时间轴,每隔十六毫秒呢,他的更新点应该在这些位置啊,比方说在这些位置好,这些位置都是本地更新,是很快的。好,突然这个位置远程时间到了,那么要进行远程更新,那我问你,远程更新是不是一个一步操作?是一步操作吧,他要不要等待?要等待吧,那么也就是说 这一次更新你会间隔的很远,非常远,那么给用户的关怀就是这里卡了一下,等了一会,啪,然后才更新的,他更新的不平滑,懂这意思吧?他就会遇到这样的一个问题,就像这些问题难道只是地图应用才会遇到吗?不,各种应用都会遇到这个问题吗?只要你涉及到本地和远程共同更新的时候,他都会遇到这样的一个问题,那这个问题该怎么来解决? 看好啊,应该这么解决,就是我的更新频率不变,还是每隔十六毫秒一次更新啊?当然这个更新时间间隔呢?根据不同的地图说话倍率来进行动态调整啊。这个无所谓,反正我们每隔固定的时间进行更新,我不管是不是远程,我就更新就完事了。 然后呢,我每一次更新的时候,我要看一个东西,看一个远程数据,这里我用一个变量来保存远程数据,看这个远程数据在不在的话,我就使用远程数据去更新,不在的话我就使用本地数据去更新, 懂这意思吧?那这个数据什么时候在呢?哎,我另开一个逻辑,这个逻辑呢,就是每隔一段时间去远程获取数据,他只负责把远程数据往这里边放,我不管你是花了一秒钟还是十秒钟还是一年,反正你获取到的数据往这里边放就行了。那么到时候我这条线在更新的时候,我就去检查这个数据,这个数据有,我就用远程数据更新,这个数据没有我就使用本地更新, 不管你是什么时候往这里边放的,那么这样子的话,他就不会去干扰这个更新的频率和时间间隔,能看到这意思吧?所以说我们很多时候做应用啊,他知识是一回事,你如何用知识去解决这些问题,又是另外一回事,就知识和能力两者 都必不可少,这就是为什么同样都是学的这些东西,在不同的人手里边,他做出来东西就是不一样的,写出来代码格式啊、质量啊,都是不一样的。那你要真想大幅度的去提升知识和能力两个层面东西, 那么就好好来看咱们的课程啊,我们给同学们提供了大量的福利课程,尤其是这个核心大师课啊,他是完全免费的啊,这个课程里面都是对同学们的知识和能力进行集中性的训练,又或者像这个课程难点亮点,你会发现看完这个课过后,他用的知识还是那些知识,你们都是学过的。但是我就不信了,你没看过这个课程,遇到了那些问题, 你能用那些已有的知识能处理好,你看了就知道了,这里面提供的难点亮点啊,都是来自于大厂真实的项目里边的问题,你看一下那些复杂问题该怎么去处理, 这都是咱们度一啊,为了去提升同学们的就业竞争力,去提升薪资,去提升简历和面试通过率,我是花了很多心思给同学们录出来的课程啊,一定一定要认真看啊,当然如果说你想体系化的学习我们的课程的话,也可以去了解一下咱们的付费课程,像我们这个 web geek 啊, 完整的 web geek 的 课程啊,就地图应用的课程是放到咱们的付费课程里边的啊,这里边也有很多的呃项目,当然地图的知识部分呢,也包括了 地理信息概念,还有各种二 t 地图的框架啊,像 openlayers 啊, linux 啊, python box 啊,还有就是高德地图 api 啊之类的啊,也包括了一些全站的设计啊,就是服务器那边该怎么来处理,然后以及包括三 d 地图的各种各样的知识,以及通过项目来训练你三 d 地图的开发能力, 总之知识和能力两者必不可少。想了解这些课程的同学啊,可以在咱们账号主页点击头像进入账号主页,根据提示来找咱们了解课程就可以了啊。 好说回来啊,刚才的那个逻辑听懂了没?就是我的更新频率是不变的,然后每次更新呢,我去检查一个数据有没有值,有值的话 那么我就用数据更新,就是远程数据更新,没有值的话,那么我就正常更新。所以代码结构应该写成什么样子的?应该写成这样。前面这个逻辑呢,就是去判断远程获取数据的时间到没到,如果到了过后呢,我就去远程 获取数据,这里千万不能去等待啊,千万不能等待,不然的话就影响到后面的更新了。你去获取完事了,什么时候获取了,给某一个变量赋值就完事了。那么后续的更新,那我就去检查那个变量,对吧?他不影响后续的执行。 好,那么我如何来知道远程获取数据时间到没到呢?这些东西都是小事了啊,你随便去定一个远程获取的时间,上一次远程获取的时间啊,一开始就用当前时间吧,然后再定一个常量, 就是远程的时间间隔啊,多久进行一次远程更新?呃,因为我这个数据呢,用的是个 open sky 的 数据啊,他是要求你至少要隔十秒钟啊。那我这就隔十五秒呗,每十五秒钟去远程问一下数据。好, 那么这块怎么来判断是不是一样的啊?得到当前时间放上面啊,然后呢?看一下当前时间,减去上一次的远程更新时间是不是到达这个时间间隔?到达时间间隔的话就是远程获取数据。 远程获取数据也是不是以前我们写过那个 api 的, 对吧?导入一下啊? face state, 哎,是不是 face state 对 不对? face state 好, 那么调用这个函数。注意啊,这里千万不能去等待啊,一等待的话就把后边影响到了啊。用这个 z 好, 当我们获取到数据过后呢?然后把这个数据放到一个地方啊,我们就这里放到这里啊, remote state, 一开始为道放那个变量里边。好,然后在这里给这个数据复制。然后呢?把上一次的远程更新时间设为当前时间啊,这里重新设为这层道吧,因为远程获取需要段时间嘛,对吧?这里的时间跟这里的时间就不太一样了。这都是小细节啊,你看这个代码结构就写成这个样子了, 再来读一下啊,远程时间到了,那么就远程获取数据,我后边的东西不影响后面接着做该更新更新,等你远程数据获取到了过后,我就往一个变量里边去保存,然后呢?后续再更新的时候呢? 哎,我看到有远程数据,我就用远程数据去处理,没有远程数据,我用本地数据去处理,懂意思吧?所以说后边的更新函数啊,在这里他的结构应该怎么写呢?就是一个判断,如果说有远程数据,那么这里就要处理远程数据。好,然后呢再进行更新数据啊,就变成这么一种格式了。 好,接下来就是这两个问题了,对吧?一个是如何来更新这个数据,一个是如何来处理远程数据。大家说袁老师,你这个写法是不是不对啊?是不是应该换个 else 啊?对吧?要么就远程更新,要么就本地更新,实际上呢,是这样的,远程更新的跟本地更新的逻辑其实是一样的,在我们这个效果里面就是一样的。为啥就是一样的?因为他其实并不存在什么远程更新, 只有一个远程处理数据,你比如说拿到了飞机新的位置啊,速度啊,方向啊,他是不能保证他是最新的,为啥呀? 因为这就是我们这个项目的一个特点啊,他远程拿到的数据呢,是在呃某个时间点,飞机的 高度、位置、方向、速度,他拿到是这么一个信息,这个时间点可不是当前时间点啊,他是根据飞机上报的时间,因为飞机他有个应答器啊,他是不断的向那个服务器去上报自己的信息,他不是每时每刻的上报的啊,他是隔段时间上报一次,所以说你拿到这个时间点可能不是当前时间点,因此呢,你还得用本地去更新以下当前时间点他应该在哪去算一下, 也就是我要根据这个时间点去算一下飞机的高度,位置,方向,速度,知道吧,所有后续呢,都要经过一个本地更新数据的一个处理啊,更新数据处理好,于是呢,我们这里呢,无非就是写两个函数呗,先搞定这个吧,更新数据处理啊,来 update plane layers。 好, 我们这里就调这个啊,更新飞机的这一层 来吧,所有的问题现在集中到这了啊,如果来根据一个地图对象来更新这个飞机这一层的数据。好,那么这个函数如何实现呢?那就很简单了是吧,就是获取所有飞机的 feature 啊,你 把注水打他就写出来了,那么具体的 a p i 他 不重要哈,何况这个 a p i 是 错的哈。呃,他自己又幻觉了,得到所有的层啊, layers, 然后呢,把层转成数组啊, get 而为,那么这样子呢,就拿到所有的层了啊, layers, 那 么在 layers 里边进行用 find 的 方法啊,这是个数组嘛,对吧,有很多层嘛,拿到哪一层呢?呃,拿到那个,它的名字为 planes 啊,我们之前那个层我看一下啊,那个层的名字是不是 planes 看一下,哦,对, planes 啊,就飞机那一层。好,这样就拿到飞机那一层了啊,然后拿到飞机那一层的数据啊, source, 你 看城里边有 source, 有 数据源对吧,数据源里面有啥?有 features, 来打印一下这个 features 啊,好,咱们来看一下打印结果啊。呃,另外呢,我刚才发现有一个地方有问题哈,就是这个地方这个时间呢,你得把它提上来哈。为什么要提上来? 因为这个远程请求呢是需要花时间的,在远程请求期间如果说这个时间一直保持不变的话,比如你写下来一直保持不变的话,那么这个条件就是一直成立的,它就会不断的远程请求啊,这是个小细节啊,要把它提上来啊。 好,其他没问题的啊。咱们来看一下打印这个 face 的 结果。拿到所有的飞机的 face 好 展开啊,看是不是拿到了四千多个飞机,每个飞机的 face 全部拿到了。好,拿到这个 face 过后是不是可以做更新了?咱们再做更新循环呗,循环每一个 face 啊,好,后续的东西就没有什么好说的了啊,就是根据 face 里边的各种信息去更新它的数据,我就快速把它写完了。啊 好,就这么些逻辑啊,大概读一下啊,就获取到当前飞车里面记录的目前飞机的经纬度啊,拿到了目前飞机的速度。对,都是以以前的信息啊记录进去的,然后目前飞机的方向,然后当时所记录的位置的时间就记录的位置当时所记录的时间。你看就是其实时间吗?对吧?如果说他没有速度,如果说他没有朝向,那么就 停留就看下一个飞机啊,因为有些飞机他是停在那里的,他没有动。呃,然后呢就是把这个经纬度转换成地图坐标,这是个莫卡托坐标系啊,以前说过的, 然后算出当前时间到其时时间经过的时间,然后呢就可以计算距离了,对吧?速度长时间就是距离嘛,然后根据一个三角函数就可以算出新的坐标,然后把新的坐标呢给它重新设置进去,就完事了啊,我们可以看一下这个效果啊, 然后随便选中一个飞机,然后走,你看一下这个飞机是不是在动了,可在动了对不对?好,那么现在呢,这个更新就搞定了啊,那么更新这一块呢,你会发现有一个问题哈,就是这个路径路径这一块有点问题,因为飞机在动,路径没动,对不对?所以说路径这一块呢,我们也要依次更新哈,所以说我们再写一个函数来更新它的路径。 update pass, 更新路径图层。好,除了更新这个飞机之外呢,我们还需要更新路径,那么更新路径的逻辑其实很简单啊,路径不就是一个一个点组成的吗?对不对?那无非我们就是把之前的那个当前飞机的位置点移除,比方说他以前的路径是这么几个点组成的啊,这些点组成的一个路径。 好,那么首先我们第一件事,我们需要在创建路径的时候,就需要把当前飞机所在的位置表,当前飞机的位置在这, 那么把这个新的点加进去,而随着飞机往前移动,那就把这个点移除掉,然后加入新的个位置,然后再把这个点移除掉,然后加入新的位置,那最后一个点就跟随着飞机的实施位置, 所以说这个点呢,我们以前不存在,我们需要把飞机的实施位置这个点在创建路径的时候再加进去啊,以前我们加路径的时候在哪呢?在 e 问层这里啊。 好,咱们回到这边来啊,这边呢?我们之前只记录了之前的点,是吧?呃,然后呢,现在我们把飞机当前的点加入进去,加到这个数值的最后一项啊,我们这里的 pass 呢,我们给它展开,然后呢还要加入一个飞机当前的位置, 当前的位置把当前的位置呢加到这个数值的最后,始终保持这个数值的最后一项呢是飞机的实时位置,到时候我们就更新这个点就可以了。然后呢这个飞机里面我们最好呢把这个当前的飞机 id 啊给它加进去,这样子呢,方便到时候去获取这个飞机的实时位置。 好,然后到这边来啊,那么这个代码呢,我就快速写完了啊。好,代码写完了看一下啊,非常简单。呃,首先拿到所有的图层,然后拿到这个 pad 就 路径那个图层,然后拿到啊,然后拿到这个路径的 source。 图层里边有数据源嘛?数据源里面有什么? faker 好 更新那个路径那个图层路径图层里边所有的 faker。 他 其实只有一个啊,我这里 还是写了个循环,因为他返回的是个数据库吗?他实际上这个数据库里边要么没有路径,要么就有一个路径。然后呢拿到这个 faker 的 所有的目前的路径点啊, 然后呢,拿到这个他对应的飞机 id, 然后用这个 id 去取啥取飞机的位置看,从这个飞机图层里边去拿 swiss 拿飞机,然后去找这个 id 相同的飞机,然后如果说没有这个飞机的话,那么这个飞机现在已经不存在了,他就 啥也不做,是吧?否则的话就拿到这个飞机的坐标点,然后干嘛呢?然后把之前的坐标点,他的最后一项改成这个。好,所以说我们这一块啊,把之前的这个 pad 刚才这个代码写的有问题啊,他的最后一项 改成这个,然后呢?重新设置个 password 就 完事了啊,保存看一下。好,首先选中一个飞机啊,点击,然后进去,你看这路径是不是一直在更新呢?对吧?这路径跟随着飞机在走了, ok, 那 么这个更新这一块呢,就完成了啊,接下来就是 处理远程数据。好,我们这里单开一个函数啊,叫做 apply remote state 应用远程数据,还是把 mac 传给我啊?好,这边就调这个方法。 那这一块的实现思路是啥呢?就是现在我们有两块数据,一个是本地的飞机数据,在哪呢?在 features 里边对吧?还有一个呢,就是远程数据,然后在哪里?在 remote state 里边,那么这两个数据是不是要对比啊? 对不对?两个飞机相同,那就更新数据,如果说远程数据里面有,这里边没有呢,那叫加一个飞机。如果说这里边有,远程数据里面没有呢?那叫删除一个飞机,对吧?就是一个 def。 那 这个玩意我还要一行一行给你们写吗?你们自己去对比对吧,就是一个非常非常简单的算法啊, 只不过呢,你这里边可以考虑到一些新的问题,如何来高效的在更新,那我们是不是可以接触一些 map, 对 不对? map 的 存取呢?他的效率呢?都是 o 一 啊,这一小细节问题呢,就不去一一说了啊,我就快速把代码写完,大概的过一下就可以了。好,写完了啊。呃,简单看一下 把一层啊,什么 source 啊,那些 feature 啊,全部拿到啊,然后我们拿到一个 map, 主要是为了提升性能哈。这个 map 哪来的呢?就是把远程数据把它映射成一个 map, map 的 键呢就是它的 id, 然后呢值呢?就是个飞机最新的状态 这远程数据的 map 啊,然后我们循环以前的飞机,就是目前现有的飞机,通过飞机的 id 呢,去拿到这个飞机它对应的新的状态,如果说这个飞机有新的状态的话,我们就把它的数据更新啊,更新完了过后呢,就从那个新的状态里边把它删除啊,就表示这个飞机我已经处理完了,不需要了。这个数据 如果说没有新的状态的话,说明啥?说明这个飞机现在已经没有了,对吧?已经没有上传数据了,可能坠毁了,可能因为别的原因,可能已经到达机场了,他就不再上传新的数据了,没有这个新的数据的话,我就把这个飞机移除掉,基本上就是这些逻辑地方嘛,对吧?那么具体的那些什么 api 呀,怎么来遗传那些都小事,随便查啊,查文档也好,查 ai 也好,都能查到的。 然后呢,如果说这个循环完了过后,这个新的状态里面都还有东西,因为我们之前更新了一个状态就移出一个,更新一个就移出一个,对吧?如果说新的状态里边都还剩下东西,是不是新的飞机啊? 新的飞机的话,我们就创建一个新的飞机,给他加进去就完事了啊。所有处理完了过后,那么这个远程数据就消耗完了,消耗完了过后把它设置为闹,那么等待下一次的远程数据装进来,是不是这个逻辑?这样就完事了啊?那咱们来看一下吧。刷新,呃,我们随便找一架飞机啊,呃,就随便找一架那个路径在这,对吧?让他飞 啊,因为基础上的一些瓦片有问题啊。呃,随便换一个国内的吧。国内的飞机啊,走这一块好看一下啊,等它更新十五秒更新一次啊。 好,你看更新了对吧?那么稍微的做了一下修正,那么就完事了啊,好了吧,整个程序呢,就写的差不多了啊,这里边有没有些细枝末节的问题呢?估计还有啊,我没有仔细去看,但是大体上呢肯定是差不多了。那么整个效果呢?我们回顾一下做了哪些东西,做了底图渲染对不对?就是底下的地图,还有包括地上的一些 国家省市区的文字啊,就地图渲染,然后呢就是矢量图层渲染,那么这个玩意就是飞机这个图层,对吧?那么这里涉及到一个远程获取实时数据以及呢一些优化措施,像用 webgl 进行渲染来进行性能优化,那么这两个图层都涉及到 webgl 进行渲染啊,哎,我看一下底图是不是用 webgl 的, 哎呀啊,对,也是用 webgl 的, 呃,然后呢,接下来下面就是那个图层交互来监听事件,根据不同的什么 over 事件啊,点击事件做不同的处理,然后就是图层更新,就是我们这节课讲的。那这四个层面呢,其实就包含了整个地图应用开发的百分之九十以上的功能了,将来同学们做任何的地图开发,其实都是这四个层面的东西, 那么剩下的事情呢,就是靠一做不同项目的一些经验和处理一些细节问题了。像 webdesk 呢,在比面试的过程中呢,往往都是问的一些细节问题问的比较多啊,那么这些细节问题就是开发层面的一些具体的问题的话,在我们的完整的 webdesk 课程里面有详细的讲解啊, 像我们做了一个完整的应用,呃,在前面啊,有前端有后端,有全站的,呃,包括这个 openlayers 项目里边也涉及到,还涉及到一个就是 ui 库,像 elements, ui, elements plus 之类的,跟地图之间如何来进行交互, 还包括在地图上去绘图啊,矩形啊,圆圈啊,对吧?那么这些该怎么来处理?这里边是要大量的细节啊,如果说你要完整的学习 web 技术,要成为一个 web 技术工程师的话,那么一定要来看一下咱们的完整课程啊,还是那句话,找咱们的方式,在咱们账号主页点击头像进入账号主页,根据提示来找咱们就可以了。

这个网站能治好你的旅游瘾,每天挖一个宝藏网站第二期,云旅游 drive and listen, 它把全球一百多个城市全搬到你屏幕上了。想去巴黎点巴黎,想逛纽约点纽约,点开就是当地街道。第一视角实拍 车窗外风景时时流过,本地广播同步响起,伦敦、迪拜、首尔、基辅,城市随时切换,想去哪去哪,不用护照不用机票,打开就用,一分钱不花!你最想去哪个城市兜风?评论区告诉我,关注我,下期还有更绝的!

去见客户,总不能背着沉重的工作站吧?但轻薄本跑个演示都能卡死。我现在的方案是把算力留在家里,把屏幕带在身边。我手搓的这台服务器就是一个私人云主机,我只要在客户面前打开 ipad 或者普通商务本,远程连回我的服务器,那块 p 四零显卡的算力瞬间就能通过网络灌过来。 本地大模型推演、高清视频剪辑。在客户眼里,我用一台平板就全办了。这种举重若轻的底气,是那台在工作室里嗡嗡作响的服务器给的。别再追求什么顶配笔记本了,搞好办公室,算力,你到哪都是高科技团队。如果你也喜欢这手艺,罗秋天带你手搓服务器。

喂,,是做店铺推广吗??是的,请问有什么可以帮到您呢??我想了解一下,做了活动之后,我的店是不是能吸引更多顾客了??是的,老板不仅是店铺地址要宣传好,就连你的联系方式也要多展示,,到时候您的客户就能更方便找到您了。。 做推广会很麻烦吗??只要参加我们的活动,展示店铺特色就能有收获,,效果会持续提升。。太好了,,那你赶紧帮我参与吧。。好的,只要点击视频下方链接,输入相关信息,可了解详情。。


为什么别人的店铺都能在地图上搜索的到,,而我的却搜索不到呢??因为你没做定位啊!,定位可以说是各位老板刚开店第一时间要去做的事情。。 做完定位之后,你能在各大平台上看到自己的店铺位置,,可以把你的店铺定位发布到各大社交平台上来宣传你的店铺。 用户通过定位一键导航到店进行消费,,店铺才能收获源源不断的客人。。还没有做定位的老板们注意了,现在只需要点击视频下方链接,填写你的店铺资料,一次标注,长期有效,快来标注吧!!
