Flutter地理位置获取插件latlong2的使用

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

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

1 回复

更多关于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}',
                ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例代码做了以下几件事:

  1. 检查位置服务是否启用。
  2. 检查并请求位置权限。
  3. 获取当前位置并将其转换为 LatLng 对象(来自 latlong2 插件)。
  4. 显示当前位置的经纬度。

请确保在实际应用中处理权限请求失败的情况,并根据需要调整UI和用户体验。

回到顶部