Saving Geotag info with photo on iOS4.1

后端 未结 6 1351
旧时难觅i
旧时难觅i 2020-12-01 03:21

I am having major issues trying to save a photo to camera roll with geotag info on iOS4.1. I am using following ALAssetsLibrary API:

- (void)writeImageDataTo         


        
6条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-01 03:40

    Here is code to copy all available information from a CLLocation object into the proper format for a GPS metadata dictionary:

    - (NSDictionary *)getGPSDictionaryForLocation:(CLLocation *)location {
        NSMutableDictionary *gps = [NSMutableDictionary dictionary];
    
        // GPS tag version
        [gps setObject:@"2.2.0.0" forKey:(NSString *)kCGImagePropertyGPSVersion];
    
        // Time and date must be provided as strings, not as an NSDate object
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"HH:mm:ss.SSSSSS"];
        [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSTimeStamp];
        [formatter setDateFormat:@"yyyy:MM:dd"];
        [gps setObject:[formatter stringFromDate:location.timestamp] forKey:(NSString *)kCGImagePropertyGPSDateStamp];
        [formatter release];
    
        // Latitude
        CGFloat latitude = location.coordinate.latitude;
        if (latitude < 0) {
            latitude = -latitude;
            [gps setObject:@"S" forKey:(NSString *)kCGImagePropertyGPSLatitudeRef];
        } else {
            [gps setObject:@"N" forKey:(NSString *)kCGImagePropertyGPSLatitudeRef];
        }
        [gps setObject:[NSNumber numberWithFloat:latitude] forKey:(NSString *)kCGImagePropertyGPSLatitude];
    
        // Longitude
        CGFloat longitude = location.coordinate.longitude;
        if (longitude < 0) {
            longitude = -longitude;
            [gps setObject:@"W" forKey:(NSString *)kCGImagePropertyGPSLongitudeRef];
        } else {
            [gps setObject:@"E" forKey:(NSString *)kCGImagePropertyGPSLongitudeRef];
        }
        [gps setObject:[NSNumber numberWithFloat:longitude] forKey:(NSString *)kCGImagePropertyGPSLongitude];
    
        // Altitude
        CGFloat altitude = location.altitude;
        if (!isnan(altitude)){
            if (altitude < 0) {
                altitude = -altitude;
                [gps setObject:@"1" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef];
            } else {
                [gps setObject:@"0" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef];
            }
            [gps setObject:[NSNumber numberWithFloat:altitude] forKey:(NSString *)kCGImagePropertyGPSAltitude];
        }
    
        // Speed, must be converted from m/s to km/h
        if (location.speed >= 0){
            [gps setObject:@"K" forKey:(NSString *)kCGImagePropertyGPSSpeedRef];
            [gps setObject:[NSNumber numberWithFloat:location.speed*3.6] forKey:(NSString *)kCGImagePropertyGPSSpeed];
        }
    
        // Heading
        if (location.course >= 0){
            [gps setObject:@"T" forKey:(NSString *)kCGImagePropertyGPSTrackRef];
            [gps setObject:[NSNumber numberWithFloat:location.course] forKey:(NSString *)kCGImagePropertyGPSTrack];
        }
    
        return gps;
    }
    

    Assign the dictionary returned by this method as the value for the kCGImagePropertyGPSDictionary key in the metadata dictionary you pass to writeImageDataToSavedPhotosAlbum:metadata:completionBlock: or CGImageDestinationAddImage().

提交回复
热议问题