flutter 是否可以从图像中获取图像GPS位置坐标?

myss37ts  于 2023-03-31  发布在  Flutter
关注(0)|答案(4)|浏览(293)

我正在构建一个Flutter应用程序,用户可以发布照片和它的位置。用户可以从相机或库中获取图片。
如果用户从相机拍照,我可以使用设备的GPS位置来设置图片的位置。我试图根据其元数据获得图片的GSP位置,但是,我还没有找到一种方法来做到这一点。
有可能做到吗?最好的方法是什么?
编辑:我把“GPS”放在问题里是为了说清楚,我是想发现照片拍摄的物理位置,我还把“Flutter”加到问题里是为了说清楚,我正面临着在Flutter App里解决这个问题的问题。

kmbjn2e3

kmbjn2e31#

我发现我之前的问题与设备的相机权限有关。通常Android的相机会访问用户位置并将GPS坐标保存为Exif标签,但iOS设备通常不会默认保存此内容,除非用户允许相机应用程序的位置权限。
我改变了我的应用程序,以检查图像是否有GPS坐标,用户决定是否要分享他的实际位置或图像位置。
我还需要做一些数学运算来处理坐标:
为了使用代码,你必须将exif和geoflutterfire软件包添加到你的应用程序中。

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);
}
34gzjxbg

34gzjxbg2#

如果图像是JPEG或RAW图像文件,则地理位置元数据存储为Exif标签。在Android中,这是通过ExifInterface类完成的。
标签为TAG_GPS_LATITUDETAG_GPS_LONGITUDEhttps://developer.android.com/reference/android/media/ExifInterface.html
请注意,坐标需要以有理格式表示:度、分和秒,如dd/1,mm/1,ss/1

wfypjpf4

wfypjpf43#

exifLatitudeLongitudePoint(var data) async{
if (data.containsKey('GPS GPSLongitude')) {
  final gpsLatitude = data['GPS GPSLatitude'];
  final latitudeSignal = data['GPS GPSLatitudeRef']!.printable;
  List latitudeRation = gpsLatitude!.values.toList();
  List latitudeValue = latitudeRation.map((item) {
    return (item.numerator.toDouble() / item.denominator.toDouble());
  }).toList();
  double latitude = latitudeValue[0] + (latitudeValue[1] / 60) + (latitudeValue[2] / 3600);
  if (latitudeSignal == 'S') latitude = -latitude;
  latValue(latitude);

  final gpsLongitude = data['GPS GPSLongitude'];
  final longitudeSignal = data['GPS GPSLongitude']!.printable;
  List longitudeRation = gpsLongitude!.values.toList();
  List longitudeValue = longitudeRation.map((item) {
    return (item.numerator.toDouble() / item.denominator.toDouble());
  }).toList();
  double longitude =longitudeValue[0] + (longitudeValue[1] / 60) + (longitudeValue[2] / 3600);
  if (longitudeSignal == 'W') longitude = -longitude;
  lngValue(longitude);
}

}

i7uaboj4

i7uaboj44#

你也可以使用flutter native_exif package来获取坐标。

Future<GeoPoint?> getLocationDataFromImage(String filePath) async {
        GeoPoint? preciseLocation;
        final exif = await Exif.fromPath(filePath);
        final latLong = await exif.getLatLong();
        await exif.close();
        if (latLong != null) {
          preciseLocation = GeoPoint(latLong.latitude, latLong.longitude);
          return preciseLocation;
        }
        return null;
      }

相关问题