Журнал Программирование

ПРОГРАММИРОВАНИЕТЕХНОЛОГИИ

Как привязать фотографии к GPS-треку

Опубликовано 27 августа 2012 Jenyay

Представьте ситуацию, поехали вы в поход или просто погулять в другой город, взяли с собой фотоаппарат, наснимали кучу интересных кадров, которыми хотите поделиться с читателями вашего блога. Просто так выкладывать фотографии не интересно (если, конечно, они не представляют художественной ценности), надо бы написать к ним какой-нибудь текст. При этом вам надо сидеть и вспоминать, где была сделана каждая фотография, чтобы найти описание объекта, который там изображен.

Чтобы облегчить такую работу, ко многим фотоаппаратам делают специальные насадки, которые во время съемки записывают в файл с фотографией текущие координаты, полученные по спутникам GPS. Но, во-первых, они довольно дорогие (например, для фотоаппаратов Nikon такая GPS-насадка GP-1 стоит около 12 тысяч рублей), а, во-вторых, не для каждого фотоаппарата делают такие приблуды.

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

Определение координат, где были сделаны фотографии

Что нам понадобится? Во-первых, GPS-трек в формате GPX, во-вторых, фотографии, сделанные фотоаппаратом, в котором правильно установлено дата и время, ведь именно по времени фотографии будут привязываться к треку, и в-третьих, программа, которая будет прописывать координаты в EXIF-поля фотографий. В качестве программы возьмем GPS Photo Correlate.

Эта программа бесплатная, с открытыми исходниками, кроссплатформенная (работает под Windows и Linux). В состав пакета GPS Photo Correlate входят две программы — консольная gpscorrelate и программа с графической оболочкой — gpscorrelate-gui.

Пользователи Ubuntu могут установить их из репозитория, выполнив команду

sudo apt-get install gpscorrelate gpscorrelate-gui

Сначала мы будет пользоваться gpscorrelate-gui для наглядности. Итак, запускаем программу и видим следующее окно:

Как привязать фотографии к GPS треку gps 01 300x221

Первое, что нужно сделать — добавить фотографии. Для этого нажимаем кнопку «Add…» и выбираем сразу несколько фотографий. Если в полях EXIF фотографий еще не записаны координаты, то окно программы примет примерно следующий вид:

Как привязать фотографии к GPS треку gps 02 300x190

Затем нажимаем кнопку «Choose…» на панели «GPS Data» и выбираем трек в формате GPX. После этого нужно внимательно установить некоторые параметры.

В первую очередь надо выставить правильный часовой пояс, установленный у вас в фотоаппарате. Надеюсь у вас дата и время в нем установлены верно? Часовой пояс задается относительно всемирного координированного времени (UTC). Например, для Ярославля, на примере которого я буду показывать работу программы, так же как и для Москвы, это +4 (на Википедии есть хорошая карта часовых поясов). Итак, для нашего случая в поле ввода «Time Zone» вводим +4:00.

В программе есть еще несколько настроек. Галка «Interpolate» означает, что если в GPS-треке нет точки с точно таким же временем, как время съемки фотографии, то координаты будут интерполированы между соседними точками на треке. Если галку не устанавливать, то в качестве привязки фотографии будет задана ближайшая из точек на треке. Также можно включить интерполяцию между сегментами трека с помощью галки «Between Segments». Если трек записан аккуратно, то эту галку можно не включать.

Программа будет записывать данные из трека в исходные файлы и при этом скорректирует дату модификации файлов. Чтобы просто посмотреть, как сработает программа, не изменяя файлы, нужно установить галки «Don’t write» для запрета записи данных в EXIF и «Don’t change mtime» для запрета изменения даты модификации. Здесь надо уточнить, что изменяется именно дата модификации файла как свойство файла, дата и время берутся из EXIF, и именно по времени из EXIF происходит привязка фотографий к треку.

В программе есть возможность внести поправку по времени между временем, установленным в фотоаппарате, и точным временем, полученным по спутникам GPS. Для этого используется поле ввода «Photo offset». В это поле можно ввести число секунд, которые будут добавлены ко времени съемки каждого кадра. Это значение может быть и отрицательным.

При необходимости можно изменить формат, в котором будут записываться координаты в EXIF (поле ввода «GPS Datum» и галка «Write DD MM SS.SS»), но как правило эти поля лучше не трогать.

Теперь, когда все установлено правильно, нажимаем кнопку «Correlate Photos» и ждем, когда программа обработает все фотографии из списка. В результате в окне программы для каждой фотографии будут показаны получившиеся координаты. В правом столбце программа пишет, были ли координаты интерполированы или для данного момента времени в треке были записаны точные координаты.

Как привязать фотографии к GPS треку gps 03 300x172

gpscorrelate -z +4 -g «ИМЯ_ТРЕКА.gpx» *.JPEG

Здесь выражение -z +4 задает часовой пояс, а -g «ИМЯ_ТРЕКА.gpx» указываем имя трека. Интерполяция по умолчанию включена. В качестве файлов, разумеется, можно задавать и RAW-файлы.

Результат выполнения этой команды будет выглядеть примерно следующим образом:

$ gpscorrelate -z +4 -g «Трек_01-ИЮЛ-12 201713.gpx» *.NEF

