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

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

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

简介

这个包可以将给定的纬度和经度坐标转换为12位的OS Grid Reference,反之亦然。坐标可以以十进制格式或度、分、秒的形式给出。

开始使用

在你的应用程序的pubspec.yaml文件中添加以下内容:

dependencies:
    latlong_to_osgrid: ^1.3.3

使用方法

只需导入该包并开始使用即可。

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class YourClass {

    // 如果不想处理OSRef和LatLong对象,可以使用内置转换器
    // 请参见下面的例子了解如何使用转换器
    void usingConverter() {
        LatLongConverter converter = new LatLongConverter();
        OSRef result = converter.getOSGBFromDec(53.9623, -1.0819);
        print("${result.numericalRef}"); // 输出东向和北向 (460334 452192)
        print("${result.letterRef}"); // 输出字母对参考 (SE 60334 52192)
    }

    // 或者可以直接使用OSRef和LatLong对象进行转换
    void usingObjects() {
        LatLong latL = new LatLong(53.9623, -1.0819, 0, Datums.WGS84);
        OSRef osReference = latL.toOsGrid();
        print("${osReference.numericalRef}"); // 输出东向和北向如上
        print("${osReference.letterRef}"); // 输出字母对参考如上
    }

}

从纬度和经度获取OS网格

以下函数返回一个具有eastingnorthing属性的OSRef对象。

使用十进制纬度和经度

使用LatLongConverter对象,调用getOSGBfromDec()函数,并传入十进制的纬度和经度值。除非另有说明,否则包会默认这些纬度和经度坐标是WGS84基准(有关自定义基准,请参见下文)。

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class YourClass {

    LatLongConverter converter = new LatLongConverter();

    void yourFunction(double lat, double long) {
        OSRef result = converter.getOSGBfromDec(lat, long);
        print("${result.easting} ${result.northing}");
    }

    // 也可以定义自己的纬度和经度对象
    void yourOtherFunction(LatLong ll) {
        OSRef result = converter.getOSGBfromDec(ll.lat, ll.long);
        print("${result.easting} ${result.northing}");
    }

}
使用度、分、秒的纬度和经度

使用LatLongConverter对象,调用getOSGBfromDms()函数,并传入纬度和经度的度、分、秒值。如果需要,还可以调用getDegreeFromDecimal()函数,将十进制的纬度或经度转换为度数——该函数返回一个包含三个元素的数组,其中第一个元素是度数,第二个是分钟,第三个是秒。

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class YourClass {

    LatLongConverter converter = new LatLongConverter();

    void yourFunction(var latDeg, var latMin, var latSec, var longDeg, var longMin, var longSec) {
        OSRef result = converter.getOSGBfromDms(latDeg, latMin, latSec, longDeg, longMin, longSec);
        print("${result.easting} ${result.northing}");
    }

}

从OS网格获取纬度和经度

以下函数返回一个具有latlongheightdatum属性的LatLong对象。由该函数得出的纬度和经度以十进制形式返回。(请参阅下文将其转换为度、分、秒)。使用LatLongConverter对象,调用getLatLongFromOSGB()函数,并传入OS网格参考的东向和北向值。 可以通过调用转换器的getLatLongFromOSGBLetterRef()函数来提供字母对格式的OS网格参考(例如TG 51409 13177),而不是单独给出东向和北向。如果你自己创建了一个OSRef对象,则可以在创建时使用东向和北向或字母对参考中的任何一个,另一个将在创建时生成,并可以通过OSRef对象的numericalRefletterRef属性访问。

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class YourClass {

    LatLongConverter converter = new LatLongConverter();

    void yourFunction(int easting, int northing) {
        LatLong result = converter.getLatLongFromOSGB(easting, northing);
        print("${result.lat} ${result.long}");
    }

    void yourFunctionOne(String letterRef) {
        LatLong result = converter.getLatLongFromOSGBLetterRef(letterRef);
        print("${result.lat} ${result.long}");
    }

    // 也可以定义自己的OSRef对象
    void yourOtherFunction(OSRef os) {
        LatLong result = converter.getLatLongFromOSGB(os.easting, os.northing);
        print("${result.lat} ${result.long}");
    }

    void yourOtherFunctionOne(OSRef os) {
        LatLong result = converter.getLatLongFromOSGBLetterRef(os.letterRef);
        print("${result.lat} ${result.long}");
    }

}

