47 lines
1.4 KiB
Dart
47 lines
1.4 KiB
Dart
// lib/features/routes/data/datasources/routes_local_datasource.dart
|
|
// Lee rutas.json desde assets — funciona completamente offline.
|
|
|
|
import 'dart:convert';
|
|
import 'package:flutter/services.dart';
|
|
import '../../domain/entities/route_entities.dart';
|
|
import '../../domain/entities/haversine.dart';
|
|
|
|
class RoutesLocalDatasource {
|
|
static const _assetPath = 'assets/rutas.json';
|
|
|
|
List<TruckRoute>? _cache;
|
|
|
|
Future<List<TruckRoute>> cargarRutas() async {
|
|
if (_cache != null) return _cache!;
|
|
|
|
final raw = await rootBundle.loadString(_assetPath);
|
|
final List<dynamic> json = jsonDecode(raw);
|
|
|
|
_cache = json.map((r) => TruckRoute.fromJson(r)).toList();
|
|
return _cache!;
|
|
}
|
|
|
|
/// Genera centroides de todas las rutas para búsqueda espacial con Haversine.
|
|
Future<List<RouteCentroid>> generarCentroides() async {
|
|
final rutas = await cargarRutas();
|
|
return rutas.map(_calcularCentroide).toList();
|
|
}
|
|
|
|
RouteCentroid _calcularCentroide(TruckRoute ruta) {
|
|
// Excluye la última posición (regreso al depósito)
|
|
final posiciones = ruta.positions.sublist(0, ruta.positions.length - 1);
|
|
|
|
final avgLat =
|
|
posiciones.map((p) => p.lat).reduce((a, b) => a + b) / posiciones.length;
|
|
final avgLng =
|
|
posiciones.map((p) => p.lng).reduce((a, b) => a + b) / posiciones.length;
|
|
|
|
return RouteCentroid(
|
|
routeId: ruta.routeId,
|
|
routeName: ruta.name,
|
|
centroidLat: avgLat,
|
|
centroidLng: avgLng,
|
|
);
|
|
}
|
|
}
|