可以从图像获取图像GPS位置坐标吗?

时间:2019-03-08 09:14:13

标签: flutter geolocation

我正在构建Flutter应用程序,用户可以在其中发布照片及其位置。使用者都可以从相机或图库中获取图片。

如果用户使用相机拍照,则可以使用设备的GPS位置来设置图片的位置。我正在尝试根据图片的元数据获取图片的GSP位置,但是我还没有找到一种方法。

有可能做到吗?最好的方法如何?

编辑:我在问题中输入“ GPS”以使其清楚。我试图发现照片的实际位置。我还在问题中添加了“ Flutter”,以明确说明我正面临在Flutter App中解决此问题的问题。

2 个答案:

答案 0 :(得分:1)

如果图像是JPEG或RAW图像文件,则地理位置元数据将存储为Exif标记。在Android中,这是通过ExifInterface类完成的。

标记为TAG_GPS_LATITUDETAG_GPS_LONGITUDEhttps://developer.android.com/reference/android/media/ExifInterface.html

请注意,坐标必须以合理的格式表示:度,分钟和秒,以dd/1,mm/1,ss/1表示。

答案 1 :(得分:0)

我发现以前的问题与设备的“摄像头”权限有关。通常,来自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);
}