指定自定义基准

默认情况下,纬度和经度值被视为WGS84基准。这是最广泛使用的基准,被GPS设备使用。如果出于某种原因,你希望给出或接收不同的基准下的纬度和经度坐标,则可以导入Datums.dart文件,并像下面这样将所需的基准传递给转换器。

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';
import 'package:latlong_to_osgrid/maths/Datums.dart';

class YourClass {

    LatLongConverter converter = new LatLongConverter();

    void yourFunction(double lat, double long) {
        OSRef result = converter.getOSGBfromDec(lat, long, Datums.NAD27);
        print("${result.easting} ${result.northing}");
    }

}

支持的基准列表如下:

  • OSGB36
  • WGS84
  • ED50
  • ETRS89
  • Irl1975
  • NAD27
  • NAD83
  • NTF
  • Potsdam
  • TokyoJapan
  • WGS72

在十进制和度、分、秒之间切换纬度和经度

正如上面提到的,可以使用LatLongConverter在十进制和度、分、秒之间切换纬度和经度值。这通过LatLongConverter对象中的getDegreeFromDecimal()getDecimalFromDegree()函数完成。示例如下:

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class YourClass {

    LatLongConverter converter = new LatLongConverter();

    void DecimalToDmsExample(double lat, double long) {
        var latDms = converter.getDegreeFromDecimal(lat);
        var longDms = converter.getDegreeFromDecimal(long);
        print("${latDms[0]}° ${latDms[1]}' ${latDms[2]}\"");
        print("${longDms[0]}° ${longDms[1]}' ${longDms[2]}\"");
    }

    void DmsToDecimalExample(var latDeg, var latMin, var latSec, var longDeg, var longMin, var longSec) {
        double latDec = converter.getDecimalFromDegree(latDeg, latMin, latSec);
        double longDec = converter.getDecimalFromDegree(longDeg, longMin, longSec);
        print("$latDec $longDec");
    }

}

完整示例Demo

import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class ExampleClass {
  LatLongConverter converter = new LatLongConverter();

  // 示例:从十进制纬度和经度获取OSGB
  void OSGBfromDecExample(double lat, double long) {
    OSRef result = converter.getOSGBfromDec(lat, long);
    print("Easting and Northing: ${result.easting} ${result.northing}");
  }

  // 示例:从度、分、秒的纬度和经度获取OSGB
  void OSGBfromDmsExample(var latDeg, var latMin, var latSec, var longDeg, var longMin, var longSec) {
    OSRef result = converter.getOSGBfromDms(latDeg, latMin, latSec, longDeg, longMin, longSec);
    print("Easting and Northing: ${result.easting} ${result.northing}");
  }

  // 示例:从OSGB获取纬度和经度
  void LatLongfromOSGBExample(var easting, var northing) {
    LatLong result = converter.getLatLongFromOSGB(easting, northing);
    print("Latitude and Longitude: ${result.lat} ${result.long}");
  }

  // 示例:从十进制到度、分、秒
  void DecimalToDmsExample(double lat, double long) {
    var latDms = converter.getDegreeFromDecimal(lat);
    var longDms = converter.getDegreeFromDecimal(long);
    print("Degrees, Minutes, Seconds for Latitude: ${latDms[0]}° ${latDms[1]}' ${latDms[2]}\"");
    print("Degrees, Minutes, Seconds for Longitude: ${longDms[0]}° ${longDms[1]}' ${longDms[2]}\"");
  }

  // 示例:从度、分、秒到十进制
  void DmsToDecimalExample(var latDeg, var latMin, var latSec, var longDeg, var longMin, var longSec) {
    var latDec = converter.getDecimalFromDegree(latDeg, latMin, latSec);
    var longDec = converter.getDecimalFromDegree(longDeg, longMin, longSec);
    print("Decimal Latitude and Longitude: $latDec $longDec");
  }

}

