Используйте следующий уровень масштабирования для растровых плиток с низким разрешением в Mapbox, чтобы получить растровые плитки с высоким разрешением

IOS MKMapView, если вы предоставите ему растровый источник размером 256x256 пикселей, загрузит четыре тайла той же области с +1 уровнем масштабирования. Поэтому кажется, что плитки находятся в режиме высокого разрешения. Потрясающие!

Теперь у меня есть приложение, использующее сторонний источник растровых плиток. Проблема в том, что данные выглядят ужасно с низким разрешением.

Есть ли способ сообщить Mapbox, что он должен загружать следующий уровень масштабирования каждой плитки данного источника и использовать его вместо этого?

Таким образом, вместо загрузки плитки 0/0/0.jpg для всего мира он должен загружать 1/0/0.jpg, 1/1/0.jpg, 1/0/1.jpg и 1/1/1.jpg и использовать их для уровня масштабирования 0. Таким образом, в основном вместо одного изображения 256x256 у него будет четыре из них, давая ему изображение 512x512, которое выглядит намного четче.

Возникает вопрос ... есть ли способ сделать это не только для iOS, но и в описании источника? Чтобы он работал и для Интернета, и для Android?


person Georg    schedule 26.08.2019    source источник
comment
Как выглядит URL-адрес вашего запроса для ваших изображений?   -  person BDD    schedule 26.08.2019
comment
Это обычный URL с {z}/{x}/{y}.jpg в конце. Но я думаю, это не повлияет на ответ, верно?   -  person Georg    schedule 27.08.2019
comment
Это действительно помогает. Я поставлю свой ответ ниже.   -  person BDD    schedule 27.08.2019


Ответы (2)


Вы можете запросить плитку 512X512 у Mapbox, используя флаг @2x в вашем запросе как для Растровые и векторные плитки

Ваш запрос должен выглядеть так. Обратите внимание на @2x прямо перед строкой запроса:

https://api.mapbox.com/v4/mapbox.satellite/1/0/[email protected]?access_token={access_token}
person BDD    schedule 27.08.2019
comment
Да ... но мой URL-адрес не предлагает изображения размером 512 пикселей ... Только 256 ... И я хотел бы знать, можно ли каким-то образом указать Mapbox для повышения их масштаба, объединив 4 плитки в одну ... - person Georg; 28.08.2019
comment
О, я вижу. Думаю, я неправильно понял ваш первоначальный вопрос. Плитки, которые вы получаете от третьей стороны, имеют низкое разрешение, да? - person BDD; 28.08.2019
comment
Точно. И Apple-Maps пойдет дальше и вместо того, чтобы получать, например, одна плитка для уровня масштабирования 10, она автоматически выбирает 4 плитки для уровня масштабирования 11 и сшивает их с одной большой плиткой для уровня масштабирования 10 ... Было бы здорово иметь возможность сделать то же самое с mapbox - person Georg; 28.08.2019

Почему бы просто не масштабировать изображение 256 в подклассе наложения плитки?

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *, NSError *))result {

    if (!result) {
        return;
    }

    self.tileSize = CGSizeMake(512, 512);

    NSString *URLString = [self.internalTemplate stringByReplacingOccurrencesOfString:@"{x}" withString:[NSString stringWithFormat:@"%li", (long)path.x]];
    URLString = [URLString stringByReplacingOccurrencesOfString:@"{y}" withString:[NSString stringWithFormat:@"%li", (long)path.y]];
    URLString = [URLString stringByReplacingOccurrencesOfString:@"{z}" withString:[NSString stringWithFormat:@"%li", (long)path.z]];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        if (error) {
            NSLog(@"%@", error);
        }

        UIImage *image = [UIImage imageWithData:data];
        UIImage *resized = [self imageWithImage:image scaledToSize:CGSizeMake(512, 512)];

        result(UIImagePNGRepresentation(resized), error);

    }];
    [task resume];

}

- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 1.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
person Nic Hubbard    schedule 20.05.2020