EXIF-GPS Photo matching program.
Daniel Foote, 2005.

Reading GPS Data…
Legend: . = Ok, / = Interpolated, < = Rounded, — = No match, ^ = Too far.
w = Write Fail, ? = No exif date, ! = GPS already present.

Correlate: ///./////.///////.////////////.///.//////.///./////////////.//////////…

Completed correlation process.

Matched: 472 (29 Exact, 443 Interpolated, 0 Rounded).
Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far,
0 No Date, 0 GPS Already Present.)

После этого в EXIF файлов также будут прописаны рассчитанные координаты.

 

Поиск координат на карте

Теперь у нас в каждой фотографии прописаны координаты, но что нам с ними делать? Хотелось бы уметь находить эти координаты на картах Гугла, Яндекса и, особенно, Викимапии.

Сейчас каждый нормальный просмоторщик фотографий умеет показывать информацию из полей EXIF, в том числе и координаты. Для того, чтобы получить координаты в удобном для поиска виде мы воспользуемся программой exiftool. Это также бесплатная (опять же с открытыми исходниками) кроссплатформенная консольная программа для работы с данными EXIF.

Пользоваться этой программой легко, например, если мы выполним команду

exiftool имя_файла.jpeg

то получим всю информацию, что записана в EXIF. Среди них будут и такие строки:

GPS Altitude : 90 m Above Sea Level
GPS Date/Time : 2012:07:14 10:15:29Z
GPS Latitude : 57 deg 36′ 10.31″ N
GPS Longitude : 39 deg 50′ 35.79″ E
GPS Position : 57 deg 36′ 10.31″ N, 39 deg 50′ 35.79″ E

Но для поиска в картах Гугла, Яндекса и других сервисов нам нужно все координаты перевести в градусы. Разумеется, можно сидеть и на калькуляторе высчитывать градусы по формуле: градусы = градусы + минуты / 60 + секунды / 3600. Но это не наш метод, тем более, что exiftool может делать это сама. Для этого добавим еще один параметр:

exiftool -c «%.6f» имя_файла.jpeg

Параметр «-c» задает формат вывода GPS-координат. В данном случае мы указываем программе, что координаты должны быть выведены в градусах в формате с 6-ю знаками после запятой. Теперь координаты мы получим в следующем виде:

GPS Altitude : 90 m Above Sea Level
GPS Date/Time : 2012:07:14 10:15:29Z
GPS Latitude : 57.602864 N
GPS Longitude : 39.843275 E
GPS Position : 57.602864 N, 39.843275 E

Дальше нас будет интересовать только нижняя строка, поэтому линуксоиды могут выполнить следующую команду:

exiftool -c «%.6f» имя_файла.jpeg | grep «GPS Position»

Тогда не придется в большой куче информации выискивать нужную строку.

GPS Position : 57.602864 N, 39.843275 E

[Пользователи Windows в этом месте дружно рыдают.]

Теперь у нас есть координаты, в таком виде их можно вбить в поиск на всяких картографических сервисах. Вот, например, скриншоты Яндекс.Карт, карт Гугла и Викимапии для этих же координат:

Как привязать фотографии к GPS треку gps map 01 300x215 Как привязать фотографии к GPS треку gps map 02 300x215 Как привязать фотографии к GPS треку gps map 03 300x215

Более простой способ. Скрипт photocoord.py

Если фотографий много, то для каждого файла можно, конечно, использовать описанный метод, но для облегчения процесса привязки фотографии к карте с прописанными координатами я написал небольшой скрипт на питоне. Линуксоиды, а также те, кому нужны исходники, могут скачать скрипт photocoord.py на github. Для работы скрипта нужен Python 2.7 (думаю, что Python 2.6 тоже подойдет, но не пробовал).

Как им пользоваться. Так как это совсем первая версия, то там никакого инсталятора нет. Я бы посоветовал сделать симлинк на photocoord.py и сохранить в папку, прописанную в $PATH.

После этого скрипт можно использовать следующим образом:

photocoord.py имя_файла

Для пользователей Windows там же есть скомпилированная версия, не требующая установки Python.

В результате работы скрипт по данным из EXIF сформирует ссылки на сервисы Google Maps, Яндекс.Карты, Wikimapia и OpenStreetMap.

Пример работы скрипта:

$ photocoord.py DSC_0118.NEF

http://maps.yandex.ru/?text=57.6028638889%20N%2C%2039.843275%20E
http://maps.google.ru/?q=57.6028638889+N,+39.843275+E
http://wikimapia.org/#lat=57.6028638889&lon=39.843275&search=57.6028638889%20N%2C%2039.843275%20E
http://www.openstreetmap.org/?mlat=57.6028638889&mlon=39.843275zoom=10&layers=M

Надо только предупредить, что на Викимапии, чтобы перекрестие, обозначающее координаты, не сдвинулось при масштабировании, изменять масштаб нужно кнопками +/-, а не колесиком мыши.

Думаю, что со временем этот скрипт я буду еще немного улучшать. Может быть как-нибудь сделаю и интерфейс для него.

Добавить комментарий Сообщить о нарушениях Распечатать эту статью Поделиться на Facebook См. оригинал статьи
Вернуться к Избранному в категории Logo Paperblog

Добавить комментарий