import 'dart:io'; import 'package:path_provider/path_provider.dart'; import '../models/track.dart'; import 'track_database.dart'; /// GPX 1.1 fájl generáló. /// A GPX az összes standard alkalmazással kompatibilis (OsmAnd, Komoot, /// QGIS, gpsvisualizer.com stb.). class GpxExporter { final TrackDatabase _db; GpxExporter([TrackDatabase? db]) : _db = db ?? TrackDatabase.instance; /// Elkészíti a GPX fájlt és visszaadja az elérési utat. Future export(Track track) async { final points = await _db.getPoints(track.id!); final xml = _buildGpx(track, points); final dir = await getExternalStorageDirectory() ?? await getApplicationDocumentsDirectory(); final safeName = track.name.replaceAll(RegExp(r'[^a-zA-Z0-9_\-]'), '_').toLowerCase(); final file = File('${dir.path}/${safeName}_${track.id}.gpx'); await file.writeAsString(xml, encoding: utf8_encoding); return file.path; } String _buildGpx(Track track, List points) { final buf = StringBuffer(); buf.writeln(''); buf.writeln(''); buf.writeln(' '); buf.writeln(' ${_esc(track.name)}'); buf.writeln( ' '); buf.writeln(' '); buf.writeln(' '); buf.writeln(' ${_esc(track.name)}'); buf.writeln(' Forrás: ${_esc(track.source)}, ' '${track.pointCount} pont, ' '${track.distanceFormatted}'); buf.writeln(' '); for (final pt in points) { buf.write(' '); if (pt.altitude != null) { buf.write('${pt.altitude!.toStringAsFixed(3)}'); } buf.write(''); if (pt.speed != null) { buf.write('${pt.speed!.toStringAsFixed(2)}'); } if (pt.heading != null) { buf.write('${pt.heading!.toStringAsFixed(1)}'); } if (pt.accuracy != null) { buf.write('${pt.accuracy!.toStringAsFixed(2)}'); } buf.writeln(''); } buf.writeln(' '); buf.writeln(' '); buf.writeln(''); return buf.toString(); } String _esc(String s) => s .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"'); } // ignore: non_constant_identifier_names final utf8_encoding = const SystemEncoding();