В современном мире фотография перестала быть лишь статичным изображением – она всё чаще становится геопривязанной точкой данных, полезной для навигации, архивирования, научных исследований и просто для личного удобства. Ниже рассмотрены основные методы привязки фотографий к карте, а также примеры практической реализации.
Что такое геотеггинг?
Геотеггинг (от англ. 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, который состоит из двух этапов:
- Добавление тегов в 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/.