4

次のコードは、ユーザーのライブラリ内のすべての写真の 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) 時間かかります)。繰り返す前にシステムに緯度と経度で写真を並べ替えさせることで、このプロセスを促進することはできますか? 関連する画像を返すのにかかる時間を最小限に抑えるには、どのようなアルゴリズムを使用すればよいでしょうか?

4

2 に答える 2

0

ある種の空間インデックスを探しているようです。可能性のリストについては、「空間インデックス」セクションを参照してください: http://en.wikipedia.org/wiki/Spatial_database

于 2013-08-17T19:10:30.760 に答える
0

すべての写真を 1 回反復処理し、既に処理した写真のプロパティの配列を保持する必要があると思います。このようにして、次に反復するときは、新しい写真のみを処理します。

于 2013-08-19T14:31:44.243 に答える