【发布时间】:2013-02-07 19:51:28
【问题描述】:
我必须在 iOS5/6 (iPhone) 上实现一个非常自定义的平铺地图图层/视图,它将图块作为图像和/或数据 (JSON) 从服务器加载。它就像谷歌地图,但在某些方面非常具体,所以我不能轻易使用解决方案,例如:
- 谷歌地图或
- route-me(由 MapBox 使用)
-
CATiledLayer结合UIScrollView
问题是:由于我的具体规格,没有任何解决方案能真正帮助我。如果你觉得有合适的解决方案,请告诉我!!!
如果不是:
帮我找到适合我的情况的最佳解决方案!!!
“但是为什么我不能使用这些漂亮的解决方案呢?”
有一些限制,必须知道:
我们只使用 3 个缩放级别(0,1 和 2)
每个图块在下一个缩放级别中都有 9 个子图块(= 缩放系数 3)(不像大多数其他工具包那样4 个子图 = zoomfactor 2)
第一层的初始大小为 768*1024。
第二层是三倍宽和高(zoomfactor 3!!!)-> 2304*3072
第三层同样比第二层更宽更高 -> 6912*9216来自服务器的每个图块都是 256x256 像素
所以每个子层是瓦片数量的 9 倍(第 1 层 12 个,第 2 层 108 个,第 3 层 972 个)
每个图块都有一个背景图像(大小约为 6KB)(从服务器作为图像加载)和前景信息(从服务器为每个图块加载为 JSON - 大小为 10-15KB)
-> 前景信息 JSON 包含叠加图像(例如 google 中的流量)或要绘制到本地图块坐标空间中的本地图块信息(如注释,但每个图块)我想将整个背景图块缓存在磁盘上,因为它们永远不会改变
我想将每个图块的叠加图块图像/叠加图块信息缓存一段时间,直到再次重新加载为止
应通过捏合和双击进行缩放
我的一些考虑:
缓存不是问题。我通过 CoreData 或类似工具来完成
我想到了一个 UIScrollView,用来显示平滑滚动
我想使用捏合,所以每次突破下一个缩放级别时,我都必须绘制下一个缩放级别的图块
内容只能在可见区域中绘制(对于 iPhone 5 320x500 上的我而言)
应删除不可见的图块,以提高内存效率。但不应立即删除它们,只有当图块远离可见中心一定数量的像素/点时。应该有一个“显示缓存”,以即时显示刚刚加载和显示的图块。还是有更好的技术?
我可以立即从磁盘或从服务器异步加载背景,因为我知道哪些图块是可见的。我对 tile-JSON 也是如此。然后我提取图块的 JSON 信息(“是覆盖直接图像或诸如城市名称之类的信息,我必须将其绘制到图块中”)并绘制或加载覆盖(从数据库/光盘或服务器)
UIScrollView 的效率是否足以处理平铺视图的最大尺寸
我应该使用 CALayer 作为子图层来绘制吗?我应该使用 Quartz 直接在大“画布”上绘画吗?
现在轮到你了!!!
【问题讨论】:
-
不能投票结束,因为这个问题有赏金,但这个问题太宽泛了。你应该问具体的事情,而不是列出十几个要求。
标签: ios uiscrollview maps catiledlayer