MKMapSnapshotter в MKTileOverlay выглядит смещенным

Я переопределяю 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);
    }];
}

Учитывая, что математика здесь верна, теоретически она должна отображать идеальную карту. Вместо этого он отображает это:

введите описание изображения здесь

И вот как это должно выглядеть (как выглядит карта ниже):

введите описание изображения здесь

0 ответов

Сообщение "Bad MKMapSnapshotOptions" скорее всего из-за неправильного sizeв опциях. Размер не может быть слишком большим (кажется, 5000 пикселей - это нормально, но 1000 пикселей слишком велико). Размер также не может иметь субпиксельных размеров, поэтому значение 123,4 пикселя недопустимо. Убедитесь, что вы используете round() когда вы производите размер.

Другие вопросы по тегам