Получение метаданных GPS с изображения с помощью Paperclip

У меня есть вопрос о Paperclip. Многие современные камеры и телефоны добавляют метаданные GPS к фотографии при съемке:

geotagging

Пользователи моего приложения Rails могут загружать фотографии и вручную добавлять к ним данные о местоположении. Однако это отстой, поскольку пользователи не хотят вводить это: они хотят, чтобы он был автоматически.

Можно, и как я могу получить метаданные GPS с фотографии (всегда JPEG) с помощью программы "Скрепка" и Ruby on Rails? Это можно сделать с помощью Paperclip или мне нужен другой камень?

Ответ 1

Вам понадобится извлечь EXIF ​​ информацию с картинки.

Существует жемчужина, которая стремится сделать именно это: exifr

Вы можете установить его автоматически со следующей строкой поставщика:

gem 'exifr'

EDIT:

Я лично переключился на эту вилку того же драгоценного камня, который содержит 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

Ответ 2

вы не можете сделать это с помощью 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]

(pre: imagemagick установлен и на пути, проверьте с помощью ", который идентифицирует" )

Ответ 3

Просто обновление принятого ответа выше, что очень помогло мне заставить EXIFR работать, но имеет несколько проблем:

  • Чтобы проверить, имеет ли изображение GPS, мне пришлось использовать EXIFR::JPEG.new('IMG_6841.JPG').exif?

  • Чтобы вытащить широту, я использовал EXIFR::JPEG.new('IMG_6841.JPG').gps_latitude

  • И долгота EXIFR::JPEG.new('IMG_6841.JPG').gps_longitude

Небольшие проблемы, но они заставили меня немного крутиться и могли бы сэкономить время в пути.

Кроме того, как только я получил свои GPS-координаты с моей фотографии, я нашел эту запись в блоге, чтобы помочь преобразовать их из массива в координаты Google Map (например, 34.360826, -110.239368): http://www.cloudspace.com/blog/2009/02/16/decoding-gps-latitude-and-longitude-from-exif-in-ruby/

Ответ 4

Если вы хотите использовать решение "более высокого уровня" (без exif напрямую), есть драгоценный камень https://github.com/aufi/photo_geoloader, который загружает широту, долготу и высоты и может поместить его в модель рельсов (в обратном вызове)

class Photo < ActiveRecord::Base
  before_create do
    PhotoGeoloader.new(photo.path).place_attributes self
  end
  ...