December 24, 2020

Руководство по GPS метаданным в фотографиях (ч. 1): Географические координаты и их извлечение из файлов

С помощью программ mat и mat2 можно просматривать и удалять метаданные файлов (поддерживается огромное количество типов файлов). Но что если вместо удаления нужно изменить метаданные в фотографии или в документе? Эти программы не помогут в данной задаче.

Но есть другие инструменты, которые могут менять GPS координаты, дату и время съёмки, информацию о камере и любую другую метаинформацию, которую только может содержать файл. Также они могут выборочно удалять те или иные теги. Например, можно удалить GPS координаты, но оставить информацию о камере. А можно наоборот добавить комментарии в метаинформацию, например, с описанием события и других замечаний о сделанном снимке.

Дополнительно мы разберёмся в различных способах записи координат — чтобы что-то записать или отредактировать, нужно в этом разбираться. Также мы научимся копировать значения координат из фотографии в карту, чтобы можно было просмотреть место съёмки без загрузки изображения на сторонние сервисы.

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

Ну и бонусом мы научимся выводить только те метаданные, которые нам нужны и менять формат их вывода.

В этой инструкции мы рассмотрим сразу три потрясающих программы:

Они все работают и на Linux и на Windows — по ссылкам для каждой из них есть подробные инструкции по установке. У программы Geotag ещё и графический интерфейс! То есть спуфинг (подмена) GPS на фотографиях сводится к редактированию цифр в таблице.

Самой мощной из этих программ является ExifTool (кстати, оцените документацию по ней). При работе с редактированием географических координат, Geotag использует именно ExifTool, поэтому если вы используете Geotag на Windows вам нужно также установить и ExifTool и указать путь до исполнимого файла (в инструкциях по ссылкам выше всё уже есть). Кстати, mat2 для показа и удаления метаинформации также использует ExifTool. А Exiv2 использует, например, редактор фотографий GIMP для показа и редактирования метаинформации.

Также менять метаданные умеет программа jhead, но её возможности очень ограниченные — например, она не может менять GPS координаты в фотографии.

Географические координаты. Форматы записи географических координат

Географические координаты это широта и долгота.

Широта определяет расположение «вверх-вниз» на глобусе/карте. Нулём считается экватор. Долгота определяет расположение «вправо-влево» на глобусе/карте. Нулём считается Гринвич. О самих числах и как «на глаз» прикидывать в какой части планеты расположены координаты мы поговорим ниже, а пока про то, как их записывают — форматов координат много.

Форматы записи географических координат

Координаты (широта от −90° до +90°, долгота от −180° до +180°) могут записываться:

  • в ° градусах в виде десятичной дроби (современный вариант)
  • в ° градусах и ′ минутах с десятичной дробью
  • в ° градусах, ′ минутах и ″ секундах с десятичной дробью (исторически сложившаяся форма записи)

Разделителем десятичной дроби может служить точка или запятая. Положительные знаки координат представляются (в большинстве случаев опускаемым) знаком «+» либо буквами:

  • «N» или «с. ш.» — северная широта,
  • «E» или «в. д.» — восточная долгота.

Отрицательные знаки координат представляются либо знаком «−», либо буквами:

  • «S» или «ю. ш.» — южная широта,
  • «W» или «з. д.» — западная долгота.

Буквы могут стоять как впереди, так и сзади. Единых правил записи координат не существует.

На картах поисковых систем по умолчанию показываются координаты в градусах с десятичной дробью со знаком «−» для отрицательной долготы. На картах Google и картах Яндекс вначале широта, затем долгота. Эти координаты видны, например, при прокладке маршрутов от произвольных точек. При поиске распознаются и другие форматы.

Нам необязательно во всём этом детально разбираться. С практической точки зрения нам надо запомнить: искать на сервисах карт (например, Google Карты) можно координаты в формате «2 числа с десятичной дробью; разделителем десятичной дроби является точка».

К примеру, в окно поиска по карте вместо географического названия можно ввести два десятичных числа, допустим: 12.459444 99.978611. И Карты покажут вам место на планете, располагающееся по соответствующим координатам.

Но вот в метаданных координаты хранятся в виде трёх чисел — по этой причине программы, показывающие метаданные файлов, по умолчанию также показывают их в виде трёх чисел (градусы, минуты и секунды).

Например, exiftool:

