次のコードは、ユーザーのライブラリ内のすべての写真の EXIF データを正常にチェックし、特定の場所に地理的に近接して撮影された写真の配列と、NSDate
最近撮影された写真の配列を完了ブロックに渡します。その場所で。
- (void)getPhotosAtLocation:(CLLocation *)location withCompletionBlock:(void (^)(NSError *, NSDate *, NSMutableArray *))completionBlock {
NSMutableArray *photos = [NSMutableArray array];
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
__block NSDate *latestDate = [[NSDate alloc] initWithTimeIntervalSince1970:0];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
ALAssetRepresentation *representation = [result defaultRepresentation];
NSDictionary *imageMetadata = [representation metadata];
NSLog(@"%@", imageMetadata);
//analyze location
if ([imageMetadata objectForKey:@"{GPS}"]) {
double latitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Latitude"] doubleValue];
if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LatitudeRef"] isEqualToString:@"S"])
latitude *= -1;
double longitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Longitude"] doubleValue];
if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LongitudeRef"] isEqualToString:@"W"])
longitude *= -1;
if (fabs(location.coordinate.latitude - latitude) <= 0.0005 && fabs(location.coordinate.longitude - longitude) <= 0.0005)
[photos addObject:[UIImage imageWithCGImage:[result thumbnail]]];
//analyze last time at location
if ([imageMetadata objectForKey:@"{TIFF}"]) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];
NSDate *tempDate = [[NSDate alloc] init];
tempDate = [formatter dateFromString:[[imageMetadata objectForKey:@"{TIFF}"] objectForKey:@"DateTime"]];
if ([tempDate compare:latestDate] == NSOrderedDescending) {
latestDate = tempDate;
}
}
}
}
}];
if ([latestDate isEqualToDate:[NSDate dateWithTimeIntervalSince1970:0]])
completionBlock(nil, [NSDate date], photos);
else
completionBlock(nil, latestDate, photos);
} failureBlock:^(NSError *error) {
completionBlock(error, nil, nil);
}];
}
私が直面している問題は、特定の場所で撮影されたすべての写真を見つけるために、ユーザーのカメラロール内のすべての写真を線形に反復する必要があることです (O(n) 時間かかります)。繰り返す前にシステムに緯度と経度で写真を並べ替えさせることで、このプロセスを促進することはできますか? 関連する画像を返すのにかかる時間を最小限に抑えるには、どのようなアルゴリズムを使用すればよいでしょうか?