Flutter/Dart中如何获取DMS格式的地理位置?
十进制经纬度转度分秒(DMS)格式的解决方案
geolocator本身没有直接提供十进制转DMS的内置方法,但你可以通过两种方式实现需求:
一、手动实现转换逻辑(推荐,无额外依赖)
不要用字符串截取的方式,直接通过数学计算处理更可靠,以下是Dart环境下的实现示例:
// 将十进制经纬度转为DMS格式 String decimalToDMS(double decimal, bool isLatitude) { // 取绝对值处理度分秒,最后再添加方向标识 final absDecimal = decimal.abs(); // 度:取整数部分 final degrees = absDecimal.floor(); // 分:剩余小数部分×60后取整数 final minutes = ((absDecimal - degrees) * 60).floor(); // 秒:剩余部分×3600后保留两位小数 final seconds = ((absDecimal - degrees - minutes / 60) * 3600).toStringAsFixed(2); // 根据经纬度类型和正负确定方向 final direction = isLatitude ? decimal >= 0 ? 'N' : 'S' : decimal >= 0 ? 'E' : 'W'; return '$degrees° $minutes\' $seconds" $direction'; } // 使用示例 void main() { // 从geolocator获取的十进制纬度、经度 final latitude = 31.2304; final longitude = 121.4737; print(decimalToDMS(latitude, true)); // 输出:31° 13' 49.44" N print(decimalToDMS(longitude, false)); // 输出:121° 28' 25.32" E }
这个方法的核心是通过数学拆分度、分、秒的数值,避免字符串截取可能出现的精度或格式错误。
二、使用第三方库简化操作
如果不想自己写逻辑,可以用latlong2这类轻量地理工具库,它内置了DMS转换的方法:
import 'package:latlong2/latlong2.dart'; void main() { // 从geolocator获取的经纬度 final lat = 31.2304; final lng = 121.4737; // 转为DMS格式 final dmsLat = LatLng(lat, lng).latitude.toDMS(LatitudeLongitude.latitude); final dmsLng = LatLng(lat, lng).longitude.toDMS(LatitudeLongitude.longitude); print(dmsLat); // 31° 13' 49.44" N print(dmsLng); // 121° 28' 25.32" E }
内容的提问来源于stack exchange,提问作者DxZ Gus
相关产品推荐
相关产品推荐

