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插件中使用。

