LXF112:Геотеги

Материал из Linuxformat.

Перейти к: навигация, поиск
Геотэги Самая малость кода, способная увеличить ценность ваших фотографий

Содержание

Геотэги: Места ваших съемок

Марко Фиоретти вытаскивает свои отпускные фото и добавляет к ним столько географических сведений, что иного параноика легко хватил бы инфаркт.

Добавление геотэгов – это процесс привязки цифрового объекта к географическому местоположению. Добавление геотэгов к обычным данным является обязательным для их анализа при помощи геоинформационной системы (см. «Что за штука... ГИС?» в журнале для более подробной информации), тогда как добавление геотэгов к цифровым изображениям – это интересный способ упорядочения ваших фотографий по месту съемки, а не только по дате или теме.

Добавление геотэгов к фотографиям позволяет компьютеру выполнять такие задания, как «показать на карте, где было сделано фото» или «найти все фото, сделанные в радиусе трех миль от Букингемского дворца». Если вы захотите опубликовать ваши фотографии в Интернете, с помощью геотэгов можно легко создать свою собственную карту с гиперссылками на ваши онлайн-галереи или сервисы вроде Flickr.

Цифровые камеры со встроенными GPS-модулями, автоматически добавляющие геотэги к каждой фотографии, через пару месяцев опять подешевеют, но отсюда не следует, что незачем знать, как добавить такие тэги самому. Задумайтесь на минутку: если вам нравятся возможности фотографий с геотэгами, самой большой преградой на вашем пути будут не снимки, которые вы сделаете в очередном отпуске, а тысячи фото, уже перенесенных на ваш жесткий диск.

Усложнять не надо

То, что вы вынесете из этого материала, возможно, не будет самым изощренным способом добавления геотэгов, но, безусловно, пригодится всем читателям LFX, которые хотели бы начать работать с такими метками, потому что не требует GPS-оборудования. Мы используем свободное ПО, которое сработается с любым дистрибутивом Linux; сбор информации о координатах в нем настолько прост, что можно поручить это любому, кто способен управлять мышью и набирать текст. Преимуществом является также и более быстрая работа по сравнению с другими GUI; программу легко распространить на другие типы тэгов, и она удовлетворит любые нужды по добавлению геотэгов у большинства непрофессиональных фотографов.

Изображение:LXF112_112_1.jpg

Если вы готовы, давайте рассмотрим возможности добавления геотэгов с помощью Firefox, его модуля расширения Minimap и программирования на Bash, используя снимки прекрасной Сардинии как источник материалов. Firefox создаст нам текстовый файл, содержащий координаты всех отснятых мест, и другой текстовый документ, привязывающий каждый снимок к конкретному географическому положению. Всю эту информацию мы передадим простому Bash-скрипту, чтобы он снабдил наши JPEG-файлы данными о местоположении в стандартном формате, понятном любой программе, занимающейся геотэгами.

Расширение Minimap для Firefox, возможно, самый легкий способ создания списков географических координат.

Прежде чем продолжить – вопрос на засыпку: чье местоположение нужно указывать в геотэгах к изображению? То, что попало на снимок, или то, откуда снимок был сделан? На нашем уроке мы примем второе, но вообще-то единственно верного ответа здесь нет. Решать вам. И, будучи дата-мазохистами, отметим, что в обоих случаях следует также добавлять геотэги направления снимка (смотрит на север, смотрит на юг и т.д.), если вы, конечно, не хотите терять никакую информацию о географическом положении.

Minimap

Здесь вы нажимаете для сохранения широты и долготы какого-то места, даже не подозревая об этом.

Теперь про Minimap: это чудесное расширение Firefox, добавляющее боковую панель и специальную вкладку к Картам Google. На домашней странице Minimap http://minimap.spatialviews.com есть список всех возможностей этого дополнения. Прочтите его: там ценен каждый байт. Здесь мы воспользуемся только одной из функций Minimap, показанной выше.

