Flutter如何将geolocator坐标转换为百度地图坐标
我在Flutter中使用geolocator插件获取到了GPS坐标,但需要将这些坐标显示在百度地图上。由于百度地图使用的是BD09坐标系,而geolocator返回的是WGS84坐标,请问应该如何正确转换?有没有现成的Dart库或方法可以实现这个坐标转换?最好能提供具体的代码示例。
        
          2 回复
        
      
      
        使用百度地图官方SDK的BaiduMapApi.convertCoord方法,传入经纬度坐标和坐标类型,即可将geolocator获取的GPS坐标转换为百度地图坐标。
更多关于Flutter如何将geolocator坐标转换为百度地图坐标的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中将Geolocator获取的GPS坐标(WGS-84坐标系)转换为百度地图坐标(BD-09坐标系),可以通过以下步骤实现:
方法一:使用第三方库
推荐使用 flutter_bmfutils 库:
- 添加依赖
 
dependencies:
  flutter_bmfutils: ^1.0.0
- 坐标转换代码
 
import 'package:flutter_bmfutils/flutter_bmfutils.dart';
// 将WGS-84坐标转换为百度坐标
LatLng convertToBaiduCoord(double lat, double lng) {
  // 创建坐标转换工具
  CoordinateConverter converter = CoordinateConverter();
  
  // 进行坐标转换
  // from: CoordType.GPS (WGS-84)
  // to: CoordType.BD09LL (百度坐标系)
  BMFCoordinate targetCoord = converter.convert(
    BMFCoordinate(lat, lng),
    from: BMFCoordType.GPS,
    to: BMFCoordType.BD09LL,
  );
  
  return LatLng(targetCoord.latitude, targetCoord.longitude);
}
// 使用示例
void convertCoordinate() async {
  // 获取当前位置(WGS-84坐标)
  Position position = await Geolocator.getCurrentPosition();
  
  // 转换为百度坐标
  LatLng baiduCoord = convertToBaiduCoord(
    position.latitude, 
    position.longitude
  );
  
  print('原始坐标: ${position.latitude}, ${position.longitude}');
  print('百度坐标: ${baiduCoord.latitude}, ${baiduCoord.longitude}');
}
方法二:手动实现转换算法
如果不想引入额外依赖,可以使用转换公式:
class CoordinateConverter {
  static const double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
  static const double PI = 3.1415926535897932384626;
  static const double a = 6378245.0;
  static const double ee = 0.00669342162296594323;
  // WGS-84 转 GCJ-02(火星坐标)
  static List<double> wgs84ToGcj02(double lng, double lat) {
    if (_outOfChina(lng, lat)) {
      return [lng, lat];
    }
    
    double dlat = _transformLat(lng - 105.0, lat - 35.0);
    double dlng = _transformLng(lng - 105.0, lat - 35.0);
    
    double radlat = lat / 180.0 * PI;
    double magic = sin(radlat);
    magic = 1 - ee * magic * magic;
    
    double sqrtmagic = sqrt(magic);
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
    dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);
    
    double mglat = lat + dlat;
    double mglng = lng + dlng;
    
    return [mglng, mglat];
  }
  // GCJ-02 转 BD-09(百度坐标)
  static List<double> gcj02ToBd09(double lng, double lat) {
    double z = sqrt(lng * lng + lat * lat) + 0.00002 * sin(lat * x_PI);
    double theta = atan2(lat, lng) + 0.000003 * cos(lng * x_PI);
    
    double bd_lng = z * cos(theta) + 0.0065;
    double bd_lat = z * sin(theta) + 0.006;
    
    return [bd_lng, bd_lat];
  }
  // WGS-84 直接转 BD-09
  static List<double> wgs84ToBd09(double lng, double lat) {
    List<double> gcj02 = wgs84ToGcj02(lng, lat);
    return gcj02ToBd09(gcj02[0], gcj02[1]);
  }
  // 辅助方法
  static bool _outOfChina(double lng, double lat) {
    return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
  }
  
  static double _transformLat(double lng, double lat) {
    // 转换算法实现...
    return -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 
           0.1 * lng * lat + 0.2 * sqrt(lng.abs());
  }
  
  static double _transformLng(double lng, double lat) {
    // 转换算法实现...
    return 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 
           0.1 * lng * lat + 0.1 * sqrt(lng.abs());
  }
}
// 使用示例
void main() {
  // 从Geolocator获取的坐标
  double wgs84Lng = 116.397428;
  double wgs84Lat = 39.90923;
  
  // 转换为百度坐标
  List<double> bd09Coord = CoordinateConverter.wgs84ToBd09(wgs84Lng, wgs84Lat);
  
  print('百度坐标: ${bd09Coord[0]}, ${bd09Coord[1]}');
}
推荐方案
建议使用方法一的 flutter_bmfutils 库,因为:
- 官方维护,准确性更高
 - 代码更简洁
 - 支持更多坐标系转换
 - 避免自己实现算法的潜在误差
 
转换后的坐标即可直接在百度地图Flutter插件中使用。
        
      
            
            
            
