Flutter地理坐标转换插件latlong_to_osgrid的使用
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网格
以下函数返回一个具有easting
和northing
属性的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网格获取纬度和经度
以下函数返回一个具有lat
、long
、height
和datum
属性的LatLong对象。由该函数得出的纬度和经度以十进制形式返回。(请参阅下文将其转换为度、分、秒)。使用LatLongConverter对象,调用getLatLongFromOSGB()
函数,并传入OS网格参考的东向和北向值。
可以通过调用转换器的getLatLongFromOSGBLetterRef()
函数来提供字母对格式的OS网格参考(例如TG 51409 13177),而不是单独给出东向和北向。如果你自己创建了一个OSRef对象,则可以在创建时使用东向和北向或字母对参考中的任何一个,另一个将在创建时生成,并可以通过OSRef对象的numericalRef
和letterRef
属性访问。
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
更多关于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
插件进行地理坐标转换!