91 lines
3.3 KiB
Objective-C
91 lines
3.3 KiB
Objective-C
//
|
|
// NSMutableDictionary+ImageMetadata.m
|
|
// RCTCamera
|
|
//
|
|
// Created by Jehan Tremback on 7/10/15.
|
|
//
|
|
//
|
|
|
|
#import <Foundation/Foundation.h>
|
|
#import <ImageIO/ImageIO.h>
|
|
|
|
@interface NSMutableDictionary(ImageMetadata)
|
|
- (void)mergeMetadata:(NSDictionary *)inputMetadata;
|
|
@end
|
|
|
|
@implementation NSMutableDictionary(ImageMetadata)
|
|
|
|
- (void)mergeMetadata:(NSDictionary *)inputMetadata {
|
|
NSDictionary *inputMetadataLocation = [inputMetadata objectForKey:@"location"];
|
|
if (inputMetadataLocation) {
|
|
// Add GPS stuff
|
|
[self setObject:[self getGPSDictionaryForLocation:inputMetadataLocation] forKey:(NSString *)kCGImagePropertyGPSDictionary];
|
|
}
|
|
}
|
|
|
|
- (NSMutableDictionary *)getGPSDictionaryForLocation:(NSDictionary *)location {
|
|
NSMutableDictionary *gps = [NSMutableDictionary dictionary];
|
|
NSDictionary *coords = [location objectForKey:@"coords"];
|
|
// GPS tag version
|
|
[gps setObject:@"2.2.0.0" forKey:(NSString *)kCGImagePropertyGPSVersion];
|
|
|
|
// Timestamp
|
|
double timestamp = floor([[location objectForKey:@"timestamp"] doubleValue]);
|
|
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp];
|
|
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
|
[formatter setDateFormat:@"HH:mm:ss.SSSSSS"];
|
|
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
|
|
[gps setObject:[formatter stringFromDate:date] forKey:(NSString *)kCGImagePropertyGPSTimeStamp];
|
|
[formatter setDateFormat:@"yyyy:MM:dd"];
|
|
[gps setObject:[formatter stringFromDate:date] forKey:(NSString *)kCGImagePropertyGPSDateStamp];
|
|
|
|
// Latitude
|
|
double latitude = [[coords objectForKey:@"latitude"] doubleValue];
|
|
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
|
|
double longitude = [[coords objectForKey:@"longitude"] doubleValue];
|
|
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
|
|
double altitude = [[coords objectForKey:@"altitude"] doubleValue];
|
|
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
|
|
double speed = [[coords objectForKey:@"speed"] doubleValue];
|
|
if (speed >= 0){
|
|
[gps setObject:@"K" forKey:(NSString *)kCGImagePropertyGPSSpeedRef];
|
|
[gps setObject:[NSNumber numberWithFloat:speed*3.6] forKey:(NSString *)kCGImagePropertyGPSSpeed];
|
|
}
|
|
|
|
// Heading
|
|
double heading = [[coords objectForKey:@"heading"] doubleValue];
|
|
if (heading >= 0){
|
|
[gps setObject:@"T" forKey:(NSString *)kCGImagePropertyGPSTrackRef];
|
|
[gps setObject:[NSNumber numberWithFloat:heading] forKey:(NSString *)kCGImagePropertyGPSTrack];
|
|
}
|
|
|
|
return gps;
|
|
}
|
|
@end
|