Геотеггинг фотографий: методы привязки к карте и пример реализации

Узнайте, как легко привязать фото к координатам: от EXIF-данных до удобных сервисов. Ваши воспоминания получат точный адрес!

В современном мире фотография перестала быть лишь статичным изображением – она всё чаще становится геопривязанной точкой данных, полезной для навигации, архивирования, научных исследований и просто для личного удобства. Ниже рассмотрены основные методы привязки фотографий к карте, а также примеры практической реализации.


Что такое геотеггинг?

Геотеггинг (от англ. geotagging) – это процесс внедрения географических координат (широты и долготы) в метаданные изображения, как правило, в блок EXIF файла JPEG. После этого фото можно отображать на картах в сервисах типа Google Maps, Flickr, Яндекс‑Фотки и др.

Информация из источника [1] (Habr, ) подтверждает, что большинство современных фото‑хостингов поддерживают просмотр привязанных к карте снимков, а идеальный способ – использование специальных GPS‑логгеров.


Основные способы привязки фотографий к карте

  • GPS‑логгеры – автономные устройства, которые периодически записывают свои координаты на карту памяти. После съёмки специальное ПО синхронно накладывает полученный трек на фотографии по времени.
  • Смартфоны и коммуникаторы с GPS – почти каждый современный телефон умеет писать геотеги непосредственно в EXIF при съёмке (если включена функция «геотеггинг»).
  • Ручная привязка через фото‑хостинги – пользователь загружает снимок на сервис (например, Flickr) и в интерфейсе указывает место на карте. Минус: координаты не записываются в исходный файл, а хранятся только на стороне сервиса.
  • Десктопные программы – приложения типа GeoSetter, Adobe Lightroom, ExifTool позволяют импортировать трек с GPS‑устройства или вводить координаты вручную и сразу сохранять их в EXIF.
  • Веб‑скрипты и собственные решения – при помощи JavaScript API Google Maps можно получить координаты точки по клику, а затем, используя библиотеки для работы с EXIF (например, piexifjs или серверные инструменты вроде exiftool), записать их в изображение.

Пример реализации: получение координат с карты и запись в EXIF

Ниже представлен упрощённый workflow, который состоит из двух этапов:

  1. Добавление тегов в EXIF – клиентская библиотека piexifjs модифицирует JPEG‑файл, добавляя теги GPSLatitude, GPSLongitude и GPSAltitude.

<html lang=»ru»>
<head>
<meta charset=»UTF-8″>
<title>Получение координат с карты</title>
<style>
#map { width:100%; height:100vh; }
</style>
</head>
<body>
<div id=»map»></div>

<script src=»https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap» async defer></script>
<script>
let map;
function initMap {
map = new google.maps.Map(document.getElementById(‘map’), {
center: {lat: 55.7558, lng: 37.6176}, // Москва по умолчанию
zoom: 12
});

// Слушаем клик по карте
map.addListener(‘click’, function(e) {
const lat = e.latLng.lat;
const lng = e.latLng.lng;
alert(`Выбраны координаты: ${lat.toFixed(6)}, ${lng.toFixed(6)}`);
// Здесь можно вызвать функцию записи в EXIF
writeExif(lat, lng);
});
}
</script>
</body>

В этом примере после клика по карте появляется alert с выбранными координатами, а затем вызывается функция writeExif (см. ниже).

Запись координат в EXIF через piexifjs

<script src="https://cdnjs.cloudflare.com/ajax/libs/piexifjs/1.0.8/piexif.js"></script>
<script>
function writeExif(latitude, longitude) {
 // Предполагаем, что пользователь уже выбрал файл через input type="file"
 const fileInput = document.createElement('input');
 fileInput.type = 'file';
 fileInput.accept = 'image/jpeg';
 fileInput.onchange = function(e) {
 const file = e.target.files[0];
 const reader = new FileReader;
 reader.onload = function(event) {
 const exifObj = piexif.load(event.target.result);
 // Преобразуем десятичные градусы в формат EXIF (число/знаменатель)
 function toRational(coord) {
 const degrees = Math.floor(Math.abs(coord));
 const minutesTemp = (Math.abs(coord) ౼ degrees) * 60;
 const minutes = Math.floor(minutesTemp);
 const seconds = ((minutesTemp ౼ minutes) * 60) * 1000; // в тысячных доли секунды
 return [
 [degrees, 1],
 [minutes, 1],
 [Math.round(seconds), 1000]
 ];
 }

 const gpsIfd = {};
 gpsIfd[piexif.GPSIFD.GPSLatitudeRef] = latitude >= 0 ? 'N' : 'S';
 gpsIfd[piexif.GPSIFD;GPSLatitude] = toRational(latitude);
 gpsIfd[piexif.GPSIFD.GPSLongitudeRef] = longitude >= 0 ? 'E' : 'W';
 gpsIfd[piexif.GPSIFD.GPSLongitude] = toRational(longitude);
 // Высота необязательна, можно задать 0
 gpsIfd[piexif.GPSIFD.GPSAltitudeRef] = 0;
 gpsIfd[piexif.GPSIFD.GPSAltitude] = [0, 1];

 const exifObjCopy = {...exifObj, gps: gpsIfd};
 const exifBytes = piexif.dump(exifObjCopy);
 const newFile = piexif.insert(exifBytes, event.target.result);

 // Создаём ссылку для скачивания готового файла
 const downloadLink = document.createElement('a');
 downloadLink.href = newFile;
 downloadLink.download = 'geotagged_' + file.name;
 downloadLink.textContent = 'Скачать фото с геотегом';
 document.body.appendChild(downloadLink);
 };
 reader.readAsArrayBuffer(file);
 };
 fileInput.click;
}
</script>

Этот скрипт:

  • Открывает диалог выбора JPEG‑файла;
  • Читает его как ArrayBuffer;
  • Извлекает текущий EXIF‑блок, добавляет в него GPS‑теги (широта, долгота, ссылки N/S, E/W);
  • Сохраняет изменённый файл и предлагает его скачать.

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


Лучшие практики и советы

  • Синхронизация времени – точность геотеггинга напрямую зависит от совпадения часов на фотоаппарате и GPS‑устройстве. Рекомендуется настроить NTP‑синхронизацию или вручную выставить одинаковое время перед съёмкой.
  • Проверка результата – после записи EXIF полезно открыть фото в любой программе, показывающей метаданные (например, exiftool -g1 -a -s0 foto.jpg), чтобы убедиться, что координаты присутствуют.
  • Резервное копирование – всегда сохраняйте исходные файлы без изменений, чтобы при ошибке иметь возможность вернуться к оригиналу.
  • Использование форматов с поддержкой EXIF – JPEG и TIFF поддерживают геотеги; форматы PNG и GEXIF не хранят такие данные, поэтому выбирайте подходящий тип файла.
  • Автоматизация – если у вас сотни снимков, напишите скрипт, который обходит папку, читает трек GPX/KML и пакетно пишет координаты в каждый файл, основываясь на временной метке съёмки.

Способы привязки фотографий к карте разнообразны: от простых ручных меток в онлайн‑сервисах до полностью автоматизированных решений с GPS‑логгерами и собственными скриптами. Выбор метода зависит от ваших задач, объёма материала и уровня требуемой точности. Применяя представленные выше техники и примеры кода, вы сможете эффективно геотегировать свои фотоснимки, делая их полезными не только для визуального восприятия, но и для пространственного анализа.

Источник: [1] Geotagging — привязка фотографий к карте, Habr, , https://habr.com/ru/articles/79741/.