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