简体   繁体   English

在 Flutter 中计算先前位置和当前位置之间的距离

[英]Calculate distance between previous location and current location in Flutter

I use the plugin Geolocator and I try to calculate the distance between my previous location and the current location.我使用插件Geolocator并尝试计算我以前的位置和当前位置之间的距离。 The only problem is that I don't know how to get the previous location.唯一的问题是我不知道如何获得以前的位置。 Is there any way to store it or to get it from Geolocator ?有没有办法存储它或从Geolocator获取它? This functionality will help me to calculate the distance while I'm driving a car (at the moment I use iOS simulator feature to simulate a freeway drive).此功能将帮助我在开车时计算距离(目前我使用 iOS 模拟器功能来模拟高速公路行驶)。 Here is my code:这是我的代码:

import 'package:geolocator/geolocator.dart';
import 'package:flutter/material.dart';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Distance between Locations',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LocationPage(),
    );
  }
}

class LocationPage extends StatefulWidget {
  LocationPage({Key key}) : super(key: key);

  @override
  _LocationPageState createState() => _LocationPageState();
}

class _LocationPageState extends State<LocationPage> {
  Position _currentPosition;
  Position _previousPosition;
  StreamSubscription<Position> _positionStream;
  double _distance;

  @override
  void initState() {
    super.initState();
    _calculateDistance();
  }

  Future _calculateDistance() async {
    _positionStream = Geolocator.getPositionStream(
            distanceFilter: 10, desiredAccuracy: LocationAccuracy.high)
        .listen((Position position) async {
      if ((await Geolocator.isLocationServiceEnabled())) {
        Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
            .then((Position position) {
          setState(() {
            _currentPosition = position;
            _distance = Geolocator.distanceBetween(
                51.9021777, // how to get the previous Latitude position ?
                -0.5257026, // how to get the previous Longitude position ?
                position.latitude,
                position.longitude);
          });
        }).catchError((err) {
          print(err);
        });
      } else {
        print("GPS is off.");
        showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                content: const Text('Make sure your GPS is on in Settings !'),
                actions: <Widget>[
                  FlatButton(
                      child: Text('OK'),
                      onPressed: () {
                        Navigator.of(context, rootNavigator: true).pop();
                      })
                ],
              );
            });
      }
    });
  }

  @override
  void dispose() {
    super.dispose();
    _positionStream.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Location Manager'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Previous Latitude: ${_previousPosition?.latitude ?? '-'} \nPrevious Longitude: ${_previousPosition?.longitude ?? '-'}',
            ),
            SizedBox(height: 50),
            Text(
              'Current Latitude: ${_currentPosition?.latitude ?? '-'} \nCurrent Longitude: ${_currentPosition?.longitude ?? '-'}',
            ),
            SizedBox(height: 50),
            Text(
                'Distance: ${_distance != null ? _distance.toStringAsFixed(2) : 0} meters.')
          ],
        ),
      ),
    );
  }
}

Thanks for reading this !感谢您阅读本文!

I fixed my problem like this:我这样解决了我的问题:


class _LocationPageState extends State<LocationPage> {
  Position _currentPosition;
  Position _previousPosition;
  StreamSubscription<Position> _positionStream;
  double _totalDistance = 0;

  List<Position> locations = List<Position>();

  @override
  void initState() {
    super.initState();
    _calculateDistance();
  }

  Future _calculateDistance() async {
    _positionStream = Geolocator.getPositionStream(
            distanceFilter: 10, desiredAccuracy: LocationAccuracy.high)
        .listen((Position position) async {
      if ((await Geolocator.isLocationServiceEnabled())) {
        Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
            .then((Position position) {
          setState(() {
            _currentPosition = position;
            locations.add(_currentPosition);

            if (locations.length > 1) {
              _previousPosition = locations.elementAt(locations.length - 2);

              var _distanceBetweenLastTwoLocations = Geolocator.distanceBetween(
                _previousPosition.latitude,
                _previousPosition.longitude,
                _currentPosition.latitude,
                _currentPosition.longitude,
              );
              _totalDistance += _distanceBetweenLastTwoLocations;
              print('Total Distance: $_totalDistance');
            }
          });
        }).catchError((err) {
          print(err);
        });
      } else {
        print("GPS is off.");
        showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                content: const Text('Make sure your GPS is on in Settings !'),
                actions: <Widget>[
                  FlatButton(
                      child: Text('OK'),
                      onPressed: () {
                        Navigator.of(context, rootNavigator: true).pop();
                      })
                ],
              );
            });
      }
    });
  }

  @override
  void dispose() {
    super.dispose();
    _positionStream.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Location Manager'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Previous Latitude: ${_previousPosition?.latitude ?? '-'} \nPrevious Longitude: ${_previousPosition?.longitude ?? '-'}',
            ),
            SizedBox(height: 50),
            Text(
              'Current Latitude: ${_currentPosition?.latitude ?? '-'} \nCurrent Longitude: ${_currentPosition?.longitude ?? '-'}',
            ),
            SizedBox(height: 50),
            Text(
                'Distance: ${_totalDistance != null ? _totalDistance > 1000 ? (_totalDistance / 1000).toStringAsFixed(2) : _totalDistance.toStringAsFixed(2) : 0} ${_totalDistance != null ? _totalDistance > 1000 ? 'KM' : 'meters' : 0}')
          ],
        ),
      ),
    );
  }
}

Output:输出:

演示位置

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM