2

次のコードで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);
    }];
}

ここでの計算がすべて正しいとすると、理論上は完全なマップが表示されるはずです。代わりに、次のように表示されます。

ここに画像の説明を入力

そして、これはそれがどのように見えるかです (下の地図はどのように見えるか):

ここに画像の説明を入力

4

1 に答える 1