Выбрать главу

#·· данные в строку, которую можно ввести в Google Maps или Bing Maps.

tempfile="/tmp/geoloc.$$"

trap "$(which rm) −f $tempfile" 0 1 15

if [$# −eq 0]; then

··echo "Usage: $(basename $0) image" >&2

··exit 1

fi

for filename

do

··identify −format "%[EXIF:*]" "$filename" | grep GPSL > $tempfile

··latdeg=$(head -1 $tempfile | cut  −f— f1 | cut −d= −f2)

··latdeg=$(scriptbc −p 0 $latdeg)

··latmin=$(head -1 $tempfile | cut −d, −f2)

··latmin=$(scriptbc −p 0 $latmin)

··latsec=$(head -1 $tempfile | cut −d, −f3)

··latsec=$(scriptbc $latsec)

··latorientation=$(sed −n '2p' $tempfile | cut −d= −f2)

··longdeg=$(sed −n '3p' $tempfile | cut −d, −f1 | cut −d= −f2)

··longdeg=$(scriptbc −p 0 $longdeg)

··longmin=$(sed −n '3p' $tempfile | cut −d, −f2)

··longmin=$(scriptbc −p 0 $longmin)

··longsec=$(sed −n '3p' $tempfile | cut −d, −f3)

··longsec=$(scriptbc $longsec)

··longorientation=$(sed −n '4p' $tempfile | cut −d= −f2)

··echon "Coords: $latdeg ${latmin}' ${latsec}\" $latorientation, "

··echo "$longdeg ${longmin}' ${longsec}\" $longorientation"

done

exit 0

Как это работает

Каждый раз, исследуя приемы использования пакета ImageMagick, мы находим другие параметры и другие способы применения его возможностей. В данном случае аргумент −format извлекает из EXIF изображения только один определенный параметр.

Обратите внимание, что здесь роль шаблона в команде grep играет строка GPSL, а не GPS. Благодаря этому отфильтровывается вся дополнительная информация, связанная с GPS, которая нам не нужна. Попробуйте убрать символ L, и вы увидите, как много других сведений из блока с EXIF-данными будет выведено на экран!

Затем остается только извлечь конкретные поля и решить несколько уравнений с помощью scriptbc, чтобы преобразовать данные в более понятный формат, как можно видеть в строках latdeg .

Суть использования конвейера с несколькими командами cut должна быть вам уже знакома. Это чрезвычайно удобный для сценариев инструмент!

После извлечения всех данных и решения всех уравнений необходимо вновь собрать информацию в виде, совместимом со стандартной формой записи широты и долготы . Вот и все!

Запуск сценария

Передайте сценарию файл изображения, и, если он включает информацию о широте и долготе, сценарий преобразует ее в формат, понятный Google Maps, Bing Maps и другим программам для отображения карт, как показано в листинге 14.10.

Результаты

Листинг 14.10. Запуск сценария geoloc

$ geoloc parking-lot-with-geotags.jpg

Coords: 40 3' 19.73" N, 103 12' 3.72" W

$

Усовершенствование сценария

Что получится, если передать сценарию фотографию, в которой отсутствует информация EXIF? Сценарий должен обрабатывать эту ситуацию, а не просто выводить уродливое сообщение об ошибке, полученное от программы bc, потерпевшей неудачу, или пустые координаты. Вы согласны? Дополнительные проверки информации GPS с координатами, извлекаемой с помощью ImageMagick, были бы полезным дополнением.

Глава 15. Дни и даты

Вычисления с датами порой бывают очень запутанными, например, когда нужно выяснить, високосный ли указанный год, сколько дней осталось до Нового года или сколько дней вы прожили. В этой области между Unix-системами, такими как OS X, и системами Linux, с их инструментами GNU, лежит глубокая пропасть. Дэвид Маккензи (David MacKenzie), взявший на себя труд переписать утилиту date для GNU-версии Linux, значительно расширил ее возможности.

Если вы пользуетесь OS X или другой системой, где команда date −version выводит сообщение об ошибке, загрузите комплект основных утилит, в состав которого входит расширенная утилита GNU date (иногда устанавливается как gdate). В OS X это можно выполнить с помощью диспетчера пакетов (не установлен по умолчанию, но установить его легко):

$ brew install coreutils

После установки GNU-версии утилиты date определить, високосный ли указанный год, можно с помощью самой программы, без необходимости путаться в сложных правилах о годах, кратных 4, но не 100, и других:

if [$(date 12/31/$year +%j) −eq 366]

Иными словами, если последним днем года является 366-й, этот год — високосный.

Еще одна замечательная особенность GNU date — возможность вернуться назад во времени. Стандартная команда date в системе Unix основана на понятии «нулевого времени» или дате эпохи: 00:00:00 по Гринвичу 1 января 1970 года. Хотите узнать что-нибудь о происходившем в 1965? Тогда вам не повезло. К счастью, с тремя остроумными сценариями в этой главе вы сможете в полной мере использовать преимущества GNU date.