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

@@ -84,6 +84,7 @@ class TileDownloadService {
required int maxZoom,
required String urlTemplate,
String? displayName,
Map<String, String>? headers,
int maxConcurrency = 6,
int rateLimit = 30,
}) {
@@ -96,6 +97,7 @@ class TileDownloadService {
maxZoom: maxZoom,
urlTemplate: urlTemplate,
displayName: displayName,
headers: headers,
maxConcurrency: maxConcurrency,
rateLimit: rateLimit,
);
@@ -110,6 +112,7 @@ class TileDownloadService {
required int maxZoom,
required String urlTemplate,
String? displayName,
Map<String, String>? headers,
required int maxConcurrency,
required int rateLimit,
}) async {
@@ -184,7 +187,7 @@ class TileDownloadService {
break;
}
final future = _downloadSingleTile(tile, urlTemplate, styleHash)
final future = _downloadSingleTile(tile, urlTemplate, styleHash, headers)
.then((event) {
if (!controller.isClosed) {
controller.add(event);
@@ -220,6 +223,7 @@ class TileDownloadService {
TileCoord tile,
String urlTemplate,
String styleHash,
Map<String, String>? extraHeaders,
) async {
final bounds = TileMathService.tileBounds(tile.x, tile.y, tile.z);
@@ -241,7 +245,7 @@ class TileDownloadService {
try {
final response = await _httpClient.get(
Uri.parse(url),
headers: {'User-Agent': 'MeshCoreSAR/1.0'},
headers: {'User-Agent': 'MeshCoreSAR/1.0', ...?extraHeaders},
);
if (response.statusCode != 200) {