12 deg 27' 34.00" N
99 deg 58' 43.00" E

А exiv2 выводит так:

12deg 27' 34"
99deg 58' 43"

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

Ещё можно добавить, что, например, Google Карты принимают следующие форматы:

  • Градусы, минуты и секунды: 41°24'12.2"N 2°10'26.5"E
  • Градусы и десятичные минуты: 41 24.2028, 2 10.4418
  • Десятичные градусы: 41.40338, 2.17403

Но удобнее всего использовать именно десятичный формат.

Как вывести координаты в десятичных числах из метаданных GPS

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

Я нашёл две программы, которые умеют показывать координаты в десятичном виде.

Во-первых, это Geotag.

Во-вторых, это ExifTool в которой с помощью опций и указания имён тегов можно вывести именно то, что требуется.

С помощью опции «-lang ru» можно вывести название тегов метаинформации на русском языке:

exiftool -lang ru 20190930_095515.jpg

Если добавить опцию '-*GPS*' (кавычки обязательны!), то будут показаны только теги метаинформации, в названии которых присутствует строка «GPS»:

exiftool -lang ru '-*GPS*' 20190930_095515.jpg

Если нужна только широта и долгота, то название тегов такое «-GPSLatitude -GPSLongitude»:

exiftool -lang ru -GPSLatitude -GPSLongitude 20190930_095515.jpg

Также помните, что с опцией -n не будут использоваться буквы для указания полушарий, а, если это требуется, будут выведены отрицательные числа.

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

Например, чтобы показывалось только шесть цифр после точки, а также чтобы для обозначения полушарий не использовались буквы, а использовался знак минус нужно указать опцию -c '%+.6f'

exiftool -lang ru -GPSLatitude -GPSLongitude -c '%+.6f' 20190930_095515.jpg

Как по координатам определить примерное расположение на земном шаре

Что вы можете сказать глядя на следующие координаты?

GPS – Широта : +12.459444
GPS – Долгота : +99.978611

Если ничего, то сейчас мы научимся «на глаз» определять примерное расположение по координатам даже без карты — хотя бы в каких полушариях находится координата и как далеко она от экватора, Гринвича и полюсов.

Широта определяет расположение «вверх-вниз» на глобусе/карте: 0° — экватор, 90° — северный полюс (верх глобуса), -90° — южный полюс (низ глобуса).

Долгота определяет расположение «вправо-влево» на глобусе/карте: 0 — Гринвич (Лондон/Великобритания), от 0° до +180° на восток (вправо) и от 0° до −180° на запад (влево).

Обратите внимание, что диапазон широты равен 180 градусам (половина окружности), а диапазон долготы 360 градусов (полная окружность). Диапазон долготы позволяет «перемещаться» по всей окружности земного шала (по всему экватору). А диапазон широты позволяет перемещаться только по видимой половине — если нужно было бы переместиться за северный/южный полюс, то для этого нужно сменить долготу, то есть «переехать» в другую часть экватора. Поэтому хватает 180° широты, но необходимо 360° долготы.

В соответствии с международным соглашением, меридиану, который проходит через Гринвичскую обсерваторию (Лондон, Великобритания) было присвоено значение 0° долготы, иными словами, он был избран в качестве точки отсчёта долготы на земном шаре. Долгота других мест измеряется как угол на восток или запад от нулевого меридиана, в диапазоне от 0° до +180° на восток и от 0° до −180° на запад".

Итак, вернёмся к нашим координатам:

GPS – Широта : +12.459444
GPS – Долгота : +99.978611

Широта 12 (положительное число) означает выше линии экватора, но не намного, где-то на 1/7 от всей высоты от экватора до северного полюса (90/12.46=7,22). Долгота 99 означает значительное отдаление от линии Гринвича в сторону востока — примерно четверть поворота земного шара на восток (180/99.97=0,55). (0,55 — это примерно половина от восточного полушария, которое составляет ½ от всей земли).

Если бы первая цифра (широта) была бы отрицательной, то координата была бы чуть ниже линии экватора. А если бы вторая цифра была бы отрицательной (долгота), то смещение было бы таким же большим, но уже в сторону запада (от Гринвича/Лондона).

Как узнать место, где снята фотография, без использования сторонних сервисов

Если вы не хотите загружать фотографию ни на какой сайт или сервис, то это вполне понятное желание.

