2014-11-05 30 views
6

Tôi gặp khó khăn vì tôi muốn trích xuất tọa độ GPS từ ảnh. Tôi sử dụng hàm imagePickerController:didFinishPickingMediaWithInfo để chọn hình ảnh và tôi chèn hình ảnh đó vào bộ sưu tậpXem bằng cách sử dụng khung Ảnh mới. Tôi muốn trích xuất tọa độ GPS từ ảnh. Tôi đã thực hiện một số nghiên cứu và tôi nhận thức được thực tế là UIImage không chứa tất cả siêu dữ liệu, vì vậy tôi đã thử sử dụng khung công tác AssetsLibrary. Bên didFinishPickingMediaWithInfo Tôi đang sử dụng đoạn mã sau để trích xuất các vị trí ảnh:Trích xuất dữ liệu GPS từ ảnh

var referenceURL : NSURL = info.objectForKey(UIImagePickerControllerReferenceURL) as NSURL 
    var library : ALAssetsLibrary = ALAssetsLibrary() 
    library.assetForURL(referenceURL, resultBlock: { (asset : ALAsset!) -> Void in 
     var rep : ALAssetRepresentation = asset.defaultRepresentation() 
     var metadata : NSDictionary = rep.metadata() 


     let location: AnyObject! = asset.valueForProperty(ALAssetPropertyLocation) 
     if location != nil { 
      println(location) 
     } 
     else 
     { 
      println("Location not found") 
     } 


     }) 
    { 
      (error : NSError!) -> Void in 
    } 

Tuy nhiên, nó không tìm ra địa điểm, mặc dù tôi đã kiểm tra các hình ảnh và nó chứa siêu dữ liệu EXIF ​​(nó chứa cũng GPS địa điểm, mà tôi quan tâm). Làm thế nào tôi có thể lấy các tọa độ từ ảnh?

Trả lời

6

Tôi tìm thấy một giải pháp sử dụng đoạn mã sau:

if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary 
    { 
     if let currentLat = pickedLat as CLLocationDegrees? 
     { 
      self.latitude = pickedLat! 
      self.longitude = pickedLong! 
     } 
     else 
     { 
     var library = ALAssetsLibrary() 
     library.enumerateGroupsWithTypes(ALAssetsGroupAll, usingBlock: { (group, stop) -> Void in 
       if (group != nil) { 

       println("Group is not nil") 
       println(group.valueForProperty(ALAssetsGroupPropertyName)) 
       group.enumerateAssetsUsingBlock { (asset, index, stop) in 
        if asset != nil 
        { 
        if let location: CLLocation = asset.valueForProperty(ALAssetPropertyLocation) as CLLocation! 
        { let lat = location.coordinate.latitude 
         let long = location.coordinate.longitude 

         self.latitude = lat 
         self.longitude = lat 

         println(lat) 
         println(long) 
         } 
        } 
       } 
      } else 
       { 
       println("The group is empty!") 
       } 
      }) 
      { (error) -> Void in 
       println("problem loading albums: \(error)") 
     } 
    } 
} 

Những gì nó là nó đọc toàn bộ album và in vị trí nếu ảnh có tài sản đó, nếu không nó sẽ in "vị trí không tìm thấy". Nó làm như vậy cho mỗi bức ảnh trong album. Vì vậy tôi có một câu hỏi khác ... Tôi muốn hiển thị thông tin vị trí chỉ cho bức ảnh mà tôi đã chọn, không phải cho toàn bộ album. Có ai có một đầu mối làm thế nào điều này có thể được thực hiện?

+0

Có cùng một vấn đề, bạn có tìm cách sửa chữa không? – TimWhiting

4
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 

    if picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary { 

     let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
     pickedImage.image = image 

     let url = info[UIImagePickerControllerReferenceURL] as! NSURL 
     let library = ALAssetsLibrary()   
     library.assetForURL(url, resultBlock: { (asset) in 
      if let location = asset.valueForProperty(ALAssetPropertyLocation) as? CLLocation { 

       self.latitude = location.coordinate.latitude 
       self.longitude = location.coordinate.longitude 
      } 
      }, failureBlock: { (error: NSError!) in 
       print("Error!") 
     }) 
    } 

    self.dismissViewControllerAnimated(true, completion: nil) 
} 

Cuối cùng quản lý để đạt được điều này sau khi thử nhiều cách khác nhau, nó được tham chiếu kém trong tài liệu hướng dẫn táo (hoặc tôi không thể tìm thấy nó). Rất tiếc, bất kỳ hình ảnh nào không được chụp qua ứng dụng "máy ảnh" cổ phiếu đều không có xu hướng có siêu dữ liệu vị trí. Nhưng nó hoạt động tốt khi họ làm.

Got câu trả lời từ https://stackoverflow.com/a/27556241/4337311

+0

Xin chào, chỉ cần xem qua câu hỏi của bạn. Mã bạn cung cấp tương tự như mã tôi đã sử dụng, sử dụng url hình ảnh và sau đó tôi đã viết một khối kết quả như sau: var resultBlock: ALAssetsLibraryAssetForURLResultBlock = {(myAsset: ALAsset!) -> Void in} Sau đó, sau 'in' bạn sẽ – Cristian

+0

Xin chào Christian, tôi đã thêm câu trả lời vì bạn đã tự hỏi câu trả lời cho câu hỏi về cách chỉ truy cập siêu dữ liệu của hình ảnh cá nhân chứ không phải toàn bộ album. Vui mừng bạn đã có ở đó cuối cùng anyway – TimWhiting

+1

này chỉ hoạt động cho những hình ảnh có trong PhotoLibrary. những gì về máy ảnh – hussain

8

ALAssetsLibrary bị phản đối trong iOS 10. May mắn thay, với hình ảnh khuôn khổ, đây là tầm thường để thực hiện. Khi imagePickerController(_ picker:, didFinishPickingMediaWithInfo) được gọi, bạn có thể truy xuất thông tin vị trí thông qua tra cứu đơn giản. Hãy xem mã bên dưới:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let URL = info[UIImagePickerControllerReferenceURL] as? URL { 
     let opts = PHFetchOptions() 
     opts.fetchLimit = 1 
     let assets = PHAsset.fetchAssets(withALAssetURLs: [URL], options: opts) 
     let asset = assets[0] 
     // The location is "asset.location", as a CLLocation 

// ... Other stuff like dismiss omitted 
} 

Hy vọng điều này sẽ hữu ích. Đây là Swift 3, tất nhiên ..

+0

Bạn đã thử điều này khi sử dụng máy ảnh? Khi tôi cố gắng truy cập vào 'thông tin [UIImagePickerControllerReferenceURL] là? URL' luôn luôn trở lại nil. Tôi có các yêu cầu về trình quản lý vị trí được đáp ứng trong tệp Info.plist của tôi và nhắc người dùng truy cập vị trí của họ khi sử dụng. Nó vẫn luôn luôn trở lại nil. –

+0

bạn có thể cung cấp mã với ví dụ –

+0

@MattLong có tôi đã làm, và nó hoạt động tốt. Xem https://gist.github.com/sumitlni/6421aece205ebefa647abe701d2429e0 để biết ý kiến ​​- đó là một ViewController mà bạn có thể nhúng vào một ứng dụng mẫu để xem mã đang hoạt động. Điều này đã được thử nghiệm thành công trên thiết bị. – LNI

Các vấn đề liên quan