115 lines
2.7 KiB
Dart
115 lines
2.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
enum LandmarkType {
|
|
minaret,
|
|
tower,
|
|
waterTank,
|
|
fort,
|
|
mountain,
|
|
militaryBase,
|
|
grainSilo,
|
|
}
|
|
|
|
class TacticalLandmark {
|
|
final String id;
|
|
final String name;
|
|
final String region;
|
|
final LandmarkType type;
|
|
final double lat;
|
|
final double lng;
|
|
final int elevationM;
|
|
final String description;
|
|
|
|
const TacticalLandmark({
|
|
required this.id,
|
|
required this.name,
|
|
required this.region,
|
|
required this.type,
|
|
required this.lat,
|
|
required this.lng,
|
|
required this.elevationM,
|
|
required this.description,
|
|
});
|
|
|
|
IconData get typeIcon {
|
|
switch (type) {
|
|
case LandmarkType.minaret:
|
|
return Icons.mosque;
|
|
case LandmarkType.tower:
|
|
return Icons.cell_tower;
|
|
case LandmarkType.waterTank:
|
|
return Icons.water_drop;
|
|
case LandmarkType.fort:
|
|
return Icons.castle;
|
|
case LandmarkType.mountain:
|
|
return Icons.terrain;
|
|
case LandmarkType.militaryBase:
|
|
return Icons.shield;
|
|
case LandmarkType.grainSilo:
|
|
return Icons.inventory_2;
|
|
}
|
|
}
|
|
|
|
String get typeLabelArabic {
|
|
switch (type) {
|
|
case LandmarkType.minaret:
|
|
return 'مئذنة / مسجد';
|
|
case LandmarkType.tower:
|
|
return 'برج اتصالات / إرسال';
|
|
case LandmarkType.waterTank:
|
|
return 'خزان مياه عالي';
|
|
case LandmarkType.fort:
|
|
return 'قلعة / موقع أثري';
|
|
case LandmarkType.mountain:
|
|
return 'قمة جبل / نقطة مثلثة';
|
|
case LandmarkType.militaryBase:
|
|
return 'قاعدة / مطار عسكري';
|
|
case LandmarkType.grainSilo:
|
|
return 'صوامع حبوب / منشأة عالية';
|
|
}
|
|
}
|
|
|
|
Map<String, dynamic> toMap() {
|
|
return {
|
|
'id': id,
|
|
'name': name,
|
|
'region': region,
|
|
'type': type.name,
|
|
'lat': lat,
|
|
'lng': lng,
|
|
'elevationM': elevationM,
|
|
'description': description,
|
|
};
|
|
}
|
|
}
|
|
|
|
class ResectionObservation {
|
|
final TacticalLandmark landmark;
|
|
final double observedAzimuthDeg;
|
|
final double trueAzimuthDeg;
|
|
final DateTime timestamp;
|
|
|
|
ResectionObservation({
|
|
required this.landmark,
|
|
required this.observedAzimuthDeg,
|
|
required this.trueAzimuthDeg,
|
|
DateTime? timestamp,
|
|
}) : timestamp = timestamp ?? DateTime.now();
|
|
}
|
|
|
|
class ResectionResult {
|
|
final double lat;
|
|
final double lng;
|
|
final double estimatedAccuracyMeters;
|
|
final List<ResectionObservation> observations;
|
|
final Map<String, double> distanceToLandmarksKm;
|
|
|
|
const ResectionResult({
|
|
required this.lat,
|
|
required this.lng,
|
|
required this.estimatedAccuracyMeters,
|
|
required this.observations,
|
|
required this.distanceToLandmarksKm,
|
|
});
|
|
}
|