我正在构建一个Flutter应用程序,用户可以发布照片和它的位置。用户可以从相机或库中获取图片。如果用户从相机拍照,我可以使用设备的GPS位置来设置图片的位置。我试图根据其元数据获得图片的GSP位置,但是,我还没有找到一种方法来做到这一点。有可能做到吗?最好的方法是什么?编辑:我把“GPS”放在问题里是为了说清楚,我是想发现照片拍摄的物理位置,我还把“Flutter”加到问题里是为了说清楚,我正面临着在Flutter App里解决这个问题的问题。
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); }
34gzjxbg2#
如果图像是JPEG或RAW图像文件,则地理位置元数据存储为Exif标签。在Android中,这是通过ExifInterface类完成的。标签为TAG_GPS_LATITUDE和TAG_GPS_LONGITUDE:https://developer.android.com/reference/android/media/ExifInterface.html请注意,坐标需要以有理格式表示:度、分和秒,如dd/1,mm/1,ss/1。
ExifInterface
TAG_GPS_LATITUDE
TAG_GPS_LONGITUDE
dd/1,mm/1,ss/1
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); }
}
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; }
4条答案
按热度按时间kmbjn2e31#
我发现我之前的问题与设备的相机权限有关。通常Android的相机会访问用户位置并将GPS坐标保存为Exif标签,但iOS设备通常不会默认保存此内容,除非用户允许相机应用程序的位置权限。
我改变了我的应用程序,以检查图像是否有GPS坐标,用户决定是否要分享他的实际位置或图像位置。
我还需要做一些数学运算来处理坐标:
为了使用代码,你必须将exif和geoflutterfire软件包添加到你的应用程序中。
34gzjxbg2#
如果图像是JPEG或RAW图像文件,则地理位置元数据存储为Exif标签。在Android中,这是通过
ExifInterface
类完成的。标签为
TAG_GPS_LATITUDE
和TAG_GPS_LONGITUDE
:https://developer.android.com/reference/android/media/ExifInterface.html请注意,坐标需要以有理格式表示:度、分和秒,如
dd/1,mm/1,ss/1
。wfypjpf43#
}
i7uaboj44#
你也可以使用flutter native_exif package来获取坐标。