mapbox-developer-group / Mapbox-Tech-Q-A

在提问之前请自行查看文档哦,养成好习惯:https://docs.mapbox.com/
32 stars 1 forks source link

[IOS] 地图的缓存机制是什么? #20

Open songyuyang0918 opened 4 years ago

songyuyang0918 commented 4 years ago

场景: 我有3个自己的数据源, 一个影像,一个矢量,一个路线透明层+影像底图. 影像、矢量我使用了json文件,通过styleUrl去加载它. 路线透明层使用rasterLayer去加载它. 添加一个交互按钮让用户去选择显示哪个地图数据.

问题: 我现在想要知道Mapbox分别会对styleUrl底图进行缓存吗? rasterLayer会缓存吗? 缓存的时间或者机制是什么呢? 我想要关闭Mapbox的在线取图功能,有这样的属性吗? 一开始使用在线去滑动地图进行缓存,如果我关闭了在线取图或者断开网络, 比如当前显示的是矢量数据,如果我替换成影像数据,而且已经关闭的在线功能,Mapbox能读取的我影像数据缓存吗? 还是说,如果一开始我加载的是矢量数据,在我替换成影像数据之后, mapbox的缓存机制会将之前缓存的矢量数据替换成影像数据?

基于我上面的场景,有人会给我提出一些好的方法吗? 非常感谢给予帮助的各位!

songyuyang0918 commented 4 years ago

我使用断开网络来测试它,styleUrl和MGLRasterTileSource 均有缓存, 并且我每次切换都会删除MGLRasterTileSource和MGLRasterStyleLayer, 那么我推测Mapbox根据Url缓存了他们,不论是styleUrl还是Source, 不知道我所说是否正确? 如果正确, 它将缓存多长时间? 什么时候会被覆盖?

由于Mapbox封装很严谨,看不到它的底层,我好像只能使用它,并修改不了它加载瓦片的任何逻辑?

goldenlimit commented 4 years ago

@songyuyang0918 根據文檔的說明,緩存的更新與否, 是基於網絡週期性的發送請求,基於Http回覆請求的header Cache-Control or _Expires_來決定是否繼續使用緩存還是去下載新的數據。一旦有更新的數據,Tile圖層才會被更新。

https://docs.mapbox.com/help/troubleshooting/mobile-offline/#updating-offline-resources

If the device has network connectivity, the Maps SDK for Android or iOS will make periodic network requests to revalidate cached tiles and other resources if the Cache-Control or Expires HTTP response headers have expired. If an updated resource is available, it will replace the older version in the offline database.

When the SDK automatically updates offline map tiles, the offline region is not re-download from scratch. The offline tile update process is the same process as with regular map tiles: The map tile's only downloaded if there's a new version of that tile.

songyuyang0918 commented 4 years ago

@goldenlimit 谢谢您的回复. 您所说的是Mapbox有自己的更新机制. 在这些文档中,我明确一点缓存是伴随着项目一直存在的. 但我还有些分不清楚,它所说的6000瓷砖限制是地图的缓存还是MGLOfflineStorage这个类的下载? 还是说两者的意思是一样的? 我想知道Mapbox的地图缓存也是离线地图的一部分吗? 我一直的理解是通过网络请求自己的数据瓷砖是存到了cache当中, 而Mapbox的MGLOfflineStorage类需要指定下载某块区域的地图, 我认为两者不是一个东西.

另外,您知道Mapbox有属性可以关闭在线网络取图吗? 我在MGLMapbox中没有找到相关的属性. 谢谢!

canglaoshidaidui commented 4 years ago

我是隔壁做android,但是我想android和iso的缓存机制应该是相同的,所以就冒昧的回答您的问题了!我觉得可以通过 地图请求的拦截器去拦截数据请求,然后把它转发本地去处理。这样其实就变相绕开了mapbox自己的缓存方式。 比如我们要下载 某个地方的离线影像,就可以自己通过程序去计算瓦片的行列号,然后通过轮询去下载数据;要想要加载离线影像,只要将请求拦截,走本地方法去构建http请求的响应体就行了。 这些功能(离线影像)我再android端都已经实现了。在回答您问题前还特意试了一下,(有一点得注意下,mapbox 默认在android没网的时候是不会走网络请求的,好在mapbox for android sdk给了方法去设置,使得在没网时候也可以走http。ISO要注意)。但是其他复杂一些的数据比如 标注的字体,图片填充的缓存,还没来得急研究....希望可以给您一点点启示。

toplchx commented 4 years ago

既然你要用自己的数据源并且关闭mapbox的图,那为什么还要用mapbox的SDK呢,用leaflet这种第三方的地图控件不就行了吗

songyuyang0918 commented 4 years ago

@canglaoshidaidui 感谢隔壁的安卓同学来此给予帮助, 在我对ios sdk的理解中, 如果我能找到监听瓦片加载的方法获取xyz, 和添加单一瓦片块的方法, 当然可以实现灵活性极强的取图方式. 但我在使用过程中, 能通过json文件配置自己的数据源来将自己的底图数据展示出来,已经是很不错了. 我看不到它的实现过程.

@toplchx 感谢您的回复, 我之前使用WhirlyGlobe开源框架, 只是因为需要wms,wmts,wfs(虽然Mapbox不支持..) ,才尝试Mapbox的, 像您所说的leaflet, 我查看它好像并没有IOS的开发API