You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:22:07