Получить часть вида карты в виде изображения в iOS - PullRequest
7 голосов
/ 24 августа 2011

Я создаю приложение, в котором я должен показать только часть области, где на моем месте будет нанесен график, аналогично тому, как показано ниже.

MAp part

Нажав на это изображение, вы перейдете к моему приложению. Но здесь это просто статичное изображение, сгенерированное в зависимости от моей долготы и широты.

Любая помощь будет очень признательна. Спасибо

Ответы [ 7 ]

35 голосов
/ 31 октября 2011

Вот рабочий код. Если кто-нибудь все еще ищет ответ.

NSString *staticMapUrl = [NSString stringWithFormat:@"http://maps.google.com/maps/api/staticmap?markers=color:red|%f,%f&%@&sensor=true",yourLatitude, yourLongitude,@"zoom=10&size=270x70"];    
NSURL *mapUrl = [NSURL URLWithString:[staticMapUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:mapUrl]];

Спасибо

3 голосов
/ 24 февраля 2015

Вы также можете использовать MKMapSnapshotter, это позволяет сделать снимок экрана карты;

MKMapSnapshotOptions * snapOptions= [[MKMapSnapshotOptions alloc] init];
        self.options=snapOptions;
        CLLocation * Location = [[CLLocation alloc] initWithLatitude:self.lat longitude:self.long];
        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(Location.coordinate, 300, 300);
        self.options.region = region;
        self.options.size = self.view.frame.size;
        self.options.scale = [[UIScreen mainScreen] scale];

        MKMapSnapshotter * mapSnapShot = [[MKMapSnapshotter alloc] initWithOptions:self.options];

        [mapSnapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
            if (error) {
                NSLog(@"[Error] %@", error);
                return;
            }

            UIImage *image = snapshot.image;//map image
            NSData *data = UIImagePNGRepresentation(image);

        }];
3 голосов
/ 24 августа 2011

Вы можете попробовать Google Static Maps API

Вот пример кода

NSString *urlString = @"http://maps.googleapis.com/maps/api/staticmap?center=Berkeley,CA&zoom=14&size=200x200&sensor=false";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage *imageData = [UIImage imageWithData:data];
[yourImageView setImage:imageData];

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

1 голос
/ 24 августа 2011

То, что вы хотите сделать, это фундаментальная функциональность API MapKit.Ознакомьтесь с документацией здесь:

http://code.google.com/apis/maps/articles/tutorial-iphone.html

, и один из моих любимых блогов ios имеет учебник mapkit здесь :

0 голосов
/ 23 сентября 2016

Я хотел бы добавить к ответу @DevC, предоставив метод (с блоком завершения), который добавляет аннотацию в середине изображения. Сначала мне было интересно посмотреть, смогу ли я добавить аннотацию до начала снимка, однако MKMapSnapshotter не поддерживает и не поддерживает . Таким образом, решение, которое я придумал, состоит в том, чтобы создать значок, нарисовать его поверх изображения карты, а затем создать другое изображение карты + значок. Вот мой пользовательский метод:

-(void)create_map_screenshot:(MKCoordinateRegion)region :(map_screenshot_completion)map_block {

    // Set the map snapshot properties.
    MKMapSnapshotOptions *snap_options = [[MKMapSnapshotOptions alloc] init];
    snap_options.region = region;
    snap_options.size = // Set the frame size e.g.: custom_view.frame.size;
    snap_options.scale = [[UIScreen mainScreen] scale];

    // Initialise the map snapshot camera.
    MKMapSnapshotter *map_camera = [[MKMapSnapshotter alloc] initWithOptions:snap_options];

    // Take a picture of the map.
    [map_camera startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {

        // Check if the map image was created.

        if ((error == nil) && (snapshot.image != nil)) {

            // Create the pin image view.
            MKAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:nil];

            // Get the map image data.
            UIImage *image = snapshot.image;

            // Create a map + location pin image.
            UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale); {

                [image drawAtPoint:CGPointMake(0.0f, 0.0f)];
                CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);

                // Create the pin co-ordinate point.
                CGPoint point = [snapshot pointForCoordinate:region.center];

                if (CGRectContainsPoint(rect, point)) {

                    // Draw the pin in the middle of the map.
                    point.x = (point.x + pin.centerOffset.x - (pin.bounds.size.width / 2.0f));
                    point.y = (point.y + pin.centerOffset.y - (pin.bounds.size.height / 2.0f));
                    [pin.image drawAtPoint:point];
                }
            }

            // Get the new map + pin image.
            UIImage *map_plus_pin = UIGraphicsGetImageFromCurrentImageContext();

            // Return the new image data.
            UIGraphicsEndImageContext();
            map_block(map_plus_pin);
        }

        else {
            map_block(nil);
        }
    }];
}

Этот метод также требует объявления заголовка завершения следующим образом:

typedef void(^map_screenshot_completion)(UIImage *);

Надеюсь, это пригодится людям, которые хотят добавить аннотации к изображению карты.

0 голосов
/ 10 апреля 2015

Сегодня есть это, без Google: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/MapKit/MapKit.html Найдите код в пункте «Создание снимка карты». Таким образом, результат выглядит совместимым с Apple Maps.

0 голосов
/ 24 августа 2011

Чтобы быть понятным, нет способа получить изображение для определенного местоположения с помощью набора карт.

Вы должны использовать MKMapView, запретить пользователю панорамирование / масштабирование, добавить аннотацию и обрабатывать щелчок по аннотации, чтобы делать все, что вы хотели сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...