次のコードでloadTileAtPath:result:
メソッドをオーバーライドしています。MKTileOverlay
単純にMKTileOverlayPath
を MKMapRect に変換し、それを使用MKMapSnapshotter
して、見ているマップ エリアのスナップショットを取得します。そこから、マップの画像を使用してさらに作業を行います。しかし今のところ、結果のデータとしてスナップショットを返すだけなので、スナップショットがマップをどれだけうまく表しているかを確認できます。
- (void)loadTileAtPath:(MKTileOverlayPath)path
result:(void (^)(NSData *data, NSError *error))result
{
double divisions = pow(2, (float)path.z);
MKMapSize tileSize = MKMapSizeMake(MKMapSizeWorld.width / divisions, MKMapSizeWorld.height / divisions);
MKMapPoint tilePoint = MKMapPointMake(path.x * tileSize.width, path.y * tileSize.height);
MKMapRect tileRect = MKMapRectMake(tilePoint.x, tilePoint.y, tileSize.width, tileSize.height);
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
options.mapRect = tileRect;
options.size = CGSizeMake(tileSize.width, tileSize.height);
options.showsBuildings = NO;
options.showsPointsOfInterest = NO;
options.mapType = MKMapTypeStandard;
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
result(UIImagePNGRepresentation(snapshot.image), nil);
}];
}
ここでの計算がすべて正しいとすると、理論上は完全なマップが表示されるはずです。代わりに、次のように表示されます。
そして、これはそれがどのように見えるかです (下の地図はどのように見えるか):