2

このメソッド- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoom inContext:(CGContextRef)contextを使用して、iOS で MKOverlay のベクターベースのマップをレンダリングしています。

上記の drawMapRect... メソッドに送信された mapRects (タイル) にそれらをクリッピングせずに、すべてのベクトル形状を複数回レンダリングすることを回避する良い方法を見つけることができません。説明させてください...

drawMapRect... は、オーバーレイを描画する必要があるときに、MKOverlayRenderer/View で複数回呼び出されます。さまざまな小さな mapRect タイルに対して同時に呼び出されます。この方法ではうまく機能しない 2 種類のベクトル形状があり、そのため、まだ克服していない 2 つの問題があります。

  1. 技術的にはいずれかの mapRect タイル内に完全に収まる小さな形状ですが、実際に描画されるレンダリングはそのタイルの境界を超えて拡張する必要があります。たとえば、ドットは、それが表すポイントの実際の (ゼロ) サイズよりも大きく描画され、多くの場合、mapRect タイルをはるかに超えるテキスト ラベルが関連付けられています。このような場合、それらはタイルの境界によってクリップされます。現在、すべてのタイルのベクトル データのセット全体を描画することでこれを回避しています (つまり、drawMapRect... メソッドが呼び出されるたびに)。これは良さそうに見えますが、リソースを大量に浪費し、処理速度を大幅に低下させます。

  2. 多くのタイルと交差する大きな形状は、drawMapRect... メソッドが呼び出される各 mapRect タイルに対して 1 回、複数回描画されます。渡された mapRect タイルと交差する形状のみを描画することで (部分的に) これを回避できますが、上記の問題 (1) があります。一度だけ画面に表示する必要があるときに、大きくて複雑なベクトル形状を何度も描画するのは、リソースの大幅な浪費です。

最後に、すべてを 1 回だけ描画し、mapRect タイルにクリップされないようにしたいと考えています。すべてを複数回描画すると、大規模で複雑なベクター データ セットの処理速度が大幅に低下する可能性があります。

マップがパンまたはズームされるたびに、ベクター データの画面全体を繰り返しプリレンダリングする必要はありません。これを行うには「正しい」方法が必要ですが、わかりません。

これについてどうすればよいですか?

特に、CGContext への描画が drawMapRect... メソッドに送信される mapRect タイルにクリップされないようにする方法はありますか?

4

0 に答える 0