Im using dart/flutter and the 'package:latlong/latlong.dart'
to parse a GPX file into a list of LatLng objects. That is working fine, but the next step is to find the total distance of the route.
The question here is
how can I get the total distance from a list of LatLng objects in Dart?
I have used Haversine formula before in Java, but not sure the best way to implement it using Dart. Any help of suggestion would be greatly appreciated.
Edit
Below is an attempt to get total distance based on the answer below. For some reason though it doesn't add to totalDistance
and doesn't return a double.
The below is suppose to iterate through a list of 60+ LatLng objects and find distance between each one, adding to a totalDistance double which is returned at the end of the loop.
static double getDistanceFromGPSPointsInRoute(List<LatLng> gpsList) { double totalDistance = 0.0; for (var i = 0; i < gpsList.length; i++) { var p = 0.017453292519943295; var c = cos; var a = 0.5 - c((gpsList[i + 1].latitude - gpsList[i].latitude) * p) / 2 + c(gpsList[i].latitude * p) * c(gpsList[i + 1].latitude * p) * (1 - c((gpsList[i + 1].longitude - gpsList[i].longitude) * p)) / 2; double distance = 12742 * asin(sqrt(a)); totalDistance += distance; print('Distance is ${12742 * asin(sqrt(a))}'); } print('Total distance is $totalDistance'); return totalDistance; }
Output
flutter: Distance is 0.004143962775784678 flutter: Distance is 0.0041439635323316775 flutter: Distance is 0.007796918986828574 flutter: Distance is 0.007285385943437824 flutter: Distance is 0.006890844300938902 flutter: Distance is 0.006353952460010352 flutter: Distance is 0.005560051252981138
As you can see above, there is no mention of Total Distance.
Example of LatLng List
flutter: -36.84975 , 174.646685 flutter: -36.849692 , 174.646497 flutter: -36.84967 , 174.646436 flutter: -36.849578 , 174.646264 flutter: -36.849502 , 174.646164 flutter: -36.849367 , 174.646038 flutter: -36.849209 , 174.645959 flutter: -36.849155 , 174.64594 flutter: -36.849107 , 174.645932 flutter: -36.849058 , 174.645922 flutter: -36.848952 , 174.645895 flutter: -36.84886 , 174.645906 flutter: -36.84879 , 174.645913 flutter: -36.848748 , 174.645836 flutter: -36.848744 , 174.645802
from math import cos, asin, sqrt, pi def distance(lat1, lon1, lat2, lon2): p = pi/180 a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2 return 12742 * asin(sqrt(a)) #2*R*asin... And for the sake of completeness: Haversine on Wikipedia.
The distance formula is: √[(x₂ - x₁)² + (y₂ - y₁)²]. This works for any two points in 2D space with coordinates (x₁, y₁) for the first point and (x₂, y₂) for the second point.
How to Calculate Total Distance From LatLng List In Flutter? You can do a loop and find the total distance by using 2 points each time. Here are some added random dummy data to show how it works. This function calculates the distance between two points. You can also try with the below code snippet:
Enter the latitude and longitude of two locations and select calculate. The calculator uses Haversine formula to calculate the distance between the two locations entered.
The total distance traveled is 12 units. The distance from a point to a line is the length of the shortest path between that point and the place on the line nearest to it. This path is always the line that is perpendicular (at right angles) to your original line. 1. If you know the coordinates
Note I’ve included a scale bar, but of course the distance between longitude lines gets closer at higher latitudes. The first method is to calculate great circle distances, that account for the curvature of the earth. If we use with unprojected coordinates (ie in lon-lat) then we get great circle distances (in metres).
Try this please. I tested it with Google Maps and works accurately. You can do a loop and find total distance by using 2 points each time. I added some random dummy data to show how it works. Copy this code to https://dartpad.dartlang.org/ and test easily.
import 'dart:math' show cos, sqrt, asin; void main() { double calculateDistance(lat1, lon1, lat2, lon2){ var p = 0.017453292519943295; var c = cos; var a = 0.5 - c((lat2 - lat1) * p)/2 + c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p))/2; return 12742 * asin(sqrt(a)); } List<dynamic> data = [ { "lat": 44.968046, "lng": -94.420307 },{ "lat": 44.33328, "lng": -89.132008 },{ "lat": 33.755787, "lng": -116.359998 },{ "lat": 33.844843, "lng": -116.54911 },{ "lat": 44.92057, "lng": -93.44786 },{ "lat": 44.240309, "lng": -91.493619 },{ "lat": 44.968041, "lng": -94.419696 },{ "lat": 44.333304, "lng": -89.132027 },{ "lat": 33.755783, "lng": -116.360066 },{ "lat": 33.844847, "lng": -116.549069 }, ]; double totalDistance = 0; for(var i = 0; i < data.length-1; i++){ totalDistance += calculateDistance(data[i]["lat"], data[i]["lng"], data[i+1]["lat"], data[i+1]["lng"]); } print(totalDistance); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With