IPhone Получить UIImagePickerController Lat/Lng
Я использую UIImagePickerController
, чтобы сделать снимок, а затем загрузить фотографию в WCF Service
. Наряду с изображением мне также нужно отправить на широту и долготу фотографии.
Как я могу получить эту информацию из сделанной фотографии?
Я искал в Интернете, но не могу найти хороший источник информации. Я видел данные EXIF
, которые передаются через ключ UIImagePickerControllerMediaMetadata
как часть метода делегата didFinishPickingMediaWithInfo
. Однако, когда я распечатываю содержимое в журнале, информация о местоположении отсутствует.
Я что-то упустил, мне нужно включить службы определения местоположения до съемки? Или есть другой способ получить информацию?
Большое спасибо.
Ответы
Ответ 1
Я понял это на пару дней и, наконец, получил решение. Как уже было предложено, вы можете использовать ALAssetsLibrary.
Сборщик изображений предоставит вам словарь, который содержит URL-адрес, указывающий на актив.
Метод ALAssetsLibrary assetForURL: resultBlock: failureBlock:
использует блоки. Подробнее о них вы можете узнать из примера здесь.
Таким образом, мы обрабатываем информацию, предоставленную сборщиком:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) {
// We'll store the info to use in another function later
self.imageInfo = info;
// Get the asset url
NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];
// We need to use blocks. This block will handle the ALAsset that returned:
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
// Get the location property from the asset
CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation];
// I found that the easiest way is to send the location to another method
[self handleImageLocation:location];
};
// This block will handle errors:
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"Can not get asset - %@",[myerror localizedDescription]);
// Do something to handle the error
};
// Use the url to get the asset from ALAssetsLibrary,
// the blocks that we just created will handle results
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:url
resultBlock:resultblock
failureBlock:failureblock];
}
[picker dismissModalViewControllerAnimated:YES];
[picker release];
}
И далее метод, который обрабатывает данные изображения и местоположения:
- handleImageLocation:(CLLocation *)location
{
UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
// Do something with the image and location data...
}
И, конечно, вы также можете получить другую информацию об изображении с помощью этого метода, используя клавиши:
ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs
Ответ 2
Новое с iOS 8
Было сложно с ALAssetLibrary, которая теперь устарела, используйте Photos.Framework.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil)
if let asset = fetchResult.firstObject as? PHAsset
{
print(asset.location)
}
}
}
Быстро и просто:)
Ответ 3
Это, наверное, "ошибка". A UIImagePickerViewController
не будет возвращать данные местоположения выбранных вами изображений: как вы обнаружили, они удалены из метаданных.
Однако, если вы используете ALAssetLibrary
, чтобы получить ваши изображения, вы можете получить данные о местоположении (в виде объекта CLLocation
, связанного с изображением). В этом вопросе есть какой-то код - проблема iphone image ALAsset - это поможет вам получить ALAsset
от UIImagePickerController
.
Конечно, это было бы проще, если бы вы могли сразу получить эту информацию от сборщика сразу, поэтому рассмотрите вопрос о подаче запроса функции с Apple.
Ответ 4
Поскольку ваш тип источника будет UIImagePickerControllerSourceTypeCamera
, это очень сильно расстраивает, как вы уже знаете. Информация о местоположении представляется МВД.
В качестве альтернативы UIImageWriteToSavedPhotosAlbum()
(который не относится к сохраненному изображению) я пробовал ALAssetsLibrary и -writeImageToSavedPhotosAlbum:metadata:completionBlock:
(используя UIImagePickerControllerMediaMetadata
, чтобы заполнить его, надеясь, что структура заполнит в пробелах с информацией о местоположении).
Увы, нет такой удачи. Несмотря на то, что этот метод возвращает URL-адрес сохраненного изображения, я все равно не могу получить от него информацию ALAssetPropertyLocation
. Даже если я использую вариант ориентации метода сохранения, это бесполезно.
В этот момент я думаю, что единственным средством обращения будет включение вашей информации о местоположении, как описано здесь.
Кажется немного подозрительным, что я должен был бы сделать это, однако, как я ожидал бы, что каркас будет обрабатывать это для вас автоматически. Фактически, я даже не могу получить информацию о местоположении для ранее сделанных фотографий. Это со всеми разрешениями, предоставляемыми во всех необходимых местах, независимо от того, какое устройство я использую, iPhone или iPad. (Даже приложение камеры имеет правильное разрешение, FWIW.)