Flutter地理位置获取插件latlong2的使用
Flutter地理位置获取插件latlong2的使用
latlong2
是一个用于处理经纬度计算的轻量级库,它支持"Haversine"和"Vincenty"两种算法。"Haversine"算法更快,而"Vincenty"算法更准确。此外,还提供了路径平滑等功能。
基本用法
计算距离
import 'package:latlong2/latlong.dart';
void main() {
final Distance distance = Distance();
// 计算两点之间的距离(单位:千米)
final int km = distance.as(LengthUnit.Kilometer,
LatLng(52.518611, 13.408056), LatLng(51.519475, 7.46694444));
// 计算两点之间的距离(单位:米)
final int meter = distance(
LatLng(52.518611, 13.408056), LatLng(51.519475, 7.46694444));
print('km: $km, meter: $meter');
}
计算偏移点
import 'package:latlong2/latlong.dart';
import 'dart:math' as math;
void main() {
final Distance distance = const Distance();
final num earthRadius = 6371000.0;
final num distanceInMeter = (earthRadius * math.pi / 4).round();
final p1 = LatLng(0.0, 0.0);
final p2 = distance.offset(p1, distanceInMeter, 180);
// 输出格式化后的坐标
print(p2.round());
print(p2.toSexagesimal());
}
路径平滑
import 'package:latlong2/latlong.dart';
void main() {
// 假设zigzag是一个包含多个坐标的列表
List<LatLng> zigzag = [
LatLng(0.0, 0.0),
LatLng(1.0, 1.0),
LatLng(2.0, 0.0),
LatLng(3.0, 1.0),
LatLng(4.0, 0.0)
];
final Path path = Path.from(zigzag);
// 平滑路径并分成8段
final Path steps = path.equalize(8, smoothPath: true);
// 打印平滑后的路径点
for (var point in steps.points) {
print(point);
}
}
完整示例Demo
以下是一个完整的Flutter应用程序示例,展示了如何使用latlong2
来计算两个地点之间的距离,并在地图上显示这两个地点:
import 'package:flutter/material.dart';
import 'package:latlong2/latlong.dart';
import 'package:flutter_map/flutter_map.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter latlong2 Example')),
body: Center(
child: MapExample(),
),
),
);
}
}
class MapExample extends StatefulWidget {
@override
_MapExampleState createState() => _MapExampleState();
}
class _MapExampleState extends State<MapExample> {
LatLng _location1 = LatLng(52.518611, 13.408056);
LatLng _location2 = LatLng(51.519475, 7.46694444);
double _distance = 0.0;
@override
void initState() {
super.initState();
_calculateDistance();
}
void _calculateDistance() {
final Distance distance = Distance();
_distance = distance(_location1, _location2);
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Expanded(
child: FlutterMap(
options: MapOptions(
center: LatLng(52.0, 10.0),
zoom: 5.0,
),
layers: [
TileLayerOptions(
urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
subdomains: ['a', 'b', 'c'],
),
MarkerLayerOptions(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: _location1,
builder: (ctx) => Container(
child: Icon(Icons.location_on, color: Colors.red, size: 40.0),
),
),
Marker(
width: 80.0,
height: 80.0,
point: _location2,
builder: (ctx) => Container(
child: Icon(Icons.location_on, color: Colors.blue, size: 40.0),
),
),
],
),
],
),
),
Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Distance between two locations: ${_distance.toStringAsFixed(2)} meters',
style: TextStyle(fontSize: 18.0),
),
),
],
);
}
}
这个示例程序会创建一个简单的Flutter应用,其中包含一个地图,上面标记了两个地点,并在下方显示这两个地点之间的距离。通过这种方式,您可以直观地看到latlong2
库的功能和效果。
希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter地理位置获取插件latlong2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地理位置获取插件latlong2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用Flutter地理位置获取插件 latlong2
的示例代码。不过,需要指出的是,latlong2
插件本身主要用于处理地理位置数据(经纬度等),而不是直接用于获取地理位置。通常,你会结合如 geolocator
插件来获取地理位置,然后使用 latlong2
来处理这些数据。
首先,确保你的 pubspec.yaml
文件中包含以下依赖:
dependencies:
flutter:
sdk: flutter
geolocator: ^9.0.2 # 最新版本号可能会有所不同,请查看pub.dev获取最新
latlong2: ^0.8.1 # 最新版本号可能会有所不同,请查看pub.dev获取最新
然后运行 flutter pub get
来安装这些依赖。
接下来是示例代码,展示如何使用 geolocator
获取地理位置并使用 latlong2
来处理这些数据:
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geolocator/geolocation_status.dart';
import 'package:latlong2/latlong2.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
LatLng? _position;
bool _serviceEnabled = false;
LocationPermission _permission = LocationPermission.denied;
GeolocationStatus? _locationStatus = GeolocationStatus.unknown;
Future<void> _checkLocationPermission() async {
_serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!_serviceEnabled) {
return Future.error('Location services are disabled.');
}
_permission = await Geolocator.checkPermission();
if (_permission == LocationPermission.denied) {
_permission = await Geolocator.requestPermission();
if (_permission == LocationPermission.denied) {
return Future.error('Location permissions are denied');
}
}
if (_permission == LocationPermission.deniedForever) {
return Future.error(
'Location permissions are permanently denied, we cannot request permissions.');
}
_locationStatus = await Geolocator.checkGeolocationStatus(forceAndroidLocationManager: true);
if (!_locationStatus!.isGranted) {
return Future.error('Location access is denied');
}
}
Future<void> _getCurrentLocation() async {
bool serviceEnabled;
LocationPermission permission;
GeolocationStatus locationStatus;
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
return;
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
return;
}
}
if (permission == LocationPermission.deniedForever) {
return;
}
locationStatus = await Geolocator.checkGeolocationStatus(forceAndroidLocationManager: true);
if (!locationStatus.isGranted) {
return;
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
setState(() {
_position = LatLng(position.latitude!, position.longitude!);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Geolocation Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_serviceEnabled ? 'Location services are enabled.' : 'Location services are disabled.',
),
SizedBox(height: 10),
Text(
'$_permission',
),
SizedBox(height: 10),
if (_position == null)
ElevatedButton(
onPressed: () async {
try {
await _checkLocationPermission();
await _getCurrentLocation();
} catch (e) {
print(e);
}
},
child: Text('Get Current Location'),
)
else
Text(
'Latitude: ${_position!.latitude}, Longitude: ${_position!.longitude}',
),
],
),
),
),
);
}
}
这个示例代码做了以下几件事:
- 检查位置服务是否启用。
- 检查并请求位置权限。
- 获取当前位置并将其转换为
LatLng
对象(来自latlong2
插件)。 - 显示当前位置的经纬度。
请确保在实际应用中处理权限请求失败的情况,并根据需要调整UI和用户体验。