使用Paperclip从图片中获取GPS元数据

13
我有一个关于Paperclip的问题。许多现代相机和手机会在拍照时添加GPS元数据:

geotagging

我的Rails应用程序用户可以上传照片并手动添加位置数据。然而,这很麻烦,因为用户不想输入:他们希望信息能够 自动存在。
使用Paperclip和Ruby on Rails,我如何获取照片(始终为JPEG格式)中的GPS元数据?是否可以使用Paperclip进行操作,还是需要另一个gem?
4个回答

18

您需要做的是能够从图片中提取EXIF信息

有一个旨在完成这项任务的宝石库:exifr

您可以使用以下Bundler行自动安装它:

gem 'exifr'

编辑:

我个人已经切换到这个同样的宝石的分支,其中包含GPS助手:

gem 'exifr', :git => 'git://github.com/picuous/exifr.git'

使用示例:

EXIFR::JPEG.new('IMG_6841.JPG').gps?                # => true
EXIFR::JPEG.new('IMG_6841.JPG').gps                 # => [37.294112,-122.789422]
EXIFR::JPEG.new('IMG_6841.JPG').gps_lat             # => 37.294112
EXIFR::JPEG.new('IMG_6841.JPG').gps_lng             # =>-122.789422

如果使用由Carrierwave上传并存储在S3上的远程资源,这该如何处理?如果传递完整的URL是否可行? - amaseuk
@amaseuk 我可能错了,但我认为你只能在本地文件中使用它。不过试一下并让我们知道结果。 - Arnaud Leymet
我想指出的是,现在的“官方”gem也有GPS助手 :) - Automatico

1

你不能使用Paperclip完成它。Rmagick也无法帮助你。我唯一看到的方法是:

raw_props = %x[identify -format '%[exif:*]' #{path_to_image}].split("\n").collect{|a| a.split("=")}
properties = Hash[*raw_props.collect { |v| [v, v*2]}.flatten]

(前提:已安装imagemagick并在路径中,可通过“which identify”进行检查)


1

对上面接受答案的更新做一个补充,它大大帮助了我让EXIFR工作,但是有一些问题:

  1. 要检查图像是否具有GPS,我必须使用 EXIFR::JPEG.new('IMG_6841.JPG').exif?

  2. 要获取纬度,我使用了 EXIFR::JPEG.new('IMG_6841.JPG').gps_latitude

  3. 经度是 EXIFR::JPEG.new('IMG_6841.JPG').gps_longitude

小问题,但它们让我纠结了一会儿,也许可以节省某人的时间。

此外,一旦我从照片中获取了GPS坐标,我发现这篇博客文章可以帮助将它们从数组转换为Google地图友好的坐标(即34.360826,-110.239368):http://www.cloudspace.com/blog/2009/02/16/decoding-gps-latitude-and-longitude-from-exif-in-ruby/


0
如果您想使用“更高级”的解决方案(不直接使用exif),可以使用gem https://github.com/aufi/photo_geoloader,它可以加载纬度、经度和海拔,并将其放置到Rails模型中(在回调中)。
class Photo < ActiveRecord::Base
  before_create do
    PhotoGeoloader.new(photo.path).place_attributes self
  end
  ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接