import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:url_launcher/url_launcher.dart'; /// Vollbild-OSM-Karte, entspricht dem Leaflet-`#map` im HTML-Demonstrator: /// randlos, ohne Zoom-Buttons (Pinch-to-Zoom/Pan reicht), Standard-OSM-Tiles. class MissionMap extends StatelessWidget { const MissionMap({ super.key, this.mapController, this.waypointMarkers = const [], this.routeLine, this.rubberBandLine, this.onMapReady, }); final MapController? mapController; /// Kreis-Marker fuer die Wegpunkte der aktuellen Mission (Doku 3.7). final List waypointMarkers; /// Verbindungslinie zwischen den Wegpunkten. Bewusst eine gerade Strecke - /// die physikalisch fundierte Geraden+Kreisbogen-Geometrie (Doku 3.7/4.6) /// ist ein separater, noch offener Schritt. final List? routeLine; /// Gestrichelte Vorschaulinie vom letzten Wegpunkt zur aktuellen /// Kartenmitte, waehrend noch kein neuer Punkt bestaetigt wurde. final List? rubberBandLine; final VoidCallback? onMapReady; // Default-Zentrum/Zoom uebernommen aus dem HTML-Demonstrator // (Drone Mission Control.html: L.map(...).setView([52.3676, 4.9041], 16)). static const _initialCenter = LatLng(52.3676, 4.9041); static const _initialZoom = 16.0; @override Widget build(BuildContext context) { return FlutterMap( mapController: mapController, options: MapOptions( initialCenter: _initialCenter, initialZoom: _initialZoom, minZoom: 3, maxZoom: 19, onMapReady: onMapReady, ), children: [ TileLayer( urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'de.dmc.dmc_app', maxZoom: 19, ), PolylineLayer( polylines: [ if (routeLine != null && routeLine!.length > 1) Polyline(points: routeLine!, strokeWidth: 3, color: Colors.white), if (rubberBandLine != null) Polyline( points: rubberBandLine!, strokeWidth: 2, color: Colors.white.withValues(alpha: 0.55), pattern: StrokePattern.dashed(segments: const [6.0, 6.0]), ), ], ), CircleLayer(circles: waypointMarkers), SimpleAttributionWidget( alignment: Alignment.bottomLeft, source: const Text('OpenStreetMap contributors'), onTap: () => launchUrl(Uri.parse('https://www.openstreetmap.org/copyright')), ), ], ); } }