#·· данные в строку, которую можно ввести в 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.