Первый способ уже показан выше — извлеките из изображения координаты, перейдите на Google Maps и введите их, в одном из следующих форматов (различаются пробелами и запятыми, разделяющими два числа):

  • +12.459444 +99.978611
  • +12.459444, +99.978611
  • +12.459444,+99.978611

Знак + (плюс) писать необязательно, но знак минус (если он есть) писать обязательно.

Если вдруг у координаты нет десятичных цифр, то добавьте к ней «.0», иначе сервис не поймёт, что это координаты — оба числа должны быть с точкой и цифрой после неё.

Второй способ — использовать Geotag. Эта программа в один клик запускает свой локальный веб-сервер на котором размещена веб-страница с картой, открывает браузер и показывает на карте фотографии, которые вы выбрали.

Итак, запускаем Geotag и добавляем фотографии.

Теперь выбираем фотографии, которые мы хотим увидеть на карте (можно выбрать одну, или несколько, или все).

Кликаем правой кнопкой мыши по списку изображений и выбираем нужное действие.

Будет открыт браузер с такой страницей.

Обратите внимание:

  • это не статичная картинка, это интерактивная карта
  • адрес страницы localhost
  • на карте присутствует меню с возможными действиями

Преобразование координат в десятичный вид и в минуты/секунды

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

В десятичный вид преобразование происходит по следующей формуле:

ГРАДУС + МИНУТЫ/60 + СЕКУНДЫ/3600

То есть градус остаётся как есть, а минуты и секунды делятся на 60 и 3600 соответственно.

Если в строке присутствуют буквы S (сервер) или W (запад), то перед числом ставится знак минус. Вот и всё.

Чтобы не считать вручную (к тому же, при преобразовании в минуты и секунды нужно выполнить несколько действий), напишем небольшой скрипт, который будет это делать за нас.

Создадим файл geoconverter.php:

gedit geoconverter.php

И скопируем в него:

#!/usr/bin/php
 
<?php
$args = count($argv);
 
function DMStoDD($ref, $deg, $min, $sec) {
    // Converting DMS ( Degrees / minutes / seconds ) to decimal format
    if (( $ref == "S") OR ($ref == "W")) {
        return -($deg + ((($min * 60) + ($sec)) / 3600));
    }
    return $deg + ((($min * 60) + ($sec)) / 3600);
}
 
function DDtoDMS($dec) {
    // Converts decimal format to DMS ( Degrees / minutes / seconds ) 
    $vars = explode(".", $dec);
    $deg = $vars[0];
    $tempma = "0." . $vars[1];
 
    $tempma = $tempma * 3600;
    $min = floor($tempma / 60);
    $sec = $tempma - ($min * 60);
 
    return array("deg" => $deg, "min" => $min, "sec" => $sec);
}
 
if ($args == 2) {
    if ($argv[1] < 0) {
        echo 'S/W ';
    } else {
        echo 'N/E ';
    }
    foreach (DDtoDMS(abs($argv[1])) as $value) {
        echo round($value) . ' ';
    }
    echo PHP_EOL;
} elseif ($args == 5) {
    echo DMStoDD($argv[1], $argv[2], $argv[3], $argv[4]) . PHP_EOL;
} else {
    echo "Usage:" . PHP_EOL;
    echo "php ./geoconverter.php dd.dddddd" . PHP_EOL;
    echo "OR" . PHP_EOL;
    echo "php ./geoconverter.php N|S|E|W dd mm ss" . PHP_EOL;
}

Запускать так:

php ./geoconverter.php ДЕСЯТИЧНОЕ.ЧИСЛО 

В этом случае будет вычислена координата в формате градусы, минуты и секунды.

Или так:

php ./geoconverter.php N|S|E|W ГРАДУСЫ МИНУТЫ СЕКУНДЫ 

В этом случае будет вычислена координата в формате десятичного числа.

Примеры запусков:

php ./geoconverter.php N 12 27 34
12.459444444444
 
php ./geoconverter.php S 12 27 34
-12.459444444444
 
php ./geoconverter.php 12.459444
N/E 12 27 34
 
php ./geoconverter.php 99.978611
N/E 99 58 43
 
php ./geoconverter.php -99.978611
S/W 99 58 43

Надеюсь, они очевидны и их не нужно комментировать.

Продолжение следует…