exif: GPSLatitude: 40/1, 4/1, 1983/100
exif: GPSLatitudeRef: N
exif: GPSLongitude: 105/1, 12/1, 342/100
exif: GPSLongitudeRef: W
Координаты выводятся в градусах, минутах и секундах — что естественно, — но сам формат представления не понятен на первый взгляд, как, например, формат, принимаемый сайтами Google Maps или Bing Maps:
40 4' 19.83" N, 105 12’ 3.42" W
Сценарий преобразует информацию EXIF в этот формат, благодаря чему вы сможете скопировать данные и вставить их непосредственно в программу отображения карт. В ходе преобразования сценарий решает несколько элементарных уравнений (обратите внимание, что значение секунд широты, в действительности равное 19,83, инструментом identify возвращается в виде 1983/100).
Понятие широты и долготы появилось намного раньше, чем вы могли бы подумать. В действительности впервые линии, обозначающие широту, появились еще в 1504 году на картах португальского картографа Педру Рейнел (Pedro Reinel). В вычислениях используются также некоторые математические формулы. К счастью, нам не придется обрабатывать их. Нам достаточно знать, как преобразовать широту и долготу из значений в формате EXIF в традиционные, понятные современным программам отображения карт, как можно увидеть в листинге 14.9. Этот сценарий также использует сценарий № 8, echon, из главы 1.
Листинг 14.9.Сценарий geoloc
#!/bin/bash
# geoloc — для изображений, включающих информацию GPS, преобразует эти
#·· данные в строку, которую можно ввести в 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, были бы полезным дополнением.
Читать дальше