2

我正在使用该方法- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoom inContext:(CGContextRef)context为 iOS 上的 MKOverlay 渲染基于矢量的地图。

我找不到避免多次渲染所有矢量形状而不将它们剪切到发送到上述 drawMapRect... 方法的 mapRects(图块)的好方法。让我解释...

当需要绘制叠加层时,drawMapRect... 会在 MKOverlayRenderer/View 上多次调用。它同时被各种小型 mapRect 瓦片调用。有两种矢量形状不适用于这种处理方式,因此我还没有解决两个问题:

  1. 一个小形状,在技术上完全适合其中一个 mapRect 瓦片,但实际绘制的渲染应该超出该瓦片的边界。例如,绘制的点大于它所代表的点的实际(零)大小,并且通常具有与其相关联的文本标签,该标签远远超出 mapRect 平铺。在这种情况下,它们将被瓦片边界剪裁。目前,我通过为每个图块绘制整个矢量数据集来解决这个问题(即,每次调用 drawMapRect... 方法时)。这看起来不错,但是会大量浪费资源并且会大大减慢速度。

  2. 与许多图块相交的大形状将被绘制多次 - 为每个调用 drawMapRect... 方法的 mapRect 图块绘制一次。我可以(部分)通过仅绘制与传入的 mapRect 磁贴相交的形状来解决这个问题,但是我遇到了上面的问题(1)。当一个大而复杂的矢量形状只需要在屏幕上出现一次时,多次绘制它是一种巨大的资源浪费。

最后,我只想绘制一次所有内容,而不是将内容剪辑到 mapRect 瓷砖上。对于大量复杂的矢量数据,多次绘制所有内容确实会减慢速度。

我不想在每次平移或缩放地图时重复预渲染矢量数据的屏幕。必须有一个“正确”的方法来做到这一点,但我无法弄清楚。

我该怎么办?

特别是,有没有办法避免将 CGContext 中的绘图剪辑到发送到 drawMapRect... 方法的 mapRect 平铺上?

4

0 回答 0