Reading the GPS data from the image returned by the camera in iOS iphone Reading the GPS data from the image returned by the camera in iOS iphone ios ios

Reading the GPS data from the image returned by the camera in iOS iphone


The problem is that since iOS 4 UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; strips the geolocation out. To solve this problem you have to use the original photo path to get access to the full image metadata. With something like this:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {        ALAssetRepresentation *rep = [asset defaultRepresentation];        NSDictionary *metadata = rep.metadata;        NSLog(@"%@", metadata);        CGImageRef iref = [rep fullScreenImage] ;        if (iref) {            self.imageView.image = [UIImage imageWithCGImage:iref];        }    } failureBlock:^(NSError *error) {        // error handling    }];

The output should be something like:

{    ColorModel = RGB;    DPIHeight = 72;    DPIWidth = 72;    Depth = 8;    Orientation = 6;    PixelHeight = 1936;    PixelWidth = 2592;    "{Exif}" =     {        ApertureValue = "2.970854";        BrightnessValue = "1.115874";        ColorSpace = 1;        ComponentsConfiguration =         (            0,            0,            0,            1        );        DateTimeDigitized = "2012:07:14 21:55:05";        DateTimeOriginal = "2012:07:14 21:55:05";        ExifVersion =         (            2,            2,            1        );        ExposureMode = 0;        ExposureProgram = 2;        ExposureTime = "0.06666667";        FNumber = "2.8";        Flash = 24;        FlashPixVersion =         (            1,            0        );        FocalLength = "3.85";        ISOSpeedRatings =         (            200        );        MeteringMode = 5;        PixelXDimension = 2592;        PixelYDimension = 1936;        SceneCaptureType = 0;        SensingMethod = 2;        Sharpness = 2;        ShutterSpeedValue = "3.9112";        SubjectArea =         (            1295,            967,            699,            696        );        WhiteBalance = 0;    };    "{GPS}" =     {        Altitude = "1167.528";        AltitudeRef = 0;        ImgDirection = "278.8303";        ImgDirectionRef = T;        Latitude = "15.8235";        LatitudeRef = S;        Longitude = "47.99416666666666";        LongitudeRef = W;        TimeStamp = "00:55:04.59";    };    "{TIFF}" =     {        DateTime = "2012:07:14 21:55:05";        Make = Apple;        Model = "iPhone 4";        Orientation = 6;        ResolutionUnit = 2;        Software = "5.1.1";        XResolution = 72;        YResolution = 72;        "_YCbCrPositioning" = 1;    };}


We have worked a lot with the camera and UIImagePickerController and, at least up to and including iOS 5.1.1, it does not return location data in the metadata for either photos or videos shot with UIImagePickerController.

It doesn't matter whether location services is enabled for the Camera app or not; this controls the Camera app's use of location services, not the camera function within UIImagePickerController.

Your app will need to use the CLLocation class to get the location and then add it to the image or video returned from the camera. Whether your app can get the location will depend on whether the user authorizes access to location services for your app. And note that the user can disable location services for you app (or entirely for the device) at any time via Settings > Location Services.


You're not using the image data from the camera in the code you've posted, you've generated a JPEG representation of it, which would essentially discard all the metadata. Use image.CGImage like Caleb suggested.

Also:

This is also for a commercial product so I cannot use http://code.google.com/p/iphone-exif/.

The author quite clearly states that commercial licensing is available.