diff --git a/lib/utils/geo_utils.dart b/lib/utils/geo_utils.dart index 023510678..df0761ef0 100644 --- a/lib/utils/geo_utils.dart +++ b/lib/utils/geo_utils.dart @@ -3,8 +3,7 @@ import 'dart:math' as math; import 'package:intl/intl.dart'; import 'package:tuple/tuple.dart'; -// adapted from Mike Mitterer's dart-latlong library -String _decimal2sexagesimal(final double dec) { +String _decimal2sexagesimal(final double degDecimal) { double _round(final double value, {final int decimals = 6}) => (value * math.pow(10, decimals)).round() / math.pow(10, decimals); List _split(final double value) { @@ -17,22 +16,15 @@ String _decimal2sexagesimal(final double dec) { ]; } - final parts = _split(dec); - final integerPart = parts[0]; - final fractionalPart = parts[1]; + final deg = _split(degDecimal)[0]; + final minDecimal = (degDecimal.abs() - deg) * 60; + final min = _split(minDecimal)[0]; + final sec = (minDecimal - min) * 60; - final deg = integerPart; - final min = double.parse('0.$fractionalPart') * 60; - - final minParts = _split(min); - final minFractionalPart = minParts[1]; - - final sec = double.parse('0.$minFractionalPart') * 60; - - return '$deg° ${min.floor()}′ ${_round(sec, decimals: 2).toStringAsFixed(2)}″'; + return '$deg° $min′ ${_round(sec, decimals: 2).toStringAsFixed(2)}″'; } -// return coordinates formatted as DMS, e.g. ['41°24′12.2″ N', '2°10′26.5″E'] +// return coordinates formatted as DMS, e.g. ['41° 24′ 12.2″ N', '2° 10′ 26.5″ E'] List toDMS(Tuple2 latLng) { if (latLng == null) return []; final lat = latLng.item1; diff --git a/test/utils/geo_utils_test.dart b/test/utils/geo_utils_test.dart new file mode 100644 index 000000000..0057dfb10 --- /dev/null +++ b/test/utils/geo_utils_test.dart @@ -0,0 +1,12 @@ +import 'package:aves/utils/geo_utils.dart'; +import 'package:test/test.dart'; +import 'package:tuple/tuple.dart'; + +void main() { + test('Decimal degrees to DMS (sexagesimal)', () { + expect(toDMS(Tuple2(37.496667, 127.0275)), ['37° 29′ 48.00″ N', '127° 1′ 39.00″ E']); // Gangnam + expect(toDMS(Tuple2(78.9243503, 11.9230465)), ['78° 55′ 27.66″ N', '11° 55′ 22.97″ E']); // Ny-Ålesund + expect(toDMS(Tuple2(-38.6965891, 175.9830047)), ['38° 41′ 47.72″ S', '175° 58′ 58.82″ E']); // Taupo + expect(toDMS(Tuple2(-64.249391, -56.6556145)), ['64° 14′ 57.81″ S', '56° 39′ 20.21″ W']); // Marambio + }); +}