89 lines
2.3 KiB
Dart
89 lines
2.3 KiB
Dart
|
|
enum Wgs84CoordinateFormat {
|
|||
|
|
decimalDegrees,
|
|||
|
|
degreesDecimalMinutes,
|
|||
|
|
degreesMinutesSeconds
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
extension Wgs84CoordinateFormatLabel on Wgs84CoordinateFormat {
|
|||
|
|
String get label {
|
|||
|
|
switch (this) {
|
|||
|
|
case Wgs84CoordinateFormat.decimalDegrees:
|
|||
|
|
return 'Tizedes fok';
|
|||
|
|
case Wgs84CoordinateFormat.degreesDecimalMinutes:
|
|||
|
|
return 'Fok + tizedes perc';
|
|||
|
|
case Wgs84CoordinateFormat.degreesMinutesSeconds:
|
|||
|
|
return 'Fok - perc - másodperc';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
String get shortLabel {
|
|||
|
|
switch (this) {
|
|||
|
|
case Wgs84CoordinateFormat.decimalDegrees:
|
|||
|
|
return 'DD';
|
|||
|
|
case Wgs84CoordinateFormat.degreesDecimalMinutes:
|
|||
|
|
return 'DM';
|
|||
|
|
case Wgs84CoordinateFormat.degreesMinutesSeconds:
|
|||
|
|
return 'DMS';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class Wgs84CoordinateFormatter {
|
|||
|
|
static String formatLatitude(
|
|||
|
|
double? value,
|
|||
|
|
Wgs84CoordinateFormat format,
|
|||
|
|
) {
|
|||
|
|
return _format(
|
|||
|
|
value: value,
|
|||
|
|
format: format,
|
|||
|
|
positiveHemisphere: 'N',
|
|||
|
|
negativeHemisphere: 'S',
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static String formatLongitude(
|
|||
|
|
double? value,
|
|||
|
|
Wgs84CoordinateFormat format,
|
|||
|
|
) {
|
|||
|
|
return _format(
|
|||
|
|
value: value,
|
|||
|
|
format: format,
|
|||
|
|
positiveHemisphere: 'E',
|
|||
|
|
negativeHemisphere: 'W',
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static String _format({
|
|||
|
|
required double? value,
|
|||
|
|
required Wgs84CoordinateFormat format,
|
|||
|
|
required String positiveHemisphere,
|
|||
|
|
required String negativeHemisphere,
|
|||
|
|
}) {
|
|||
|
|
if (value == null || value.isNaN || value.isInfinite) {
|
|||
|
|
return '-';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
final hemisphere = value >= 0 ? positiveHemisphere : negativeHemisphere;
|
|||
|
|
final absValue = value.abs();
|
|||
|
|
|
|||
|
|
switch (format) {
|
|||
|
|
case Wgs84CoordinateFormat.decimalDegrees:
|
|||
|
|
return '${absValue.toStringAsFixed(8)}° $hemisphere';
|
|||
|
|
|
|||
|
|
case Wgs84CoordinateFormat.degreesDecimalMinutes:
|
|||
|
|
final deg = absValue.floor();
|
|||
|
|
final minutes = (absValue - deg) * 60.0;
|
|||
|
|
|
|||
|
|
return '$deg° ${minutes.toStringAsFixed(5)}′ $hemisphere';
|
|||
|
|
|
|||
|
|
case Wgs84CoordinateFormat.degreesMinutesSeconds:
|
|||
|
|
final deg = absValue.floor();
|
|||
|
|
final fullMinutes = (absValue - deg) * 60.0;
|
|||
|
|
final min = fullMinutes.floor();
|
|||
|
|
final sec = (fullMinutes - min) * 60.0;
|
|||
|
|
|
|||
|
|
return '$deg° $min′ ${sec.toStringAsFixed(3)}″ $hemisphere';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|