Flutter地理坐标转换插件coordtransform的使用

发布于 1周前 作者 vueper 来自 Flutter

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

1 回复

更多关于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上运行并查看浏览器控制台。

希望这个示例对你有所帮助!

回到顶部