Можно ли получить координаты местоположения изображения GPS из изображения? - PullRequest
1 голос
/ 08 марта 2019

Я создаю приложение Flutter, в котором пользователь может опубликовать фотографию и узнать ее местоположение.Использование может как получить изображение с камеры или из библиотеки.

Если пользователь делает снимок с камеры, я могу использовать GPS-местоположение устройства, чтобы установить местоположение изображения.Я пытаюсь определить местоположение изображений в GSP на основе их метаданных, но пока не нашел способа сделать это.

Возможно ли это сделать?Как лучше всего?

Редактировать: Я поставил "GPS" в вопросе, чтобы было понятно.Я пытаюсь определить физическое положение, где была сделана фотография.Я также добавил «Флаттер» к вопросу, чтобы было ясно, что я сталкиваюсь с проблемой решения этой проблемы в приложении Флаттер.

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Метаданные геолокации сохраняются в виде тегов Exif при условии, что изображение представляет собой файл изображения JPEG или RAW.В Android это делается через класс ExifInterface.

Теги TAG_GPS_LATITUDE и TAG_GPS_LONGITUDE: https://developer.android.com/reference/android/media/ExifInterface.html

Обратите внимание, что координаты должны быть выражены в рациональном формате: градусы, минуты и секунды, как dd/1,mm/1,ss/1.

0 голосов
/ 28 мая 2019

Я обнаружил, что моя предыдущая проблема была связана с разрешениями камеры для устройств. Обычно камера с Android получает доступ к местоположению пользователя и сохраняет координаты GPS в виде тега Exif, но устройства ios обычно не сохраняют это по умолчанию, если пользователь не разрешает доступ к приложению камеры.

Я изменил свое приложение, чтобы проверить, имеет ли изображение координаты GPS, и пользователь решает, хочет ли он поделиться своим фактическим местоположением или местоположением изображения.

Я также должен сделать некоторую математику для обработки координат:

void _checkGPSData() async {
    Map<String, IfdTag> imgTags = await readExifFromBytes( File(image.path).readAsBytesSync() );

    if (imgTags.containsKey('GPS GPSLongitude')) {
      setState(() {
        _imgHasLocation = true;
        _imgLocation = exifGPSToGeoFirePoint(imgTags);
      });
    }

  }


GeoFirePoint exifGPSToGeoFirePoint(Map<String, IfdTag> tags) {

  final latitudeValue = tags['GPS GPSLatitude'].values.map<double>( (item) => (item.numerator.toDouble() / item.denominator.toDouble()) ).toList();
  final latitudeSignal = tags['GPS GPSLatitudeRef'].printable;


  final longitudeValue = tags['GPS GPSLongitude'].values.map<double>( (item) => (item.numerator.toDouble() / item.denominator.toDouble()) ).toList();
  final longitudeSignal = tags['GPS GPSLongitudeRef'].printable;

  double latitude = latitudeValue[0]
    + (latitudeValue[1] / 60)
    + (latitudeValue[2] / 3600);

  double longitude = longitudeValue[0]
    + (longitudeValue[1] / 60)
    + (longitudeValue[2] / 3600);

  if (latitudeSignal == 'S') latitude = -latitude;
  if (longitudeSignal == 'W') longitude = -longitude;

  return  GeoFirePoint(latitude, longitude);
}
...