Растяните и увеличьте карту, чтобы точно указать место, географические координаты которого нужно сохранить. После этого нажмите левой кнопкой мыши на самую правую кнопку в панели инструментов Minimap, выберите Добавить Адрес/Местоположение и введите название места и, при желании, краткое описание. После нажатия ОК местоположение отобразится в списке адресов Minimap. Нажав на нем правой кнопкой мыши и открыв диалоговое окно Свойства, вы увидите, что Minimap сама прописала долготу и широту вашего положения плюс ссылку на Карты Google.

Если вы скопируете и вставите ссылку в свой браузер, загрузится Карта Google, установленная на данную точку, с миниатюрами фотографий из базы данных Panoramio, сделанных в том же месте; но вернемся к геотэгам. Повторите те же шаги для всех мест, а закончив, нажмите на крайнюю левую иконку в панели инструментов и выберите Экспортировать все в > CSV. В результате получится файл, схожий с нашим, который мы назвали cannigione.csv (для ясности, отображены только первые несколько полей каждой записи):

Можно добавить больше сведений к введенным адресам, или в любой момент получить ссылку на Карты Google.

“Title”,”Location”,”URL”,”Description”,”Lat”,”Lng”
“Гавань Каниджоне, западный причал”,”41.108790,9.442588”
“Каниджоне, городской пляж”,”41.111927,9.441343”


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

 marco@polaris ~]$ cut ‘-d”’ -f2,10,12 cannigione.csv | grep -v
^Title | cat -n > places.txt
 marco@polaris ~]$ more places.txt
            1 Гавань Каниджоне, западный причал”41.108790”9.442588
            2 Каниджоне, городской пляж”41.111927”9.441343

С помощью одной, хотя и замысловатой команды, мы поделили файл CSV вертикально на несколько кусков, взятых в двойные кавычки, извлекли столбцы (2-й, 10-й, 12-й), содержащие название места и координаты, удалили ненужную первую строку и пронумеровали все остальные. При помощи этого списка мы привяжем к сделанным снимкам широту и долготу. Вы поняли, как легко можно получить список координат? А еще лучше, что эту часть для каждого места на Земле нужно выполнить только один раз, а потом раздать другим пользователям: каждый, кто ездил в то же место, может создать частичный список, сохранить его в файле CSV, проделать шаги, описанные нами выше, и показать результат другим.

Даже ваша старушка-тетя из Виннипега, приславшая вам по e-mail фотографии того лета, когда вы школьником у нее гостили, сможет посодействовать. Коли она сумела отправить почту, вероятно, можно попросить ее нажать еще пару кнопок, чтобы установить Minimap и найти все те дивные места, названия которых вы уже не помните – хоть бы она и ведать не ведала, что такое геотэги или Linux.

Приезжайте в солнечную Сардинию!

Фотографии, используемые на нашем уроке, сделаны на причале и пляже. Мы укажем широту и долготу внутри каждого файла в формате Exchangeable Image File Format (EXIF, http://www.exif.org), это стандарт де факто для вложения всевозможной информации внутрь JPEG. Все цифровые камеры записывают массу данных EXIF в свои снимки. Типичный метод прочтения и записи их под Linux – использование модулей Perl Image-ExifTool в обертке интерфейса командной строки под названием exiftool. Установка этого ПО довольно проста: скачайте tar-архив, распакуйте его, перейдите в получившийся каталог и выполните следующие команды:

perl MakeFile.PL
make
make test
make install

(может понадобиться повторить их для других модулей Perl, нужных для работы ExifTool, если они еще не установлены на вашем компьютере).

Геотэги – это также веселый и легкий способ изучить географию: перед вами Канниджоне, на северо-западе Сардинии.

Вот очень небольшая часть тэгов EXIF, скрытых внутри цифрового изображения, извлеченная ExifTool:

 [marco@polaris Cannigione]$ exiftool pier_1.jpg
 ExifTool Version Number : 7.30
 File Name : pier_1.jpg
 Exposure Program : Landscape
 ISO : 160
 Date/Time Original : 2008:08:07 07:52:08
 Title

Чтобы добавить геотэги к JPEG-файлам, нужно указать информацию о широте, долготе и высоте над уровнем моря в EXIF. GPS-часть EXIF описана на http://www.sno.phy.queensu.ca/~phil/exifTool/TagNames/GPS.html. Из страницы ясно, что тэгов GPS на свете полно, но обязательными являются следующие: GPSLatitude, GPSLongitude, GPSAltitude, GPSLatitudeRef, GPSLongitudeRef, и GPSAltitudeRef. Последние три содержат информацию для полей, возможные значения которых указаны в следующей таблице:

 GPSLatitudeRef: ‘N’ or ‘S’ (к северу или к югу от экватора)
 GPSLongitudeRef: ‘E’ or ‘W’ (к востоку или к западу от Гринвича)
 GPSAltitudeRef: 0 or 1 (выше или ниже уровня моря)

В нашем случае мы установим GPSLatitudeRef в ‘N’ (север). Широта и долгота каждого места уже есть в файле places.txt. Не хватает только высоты над уровнем моря. Все наши фото сделаны как раз на море, поэтому установим ее в 0 и продолжим; но API к Google Maps, используемый в Minimap, всегда устанавливает для высоты над уровнем моря значение 0, и Minimap вплоть до его переделки будет игнорировать это поле. С другой стороны, высоты на фотографиях вряд ли столь важны – разве что когда-нибудь вам приспичит найти все фотографии, сделанные между 1000 и 1200 метров над уровнем моря, или в этом духе.

Ах да, геотэги… не волнуйтесь, мы почти добрались до сути. Список JPEG-файлов – это обычный текст, у нас названный pictures.txt, в очень простом формате: на строчке – по одному имени файла и номеру местоположения через двоеточие, как указано в первой колонке файла places.txt.

 beach_1.jpg:2
 ...
 pier_.jpg:1

Мы обзавелись всем необходимым; теперь перейдем к обсуждению последней части нашей диаграммы – скрипта оболочки, под названием geotagger.sh; он состоит из 20 строк кода и делает всю основную работу. Вот его сердцевина:

Геотэги, добавленные к JPEG в соответствии со стандартом Exif, распознает любой менеджер цифровых фотографий.

##################################################
  while read line
  do
  PLACE_NUM=$(echo “$line” |awk ‘{print $1})
  LAT=$(echo “$line” | cut -d\” -f2)
  LONG=$(echo “$line” | cut -d\” -f3)
  LONG_ARY[$PLACE_NUM]=$LONG
  LAT_ARY[$PLACE_NUM]=$LAT
  done < $1
  while read line
  do
  PLACE_NUM=$(echo “$line” | cut -d: -f2)
  CURRENT_FILE=$(echo “$line” | cut -d: -f1)
  echo Associating LAT: ${LAT_ARY[$PLACE_NUM]}, LONG:
  ${LONG_ARY[$PLACE_NUM]} to $CURRENT_FILE
  exiftool -P -c “%.6f degrees” \
  -GPSLatitude=${LAT_ARY[$PLACE_NUM]} \
  -GPSLongitude=${LONG_ARY[$PLACE_NUM]} \
  -GPSAltitude=0 \
 -GPSLatitudeRef=N \
  -GPSLongitudeRef:W \
  -GPSAltitudeRef:0 \
  $CURRENT_FILE
  done < $2

В качестве аргументов сценарий принимает имена двух файлов. Первый ($1 в приведенном выше отрывке) – это список названий мест и координат; второй ($2) содержит названия фотографий и их номера местоположений. Все происходит в двух циклах while, каждый из которых сканирует один файл, по строке за раз.

Сперва мы сгружам широту и долготу всех мест в два массива, LONG_ARY и LAT_ARY, проиндексировав их номерами мест. Второй цикл считывает список фотографий с номерами мест, которые с ними ассоциированы. Потом скрипт вызывает утилиту ExifTool с нужными параметрами. Вот и все.

У ExifTool очень подробная man-страница, и вам не мешает ее прочесть, прежде чем приступать к работе, но его использование в этом скрипте достаточно прозрачно. Первые две опции сохраняют дату и изменение времени файла JPEG и устанавливают формат печати для координат GPS, а другие просто присваивают нужное значение каждому параметру. Скрипт должен быть запущен в том же каталоге, где лежат ваши фото:

[marco@polaris Cannigione]$ geotagger.sh ~/places.txt ~/
pictures.txt
Associating LAT: 41.111927, LONG: 9.441343 to beach_1.jpg
...
Associating LAT: 41.10879, LONG: 9.442588 to pier_6.jpg
1 image files updated

Когда сценарий завершится, вы увидите фотографии с геотэгами и резервные копии исходных файлов, к именам которых припишется _original. Повторив тот же тест, что мы делали в начале этого учебника, мы увидим, что EXIF-тэги GPS и вправду добавлены:

Все, что вы узнали на этом уроке, легко использовать для публикации галерей изображений в формате, совместимом с Google Earth.

[marco@polaris Cannigione]$ exiftool pier_1.jpg | grep GPS
GPS Version ID : 2.2.0.0
GPS Latitude Ref : North
GPS Longitude : 9 deg 26’ 33.32”
GPS Altitude : 0 m
GPS Latitude : 41 deg 6’ 31.64” N
GPS Position : 41 deg 6’ 31.64” N, 9 deg 26’ 33.32”

Альтернативные решения

Версии DigiKam 0.10.x, которые с начала 2009 года будут включены во многие дистрибутивы Linux, смогут загружать Marble, виджет карт для KDE 4 (http://edu.kde.org/marble) и использовать его аналогично Minimap. Блог по адресу http://linuxappfinder.com/blog/add_gps_coordinates_to_your_photos объясняет, как сделать это вручную, с DigiKam под KDE 3.x.

Можно также добавить геотэги через чисто графический интерфейс Geotag (http://geotag.sourceforge.net). Это программа на Java также умеет запускать Google Earth или Google Maps, чтобы указать, где происходила съемка, и генерировать KML-файлы для передачи другим пользователям Google Earth, чтобы те применили их с той же целью. Программу можно попросить добыть более подробную информацию о данном месте на сайте geonames.org, а если установлена правильная версия Java, то Geotag будет работать прямо из Firefox, без всякой установки (см. http://geotag.sourceforge.net /?q=node/3).

Наконец, если вы не прочь покодировать сверх того, что сделано в этой статье, загрузите модули Perl для программирования GPX и Flickr с сайта http://www.cpan.org.

Тэги по-хитрому

Скорая помощь

Даже если вы пока не пользуетесь Google Earth, не забывайте сохранять все адреса Minimap в этом формате. Никогда не знаешь, когда они могут пригодиться!

Как показано в разделе альтернативных решений вверху, этот метод не единственный в своем роде. Вдобавок он не гарантирует максимума точности: если вам нужны географические координаты военного качества, то это не лучшее решение, уж извините. Зато у него есть масса других достоинств. Он требует всего лишь одно расширение Firefox, модуль Perl и скрипт на 20–30 строк. Но главное преимущество – разделение процесса на две фазы: сбор координат и назначение тэгов снимкам. При создании геотэгов к семейному архиву фотографий за 10 лет ввод координат всех мест был бы сущей каторгой. Если же поступить так, как описано выше, то фаза сбора координат очень проста, совершенно отделена от процесса геотэгинга и работает с любой ОС. А главное, ее могут параллельно и независимо выполнять несколько человек. Опять же, скрипт добавления геотэгов прост, быстр и полностью автоматизирован, и в реальной жизни может быть упрощен еще больше. Если у вас имеется сотня фотографий, сделанных в одном месте, например, у вас дома, вы можете убрать первый цикл, а во втором зашить в код домашнюю широту и долготу!

Другая важная характеристика этого процесса – необычайная легкость добавления новых тэгов. Ничто не мешает вам приставить в файле pictures.txt колонки типа “Название галереи”, “Люди на снимке”, описание сюжета фотографии и т.п. Если вы захотите их добавить, ExifTool внесет эти дополнительные метаданные тем же способом, что и географические координаты – как это делать, объяснено на man-странице.

А вот и последнее угощение. Minimap умеет сохранять списки адресов также и в KML-формате, используемом для добавления закладок и аннотаций к местам в Google Earth. Чуть-чуть поскриптовав, вы сможете использовать этот KML-файл и те же списки, что вы создали вручную или через Minimap, для создания альбомов, доступных через Google Earth! Короче, вперед, прописывать геотэги! LXF

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию