Geo tagging что это такое в смартфоне
Заходя к недавно приехавшим из отпуска друзьям на чашечку чего либо, рано или поздно, вас заставят посмотреть кучу отснятых «фото шедевров». Наряду с высокопрофессиональными кадрами из серии «я, баулы и самолёт», «мы в автобусе», «а вот как потёк кондиционер на 40 градусной жаре» и прочее и прочее, как ни странно находятся снимки красивых мест, природы или памятников архитектуры, которые вы и сами не прочь были бы посетить. Вот тут то и возникает вопрос «а где это?», «а как туда попасть?» и т.п. Если кадр сделан не за углом, мимо которого каждый день ходим на работу, то понять со слов, где это и как найти, не всегда представляется возможным (скажу по своему опыту, что практически всегда, найти место в другом городе или стране со слов рассказчика нереально (естественно, если это не Колизей или Эйфелева башня)). Именно тут нам и поможет очередное импортное изобретение, именуемое — геотеггингом. Geotagging — это функция, задача которой присвоить снимку координаты, для последующего просмотра на карте местности. Полезна ли данная возможность только «отпускникам»? По моему мнению, НЕТ. Думаю, есть смысл использовать данное новшество и туристам, скалолазам, да хоть охотникам на крокодилов лишь бы снимки которым были присвоены координаты, были интересны кому-нибудь (хотя бы самому фотографу). Из личного опыта делаю вывод, что геотеггинг будет полезен и рыбакам. Неплохо было бы показать фото не только с очередным трофеем, но и ценной для других рыбаков информацией о месте улова. Не знаю как для сплава на байдарках или восхождению на скалы, а для рыбной ловли погрешность в 15-20 метров бывает зачастую роковой. Прибыв вроде на то же самое место, но встав метров на 20 в стороне, вы можете быть обречены на потерю дорогостоящих снастей и отсутствие улова. От продолжительного лирического вступления, переходим к тому, как всё же это работает. У цифровых фотографий, есть такое понятие как EXIF-данные. Именно они нам и могут поведать не только о разрешении фотографии, модели камеры и т. п. но и о месте, где был отснят кадр. У нас свободная страна и никто нам не запретит занести в EXIF-данные нашего снимка координаты (широту и долготу). Как же всё-таки прикрепить координаты к снимкам? Решений у данной задачи несколько.
№1 (подручными средствами в лоб)
Берём любую камеру, GPS приёмник и КПК или ПК, а так же тетрадь и ручку. Всё очень просто, делаем кадр, снимаем координаты местности используя GPS приёмник и аккуратно пишем всё в тетрадь. Дома перебиваем записи с тетрадки в данные кадра (писать всё нужно аккуратно, дабы случайно не ошибиться в нумерации кадров и целой группе снимков не присвоить неверные координаты). И действительно, голову напрягать совсем не нужно, единственная проблема в том, что у человека всего 2 руки и управляться одновременно с таким количеством оборудования используя что бог послал, фактически нереально. Хотя, я думаю при выработке определённых навыков, теоретически возможно.
№2 (требует некоторых финансовых вложений)
Если жонглировать техникой не ваше призвание и кошелёк позволяет покупать все новинки техники, то можно приобрести камеру со встроенным GPS модулем. Решение красивое, да и кучу оборудования с собой таскать не нужно. Единственная проблема в том, что данные камеры являются новинкой и как следствие стоят на сегодняшний день достаточно дорого. Так что, данный подход основной массе россиян к сожалению пока не по карману.
№3 (используем то что есть почти у каждого в кармане, но в отличии от второго метода, денег не тратим)
В данной части моего повествования речь пойдёт о коммуникаторах и смартфонах. На сегодняшний день трудно себе представить жизнь без интернета, электронной почты и спутниковой навигации. Телефонов, в прямом смысле этого слова, с функцией поднять трубку, поговорить и положить становится всё меньше и меньше. Современные средства связи в большинстве своём имеют возможность выхода в интернет и фотокамеру, а так же всё чаще оснащаются GPS приёмником. Что касается коммуникаторов, то с данными устройствами вроде как всё понятно, они давно уже обладают функциями о которых я писал выше и кто хотел их освоить сделали это в своё время. Поговорим немного о новинках в области смартфонов. Лично я, являюсь приверженцем Nokia, но это не догмат, а скорее дело привычки. Это примерно тоже самое, что выбор между BMW и Mercedes. И та и другая фирма выпускает хорошие автомобили, но при всём при этом, поклонник BMW выберет следующей машиной себе скорее всего именно BMW, а фанат Mercedes именно Mercedes.
От лирического отступления к фактам. Nokia быстро сориентировалась в веяниях моды и одна из первых увидела большой потенциал GPS. Поэтому производитель стал снабжать свои новинки GPS чипами и разрабатывать соответствующее программное обеспечение.
Nokia 6220 Classic
Давать рекламу тому или иному аппарату или перечислять модели телефонов оснащённых GPS не вижу смыла, эту информацию легко найти на официальном сайте или на просторах всемирной паутины. Скажу лишь то, что новинки Nokia очень даже подходят для геотеггинга. Вместе с камерой запускается GPS приёмник, в следствии чего фотографиям и даже видео роликам можно присвоить координаты. Я уже упоминал о том что Nokia разрабатывает ПО и сервисы именно под геотеггинг. Теперь об этом поподробнее. Мы отсняли фотографии, присвоили им координаты. И что дальше? Используя смартфоны Nokia, вы легко можете разместить свои снимки на таких ресурсах как Ovi или немало известном Flickr. Для размещения мультимедийного контента на Ovi, последние модели смартфонов имеют встроенную функцию. Если по какой то причине у вас нет возможности выйти в интернет, то у Nokia есть offline сервис — Nokia Photos. Благодаря данному решению вы можете выкладывать фотографии с лэптопа или настольного ПК. Так же Nokia не забыла и о спортсменах-геотеггерах, для них есть программа под названием Sportstracker.
Давайте оставим Nokia в покое, о ней и так много сказано. Да и вообще, если писать о том, что обладатели только Nokia могут пользоваться благами цивилизации, в частности геотеггингом, то это будет враньё в чистом виде. Тема геотеггинга пошла в массы и наивно было бы полагать, что другие фирмы не постараются занять своё место на рынке, и не будут выпускать новинки с заветной функцией. Упускать современные веяния из виду было бы глупостью и потерей денег и авторитета. Именно по этому, пусть даже и позже Nokia, на геотеггинг обратили внимание такие фирмы как Samsung и LG.
LG Renoir KC910
Уже сегодня в их модельном ряде можно найти аппараты поддерживающие эту функцию. Не стоит забывать и про такую глыбу, как Sony Ericsson.
Sony Ericsson C702i
Смартфоны этой фирмы оснащены отличной камерой. К моему большому сожалению, камеры Nokia им уступают (но это опять же моё мнение). Ничего удивительного в том, что аппараты Sony Ericsson Cybershot стали дополняться функциями геотеггинга, на мой взгляд нету. Если на время забыть про Windows Mobile и Symbian, поворошив память вспомнить о чём-нибудь более экзотическом для нашего потребителя, например об аппаратах на базе Mac OS, то сразу же перед глазами предстаёт образ Apple и его детище — iPhone.
Apple iPhone 3G
Как было сказано в одной передаче — это «стильно, модно, молодёжно» и тему нашей статьи, Я телефон не обошёл стороной. При запуске камеры, автоматически стартует GPS модуль и как следствие фотографиям присваиваются координаты. Наверное о смартфонах поддерживающих геотеггинг рассказал всё или по крайней мере очень многое. Отдельно останавливаться на каждой фирме или тем более модели и рассказывать о каких то спец функциях или тонкостях настройки считаю что нет смысла. Мне кажется, что более правильным решением было бы рассказать вам о специальном программном обеспечении и геосервисах, но эта уже тема следующей статьи…
Вместе с линейкой смартфонов Galaxy S21 компания Samsung представила новое устройство — геометку SmartTag. Позднее подобный гаджет появился у Apple — и мы не удивимся, если вскоре в России такие метки покажут Xiaomi и Huawei. Для чего нужны эти Bluetooth-брелки, разбираемся в статье.
Что это такое?
Геотег представляет собой брелок размером чуть больше пятирублевой монеты. В нем есть отверстие для шнурка или кольца, чтобы гаджет можно было прицепить на рюкзак, ошейник питомца, ключи или другие объекты. По центру расположена кнопка — хотя сразу и не скажешь, что у него вообще есть какие-то элементы управления.
Корпус гаджета защищен от воды и пыли по стандарту IP52 — проще говоря, он переживет небольшой дождь. В нем установлена небольшая батарея, которая проработает до 300 дней. Заряжать геометку нельзя, но можно поменять аккумулятор, вскрыв корпус монеткой или отверткой.
Как работает
Внутри метки спрятан маячок Bluetooth 5.0, благодаря которому она подключается к смартфону. Также важно, что Galaxy StartTag работает по протоколу BLE (Bluetooth Low Energy) — связь между устройствами будет сохраняться в радиусе до 120 м (на открытом пространстве).
Геотег можно подключать только к моделям Samsung, но это не значит, что при удалении на 120 м от объекта вы его потеряете. Все метки и чужие устройства Galaxy объединяются в сеть и могут обмениваться между собой информацией о местоположении друг друга. Таким образом, чужой телефон Samsung может помочь найти потерянную вещь, если будет находиться к ней ближе, чем владелец. Конечно, для этого на нем тоже должен быть включен Bluetooth и функция «Автономный поиск».
Происходит это так: геометка, потеряв связь с родным смартфоном, на протяжении 30 минут производит сигналы BLE. Их могут поймать другие устройства Galaxy, которые находятся поблизости — и владелец предмета увидит их на карте в своем приложении.
В обычном спальном районе, скорее всего, не будет плотной сети из смартфонов и геометок Samsung (например, когда мы тестировали SmartTag, вокруг вообще не было других устройств). Но где-нибудь в центре или оживленном парке это вполне реально — ведь гаджеты корейского бренда очень популярны в России.
Как настроить геометку
В зависимости от производителя, процесс может немного отличаться — так как разные бренды используют разные приложения для своих экосистем. Однако суть все равно одна.
Для настройки Galaxy SmartTag используется фирменное приложение Samsung — SmartThings. Оно же служит для управления умной бытовой техникой бренда. Дополнительно надо установить плагин SmartThings Find, необходимый для поиска и отображения устройств на карте.
В начале необходимо зарегистрировать геотег в системе: добавить новое устройство («тег\трекер»), а далее — нажать на кнопку на метке, чтобы включить ее. После этого программа предложит выбрать имя гаджета и обновить его прошивку. По ходу настройки можно ознакомиться с подсказками и примерами использования Galaxy SmartTag.
Далеко не все пользователи знают, что на цифровых фотографиях можно проставлять координаты съемки - географические широту и долготу. Эти данные записываются в так называемый EXIF - специальное расширение цифрового снимка, куда заносится масса всякой информации: дата и время съемки, модель фотоаппарата, экспозиция, ISO и так далее и тому подобное. Если фотоаппарат (телефон) снабжен чипом GPS, то в этот EXIF также можно заносить GPS-координаты - это называется "геотег". >
Возможность эта может быть очень удобной, особенно если речь идет о фотосъемке всяческих путешествий: вместо того чтобы отвечать на вопросы из серии "А это где? А это где? А вот это где такое красивое место?", вы просто говорите, что там в каждой фотографии есть координаты - берите да смотрите, кому нужно.
Показывать значения координат в фотографиях умеют многие программы просмотра - например, та же ACDSee Photo Manager, в которой можно включить просмотр всех данных EXIF.
GPS-координаты в ACDSee
Однако просто координаты как таковые мало о чем говорят. Было бы значительно удобнее иметь возможность при необходимости посмотреть место съемки - например, в тех же картах Google. Это было бы совсем наглядно.
Ну так нет проблем! Подобные вещи умеет делать бесплатная программа Picasa от Google. Устанавливаете ее, запускаете. Программа просканирует изображения на вашем компьютере и выведет их в виде превьюшек. На тех фотографиях, где есть геотег, Picasa покажет специальный красненький значок - как отметка позиции на картах Google.
Фотографии с геотегом
Если нажать на такой же значок из нижней панели инструментов, Picasa выведет панель с картой, где покажет координаты всех фотографий в папке или координаты выделенной фотографии.
Фото и карта
Причем на карте также можно выбирать режим "спутника" и другие режимы, поддерживаемые картами Google. Также, разумеется, можно менять масштаб отображения.
Изменение масштаба и включение изображения со спутника
С помощью этой программы вы также можете вручную добавлять геотеги в уже сделанные фотографии - выбираете нужную местность на карте, после чего проставляете соответствующий геотег в выбранные изображения.
Фотоаппаратов со встроенным GPS существует немало, но если у вас такого нет - вряд ли имеет смысл покупать что-то подобное только из-за геотегов. Учитывая растущую популярность смартфонов с камерами, которые уже могут давать вполне приличные по качеству изображения, задача простановки геотегов решается просто - как правило, если смартфон снабжен модулем GPS, то его камера эти геотеги умеет проставлять.
Вот, например, настройки айфона - включение геотегов в камере.
Включение геотега в камере
А вот включение геотега в смартфоне на Android.
Включение GPS на Android
Ну и одновременно имеет смысл сразу проверить, включен ли у вас геотег в настройках смартфона, а то может случиться обратная ситуация: вы совершенно не заинтересованы в том, чтобы по вашим фотографиям, выложенным в Сети, можно было определить точные координаты съемки, а они у вас смартфоном подло прописываются на каждом кадре.
Уверен что про geotagging слышало подавляющее большинство хабраюзеров, особенно те кто интересуется фотографией. Для тех же, кто все таки не слышал поясню — в двух словах geotagging есть внедрение Exif тегов содержащих информацию с координатами GPS в фотографии с последующей привязкой фотографий к карте.
Возможность просмотра привязанных к картам фотографий предоставляет большинство современных фото-хостингов — PicasaWeb, Flickr, Яндекс-Фотки и прочие, да и десктопные программы подтягиваются, например Picasa.
Идеальный вариант для геотеггинга это приобретение специальных GPS-логгеров, тем более что цены на них в последнее время постоянно падают. Принцип действия GPS-логгеров прост до безобразия — устройство периодически сбрасывает текущие координаты на карту памяти, параллельно фотографируются фотки (желательно с включенной функцией «шедевр»). После фотосессии на фотки и трек с гео-логгера натравливается спец-софт, прописывающий в фотографии GPS координаты, синхронизируясь по времени.
Можно также использовать для этих целей коммуникатор с GPS — алгоритм аналогичен, хотя и не без минусов. Например, время работы коммуникатора, учитывая то что он не специально заточен под эти цели, оставляет желать лучшего. Но что делать если волшебного девайса нету, а фотки привязать к карте все-таки хочется?
Если все же сильно хочется, то можно залить фотографии на фотохостинг и вручную привязать их к карте, минус данного способа в том что на диске остаются фотографии без координат, да и делать что-то вручную не достойно правоверных айтишников/программистов с обостренной врожденной ленью.
Учитывая все вышенаписанное, было потрачено около часа времени на написание простого кода выдирающего GPS координаты с карты при щелчке мыши и прописывающего их в Exif фотографии.
Итак, задачу можно разделить на два этапа:
1. Вывод карты на экран и определение GPS координат.
2. Добавление тегов с GPS координатами в Exif информацию JPEG файла.
Вывод карты и определение GPS координат
Решить данную задачу при помощи Google Maps API гораздо проще чем может показаться на первый взгляд.
Создадим HTML файл с компонентом Google Maps, растянутым на весь экран без марджинов:
* Ключ для использования Google Maps API можно получить здесь, в примере используется ключ используемый в примерах в документации Maps API.
Загрузим файл в компонент WebBrowser (для удобства я поместил файл в ресурсы проекта):
- webBrowser.AllowWebBrowserDrop = false ;
- webBrowser.IsWebBrowserContextMenuEnabled = false ;
- webBrowser.WebBrowserShortcutsEnabled = false ;
- webBrowser.ObjectForScripting = this ;
- webBrowser.DocumentText = Resources.google;
Скомпилировав приложение на данном этапе, увидим следующее:
Добавим к компоненту карты возможность поиска, для этого включим GoogleBar, добавив следующий код к функции initialize():
- var mapOptions =
- // Настройки строки поиска
- googleBarOptions :
- style : "new"
- >
- >
- // Включаем строку поиска
- map.enableGoogleBar();
Теперь добавим обработчик клика мыши на карте, для этого определим следующую функцию:
- // Обработчик клика по карте
- function getLatLng(overlay,latlng)
- if (latlng != null )
- // Добавим pin с координатами на карту
- map.clearOverlays();
- marker = new GMarker(latlng);
- map.addOverlay(marker);
- marker.openInfoWindowHtml( '<b>Latitude:</b>' + latlng.lat() + '<br>' + '<b>Longitude:</b>' + latlng.lng());
- >
- >
И соответствюший listener в функцию initialize():
Функция getLatLng() довольно проста. Сначала мы вычищаем все оверлеи с карты, создаем новый маркер с координатами места где пользователь кликнул по карте, ну и наконец, из эстетических соображений выводим popup с координатами.
Вот что у нас получилось:
Все выглядит красиво и юзабельно, но как же передать данные с координатами в приложение-хост (WinForms с компонентом WebBrowser)?
Для этого можно воспользоваться свойством WebBrowser.ObjectForScripting. Обьект присвоенный этому свойству доступен скриптам в странице как window.external.
Замечу что обьект присваемый свойству ObjectForScripting (в данном случае обьект Form содержащий компонент WebBrowser) должен быть помечен аттрибутом ComVisible и в скриптах будут доступны только public методы и свойства.
Итак, добавим в функцию getLatLng() следуюшую строку:
- // Передача координат в хост-приложение
- window.external.SetValue(latlng.lat() + '|' + latlng.lng());
Как я уже сказал, доступ к обьекту присвоенному ObjectForScripting осуществляется через window.external, следовательно чтобы добавленный код заработал надо добавить в класс формы public метод SetValue(string):
- public void SetValue( string value )
- string [] coordinates = value .Split( '|' );
- _latitude = new GPSCoordinate(
- Convert .ToDouble(coordinates[0]),
- GPSCoordinateType.Latitude);
- _longitude = new GPSCoordinate(
- Convert .ToDouble(coordinates[1]),
- GPSCoordinateType.Longitude);
- lblLatitude.Text = _latitude.ToString();
- lblLongitude.Text = _longitude.ToString();
- >
Небольшое отступление, в методе SetValue используется класс GPSCoordinates.
Класс GPSCoordinates
Google Maps выдает координаты в десятичной форме, в Exif данные пишутся в виде массива байтов (об этом — ниже).
Класс GPSCoordinates переводит десятичные GPS координаты в формат DMS (Degrees, Minutes, Seconds).
Метод GetExifBytes() возвращает массив байтов подходящий для записи в Exif, об этом — в следующей части статьи.
- internal class GPSCoordinate
- private readonly double _coord;
- public byte Degrees
- public byte Minutes
- public double Seconds
- public char Reference
- public GPSCoordinate( double coord, GPSCoordinateType type)
- _coord = Math .Abs(coord);
- Degrees = ( byte )_coord;
- double minutes = (_coord - Degrees) * 60;
- Minutes = ( byte )minutes;
- Seconds = Math .Round((minutes - Minutes) * 60, 2);
- if (type == GPSCoordinateType.Latitude)
- Reference = coord < 0 ? 'S' : 'N' ;
- else
- Reference = coord < 0 ? 'W' : 'E' ;
- >
- public override string ToString()
- return string .Format( " ° ' \"" , Reference, Degrees, Minutes, Seconds);
- >
- public byte [] GetExifBytes()
- var bytes = new byte [24];
- for ( int i = 0; i < 24; i++)
- bytes[i] = 0;
- bytes[0] = Degrees;
- bytes[4] = 1;
- bytes[8] = Minutes;
- bytes[12] = 1;
- int seconds = ( int ) (Seconds*100);
- byte [] temp = BitConverter.GetBytes(seconds);
- Array.Copy(temp, 0, bytes, 16, 4);
- bytes[20] = 100;
- return bytes;
- >
- >
- internal enum GPSCoordinateType
- Latitude,
- Longitude
- >
Итак на данный момент мы имеем рабочую карту с поиском и вытягиванием координат в удобоваримом для дальнейших действий виде. Осталось прописать эти данные в Exif заголовок JPEG файла.
Добавление тегов в JPEG файл
Спецификация Exif 2.2 определяет кучу GPS тегов, однако для нашей задачи нам достаточно воспользоваться следуюшими:
Tag Name | Field Name | ID (Dec) | ID (Hex) | Type | Bytes Count |
GPS tag version | GPSVersionID | 0 | 0 | BYTE | 4 |
North or South Latitude | GPSLatitudeRef | 1 | 1 | ASCII | 2 |
Latitude | GPSLatitude | 2 | 2 | RATIONAL | 3 |
East or West Longitude | GPSLongitudeRef | 3 | 3 | ASCII | 2 |
Longitude | GPSLongitude | 4 | 4 | RATIONAL | 3 |
Но не тут-то было, по каким-то, несомненно веским причинам, Microsoft закрыл конструктор данного типа, поэтому создать новый обьект при помощи new не получится.
Данное ограничение можно, конечно, обойти при помощо рефлексии (reflection), но производительность этого подхода оставляет желать лучшего. Есть и другой метод обхода — создать JPEG файл-«заглушку» с GPS тегами, потом брать их из него при помощи GetPropertyItem, менять данные на нужные нам и добавлять в новый файл.
Данный код демонстрирует этот подход (файл-«заглушка» для удобства перемещен в ресурсы проекта):
- private void btnWriteTag_Click( object sender, EventArgs e)
- if (_image == null || _latitude == null || _longitude == null )
- return ;
- // GPS Tag Version
- PropertyItem pitem = CreateNewPropertyItem(0x0);
- pitem.Value[0] = 2;
- pitem.Value[1] = 2;
- _image.SetPropertyItem(pitem);
- // Latitude
- pitem = CreateNewPropertyItem(0x2);
- pitem.Value = _latitude.GetExifBytes();
- _image.SetPropertyItem(pitem);
- // LatitudeRef (North or South)
- pitem = CreateNewPropertyItem(0x1);
- pitem.Value[0] = ( byte )_latitude.Reference;
- _image.SetPropertyItem(pitem);
- // Longitude
- pitem = CreateNewPropertyItem(0x4);
- pitem.Value = _longitude.GetExifBytes();
- _image.SetPropertyItem(pitem);
- // LatitudeRef (East or West)
- pitem = CreateNewPropertyItem(0x3);
- pitem.Value[0] = ( byte )_longitude.Reference;
- _image.SetPropertyItem(pitem);
- >
- private static PropertyItem CreateNewPropertyItem( int id)
- return Resources.gps_jpg.GetPropertyItem(id);
- >
Конечно оба метода (описаный выше, и на основе рефлексии) не очень эстетичны, может в будущем MS даст возможность создавать обьекты типа PropertyItem и эти костыли более не понадобятся.
Нам осталось только сохранить файл с новыми тегами:
- if (_saveFileDialog.ShowDialog() == DialogResult.OK)
- _image.Save(_saveFileDialog.FileName);
- >
Кстати, данные изменения не приводят к необходимости перекодирования файла, т.к. они касаються только мета-информации.
Эпилог
Ну вот, собственно, и все. Остается добавить что координаты записаные в полученые в итоге файлы файлы спокойно определяются Flickr-ом и Яндекс-Фотками, почему-то PicasaWeb не хочет понимает координаты, хотя у десктопной Picasa таких проблем нет.
Покопавшись в сети нашел много баг-репортов с той же проблемой, скорее всего проблема у PicasaWeb, хотя никто кроме страждущих в баг-репортах не отписывался.
Исходники проекта можно скачать тут.
ВНИМАНИЕ: В примере отсутствуют проверки на все что возможно, код был написан за час и не является готовой программой для геотеггинга, скорее proof-of-concept, так что делайте бекапы. За сохранность фоток редакция ответственности не несет ;)
Читайте также: