Flutter地理坐标转换插件coordtransform的使用
Flutter地理坐标转换插件coordtransform的使用
coordtransform
是一个用于在Flutter中进行不同地理坐标系之间相互转换的插件。它支持百度坐标系(BD-09)、火星坐标系(国测局坐标系、GCJ02)和WGS84坐标系之间的转换。
Getting Started
安装
首先,在你的pubspec.yaml
文件中添加依赖:
dependencies:
coordtransform: ^latest_version
然后运行flutter pub get
来安装该插件。
使用示例
以下是一个完整的示例demo,展示了如何使用coordtransform
插件来进行坐标转换:
import 'package:coordtransform/coordtransform.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'CoordTransformExample',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(title: 'Coord Transform Example'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late TextEditingController lonTextEditingController, latTextEditingController;
late RegExp lonRegExp, latRegExp;
double longitude = 116.404, latitude = 39.915;
String? lonError, latError;
@override
void initState() {
lonTextEditingController = TextEditingController(text: '$longitude');
latTextEditingController = TextEditingController(text: '$latitude');
lonRegExp = RegExp(r'^[\-\+]?(0(\.\d{1,10})?|([1-9](\d)?)(\.\d{1,10})?|1[0-7]\d{1}(\.\d{1,10})?|180\.0{1,10})$');
latRegExp = RegExp(r'^[\-\+]?((0|([1-8]\d?))(\.\d{1,10})?|90(\.0{1,10})?)$');
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: Center(
child: Column(
children: <Widget>[
IntrinsicHeight(
child: Row(
children: [
Expanded(
child: Container(
padding: EdgeInsets.all(24),
child: TextField(
controller: lonTextEditingController,
decoration: InputDecoration(
helperText: "Please input longitude",
errorText: lonError,
),
),
),
),
Expanded(
child: Container(
padding: EdgeInsets.all(24),
child: TextField(
controller: latTextEditingController,
decoration: InputDecoration(
helperText: "Please input latitude",
errorText: latError,
),
),
),
),
Container(
padding: EdgeInsets.all(24),
child: TextButton(
onPressed: _transform,
child: Text("Transform"),
),
)
],
),
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformBD09toGCJ02(longitude, latitude);
return Text("BD09toGCJ02: ${result.lon}, ${result.lat}");
}),
Divider(height: 4),
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformGCJ02toBD09(longitude, latitude);
return Text("GCJ02toBD09: ${result.lon}, ${result.lat}");
}),
Divider(height: 4),
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformWGS84toGCJ02(longitude, latitude);
return Text("WGS84toGCJ02: ${result.lon}, ${result.lat}");
}),
Divider(height: 4),
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformGCJ02toWGS84(longitude, latitude);
return Text("GCJ02toWGS84: ${result.lon}, ${result.lat}");
}),
Divider(height: 4),
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformBD09toWGS84(longitude, latitude);
return Text("BD09toWGS84: ${result.lon}, ${result.lat}");
}),
Divider(height: 4),
Builder(builder: (ctx) {
CoordResult result = CoordTransform.transformWGS84toBD09(longitude, latitude);
return Text("WGS84toBD09: ${result.lon}, ${result.lat}");
}),
],
),
),
],
),
),
);
}
void _transform() {
lonError = lonRegExp.hasMatch(lonTextEditingController.text)
? null
: 'Longitude input error';
latError = latRegExp.hasMatch(latTextEditingController.text)
? null
: 'Latitude input error';
if (lonError == null && latError == null) {
longitude = double.parse(lonTextEditingController.text);
latitude = double.parse(latTextEditingController.text);
}
setState(() {});
}
}
这个示例应用提供了一个简单的界面,允许用户输入经度和纬度,并通过点击“Transform”按钮将这些坐标从一种坐标系转换为另一种。转换结果会显示在界面上。
更多关于Flutter地理坐标转换插件coordtransform的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地理坐标转换插件coordtransform的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用coordtransform
插件进行地理坐标转换的示例代码。coordtransform
插件主要用于在WGS-84(GPS坐标)、GCJ-02(中国国测局坐标)、BD-09(百度坐标)之间进行转换。
首先,你需要在pubspec.yaml
文件中添加coordtransform
依赖:
dependencies:
flutter:
sdk: flutter
coordtransform: ^2.0.0 # 请检查最新版本号
然后,运行flutter pub get
命令来获取依赖。
接下来,你可以在你的Flutter应用中编写代码来使用这个插件。以下是一个简单的示例,展示如何进行坐标转换:
import 'package:flutter/material.dart';
import 'package:coordtransform/coordtransform.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Coordinate Transform Demo',
home: Scaffold(
appBar: AppBar(
title: Text('Coordinate Transform Demo'),
),
body: Center(
child: TransformCoordinates(),
),
),
);
}
}
class TransformCoordinates extends StatefulWidget {
@override
_TransformCoordinatesState createState() => _TransformCoordinatesState();
}
class _TransformCoordinatesState extends State<TransformCoordinates> {
final CoordTransform coordTransform = CoordTransform();
void _convertCoordinates() {
// 示例坐标:WGS-84
double wgsLat = 39.9042; // 纬度
double wgsLng = 116.4074; // 经度
// 转换为GCJ-02
List<double> gcj02Coords = coordTransform.wgs84ToGcj02(wgsLat, wgsLng);
print('GCJ-02: Latitude = ${gcj02Coords[0]}, Longitude = ${gcj02Coords[1]}');
// 转换为BD-09
List<double> bd09Coords = coordTransform.gcj02ToBd09(gcj02Coords[0], gcj02Coords[1]);
print('BD-09: Latitude = ${bd09Coords[0]}, Longitude = ${bd09Coords[1]}');
// 从BD-09转换回WGS-84
List<double> backToWgs84 = coordTransform.bd09ToWgs84(bd09Coords[0], bd09Coords[1]);
print('Back to WGS-84: Latitude = ${backToWgs84[0]}, Longitude = ${backToWgs84[1]}');
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _convertCoordinates,
child: Text('Convert Coordinates'),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。点击按钮时,它会执行_convertCoordinates
方法,该方法将一个WGS-84坐标转换为GCJ-02和BD-09坐标,然后再转换回WGS-84坐标,并在控制台中打印结果。
注意:由于Flutter的控制台输出在移动设备上不可见,你可能需要在Android Studio或VS Code的模拟器或连接的真实设备上运行此代码,并通过IDE的控制台窗口查看输出。或者在Flutter Web上运行并查看浏览器控制台。
希望这个示例对你有所帮助!