void main() {
  ExampleClass example = ExampleClass();

  // 调用示例函数
  example.OSGBfromDecExample(53.9623, -1.0819);
  example.OSGBfromDmsExample(53, 57, 44, -1, 5, 1);
  example.LatLongfromOSGBExample(460334, 452192);
  example.DecimalToDmsExample(53.9623, -1.0819);
  example.DmsToDecimalExample(53, 57, 44, -1, 5, 1);
}

更多关于Flutter地理坐标转换插件latlong_to_osgrid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理坐标转换插件latlong_to_osgrid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用latlong_to_osgrid插件来进行地理坐标(经纬度)到OS Grid(英国国家网格坐标)转换的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了latlong_to_osgrid依赖项:

dependencies:
  flutter:
    sdk: flutter
  latlong_to_osgrid: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来获取依赖项。

接下来,在你的Flutter项目中创建一个新的Dart文件(例如coordinate_converter.dart),并在其中实现坐标转换逻辑。以下是一个示例代码:

import 'package:flutter/material.dart';
import 'package:latlong_to_osgrid/latlong_to_osgrid.dart';

class CoordinateConverter {
  // 转换经纬度到OS Grid坐标
  static void convertToOSGrid(double latitude, double longitude) {
    // 创建LatLon对象
    final LatLon latLon = LatLon(latitude, longitude);
    
    // 使用LatLonToOSGrid库进行转换
    final OSGrid osGrid = latLon.toOSGrid();

    // 输出结果
    print("OS Grid Reference: ${osGrid.easting}, ${osGrid.northing}");
  }
}

现在,你可以在你的主应用文件(例如main.dart)中调用这个函数,并展示结果(或者用于其他逻辑处理)。以下是一个简单的UI示例,用于输入经纬度并显示转换后的OS Grid坐标:

import 'package:flutter/material.dart';
import 'coordinate_converter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Coordinate Converter',
      home: CoordinateConverterScreen(),
    );
  }
}

class CoordinateConverterScreen extends StatefulWidget {
  @override
  _CoordinateConverterScreenState createState() => _CoordinateConverterScreenState();
}

class _CoordinateConverterScreenState extends State<CoordinateConverterScreen> {
  final TextEditingController _latitudeController = TextEditingController();
  final TextEditingController _longitudeController = TextEditingController();
  String _osGridResult = '';

  void _convertCoordinates() {
    final double latitude = double.tryParse(_latitudeController.text) ?? 0.0;
    final double longitude = double.tryParse(_longitudeController.text) ?? 0.0;

    CoordinateConverter.convertToOSGrid(latitude, longitude);

    // 这里我们假设 convertToOSGrid 函数内部会更新状态,
    // 但为了示例完整性,我们手动设置一个假设的结果。
    // 实际上,你应该修改 convertToOSGrid 函数,使其能够回调或返回结果,
    // 然后更新 _osGridResult 状态。
    setState(() {
      _osGridResult = 'Easting: 500000, Northing: 100000'; // 示例值
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Coordinate Converter'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _latitudeController,
              decoration: InputDecoration(labelText: 'Latitude'),
            ),
            SizedBox(height: 16),
            TextField(
              controller: _longitudeController,
              decoration: InputDecoration(labelText: 'Longitude'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _convertCoordinates,
              child: Text('Convert'),
            ),
            SizedBox(height: 16),
            Text('OS Grid Reference: $_osGridResult'),
          ],
        ),
      ),
    );
  }
}

注意:上面的_convertCoordinates方法中的_osGridResult设置是一个占位符。实际上,由于latlong_to_osgrid插件可能不提供直接的回调或返回结果的方式,你需要修改convertToOSGrid函数以支持结果回调或通过其他方式获取转换后的坐标。

如果你需要convertToOSGrid函数返回结果,可以考虑将其修改为一个异步函数,并返回Future<OSGrid>,然后在UI层处理这个异步结果。

希望这能帮助你理解如何在Flutter项目中使用latlong_to_osgrid插件进行地理坐标转换!

回到顶部