feat: Add Mapy.cz Outdoor (OSM + LIDAR) base map layer

- New MapLayerType.mapyOutdoor with Referer header support
  (tile server rejects requests without mapy.com Referer)
- Headered layers get a dedicated NetworkTileProvider sharing
  the offline tile cache
- Offline region downloads pass layer headers through
  TileDownloadService

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Janez T
2026-06-12 17:28:56 +02:00
parent ba27843166
commit 365bd76cbc
5 changed files with 55 additions and 9 deletions

View File

@@ -63,14 +63,31 @@ class MapTab extends StatefulWidget {
class _MapTabState extends State<MapTab> with AutomaticKeepAliveClientMixin {
final MapController _mapController = MapController();
static final MapCachingProvider _tileCachingProvider =
OfflineMapCachingProvider(
BuiltInMapCachingProvider.getOrCreateInstance(
maxCacheSize: 10_000_000_000,
overrideFreshAge: const Duration(days: 365),
),
);
static final TileProvider _tileProvider = NetworkTileProvider(
cachingProvider: OfflineMapCachingProvider(
BuiltInMapCachingProvider.getOrCreateInstance(
maxCacheSize: 10_000_000_000,
overrideFreshAge: const Duration(days: 365),
),
),
cachingProvider: _tileCachingProvider,
);
// Providers for layers that need extra HTTP headers (e.g. Mapy.cz Referer),
// cached per URL template so they are not recreated on every build.
static final Map<String, TileProvider> _headeredTileProviders = {};
static TileProvider _tileProviderFor(MapLayer layer) {
final headers = layer.headers;
if (headers == null) return _tileProvider;
return _headeredTileProviders.putIfAbsent(
layer.urlTemplate,
() => NetworkTileProvider(
headers: headers,
cachingProvider: _tileCachingProvider,
),
);
}
// DO NOT create a new LocationTrackingService instance here
// Use the singleton from AppProvider instead via _locationService getter
final MapMarkerService _markerService = MapMarkerService();
@@ -2974,7 +2991,7 @@ class _MapTabState extends State<MapTab> with AutomaticKeepAliveClientMixin {
else if (!_currentLayer.isWms)
flutter_map.TileLayer(
urlTemplate: _currentLayer.urlTemplate,
tileProvider: _tileProvider,
tileProvider: _tileProviderFor(_currentLayer),
userAgentPackageName: 'com.meshcore.sar',
maxZoom: _currentLayer.maxZoom,
),

View File

@@ -114,6 +114,9 @@ class _OfflineMapScreenState extends State<OfflineMapScreen> {
children: [
TileLayer(
urlTemplate: provider.selectedLayer.urlTemplate,
tileProvider: NetworkTileProvider(
headers: provider.selectedLayer.headers ?? const {},
),
userAgentPackageName: 'com.meshcore.sar',
maxZoom: provider.selectedLayer.maxZoom,
),