feat: Add support for offline vector maps using MBTiles

- Introduced new MapLayerType for vector MBTiles.
- Enhanced MapLayer class to handle vector-specific properties.
- Implemented MBTilesService for managing MBTiles files, including import and deletion functionalities.
- Updated MapManagementScreen to allow importing and managing MBTiles files.
- Added UI components for displaying and interacting with MBTiles layers.
- Integrated vector tile rendering in MapTab, supporting dynamic theme loading.
- Updated pubspec.yaml to include necessary dependencies for MBTiles and vector tiles.
This commit is contained in:
Janez T
2025-10-16 23:35:43 +02:00
parent 7f20e5ad36
commit 3a0bcabdea
26 changed files with 2042 additions and 74 deletions

View File

@@ -1786,5 +1786,95 @@
"you": "You",
"@you": {
"description": "Label for the current user in message bubbles"
},
"offlineVectorMaps": "Offline Vector Maps",
"@offlineVectorMaps": {
"description": "Title for offline vector maps section"
},
"offlineVectorMapsDescription": "Import and manage offline vector map tiles (MBTiles format) for use without internet connection",
"@offlineVectorMapsDescription": {
"description": "Description for offline vector maps section"
},
"importMbtiles": "Import MBTiles File",
"@importMbtiles": {
"description": "Button to import MBTiles file"
},
"importMbtilesNote": "Supports MBTiles files with vector tiles (PBF/MVT format). Geofabrik extracts work great!",
"@importMbtilesNote": {
"description": "Note about supported MBTiles file types"
},
"noMbtilesFiles": "No offline vector maps found",
"@noMbtilesFiles": {
"description": "Message when no MBTiles files are available"
},
"mbtilesImportedSuccessfully": "MBTiles file imported successfully",
"@mbtilesImportedSuccessfully": {
"description": "Success message after importing MBTiles file"
},
"failedToImportMbtiles": "Failed to import MBTiles file",
"@failedToImportMbtiles": {
"description": "Error message when MBTiles import fails"
},
"deleteMbtilesConfirmTitle": "Delete Offline Map",
"@deleteMbtilesConfirmTitle": {
"description": "Title for delete MBTiles confirmation dialog"
},
"deleteMbtilesConfirmMessage": "Are you sure you want to delete \"{name}\"? This will permanently remove the offline map.",
"@deleteMbtilesConfirmMessage": {
"description": "Confirmation message for deleting MBTiles file",
"placeholders": {
"name": {
"type": "String"
}
}
},
"mbtilesDeletedSuccessfully": "Offline map deleted successfully",
"@mbtilesDeletedSuccessfully": {
"description": "Success message after deleting MBTiles file"
},
"failedToDeleteMbtiles": "Failed to delete offline map",
"@failedToDeleteMbtiles": {
"description": "Error message when MBTiles deletion fails"
},
"vectorTiles": "Vector Tiles",
"@vectorTiles": {
"description": "Label for vector tile type"
},
"schema": "Schema",
"@schema": {
"description": "Label for vector tile schema"
},
"unknown": "Unknown",
"@unknown": {
"description": "Unknown value label"
},
"bounds": "Bounds",
"@bounds": {
"description": "Label for geographic bounds"
},
"onlineLayers": "Online Layers",
"@onlineLayers": {
"description": "Section header for online map layers"
},
"offlineLayers": "Offline Layers",
"@offlineLayers": {
"description": "Section header for offline map layers (MBTiles)"
}
}

View File

@@ -594,5 +594,39 @@
"txPowerDbm": "TX snaga (dBm)",
"maxPowerDbm": "Maks: {power} dBm",
"you": "Ti"
"you": "Ti",
"offlineVectorMaps": "Offline vektorske karte",
"offlineVectorMapsDescription": "Uvezite i upravljajte offline vektorskim pločicama karata (MBTiles format) za upotrebu bez internetske veze",
"importMbtiles": "Uvezi MBTiles datoteku",
"importMbtilesNote": "Podržava MBTiles datoteke s vektorskim pločicama (PBF/MVT format). Geofabrik izvodi odlično rade!",
"noMbtilesFiles": "Nisu pronađene offline vektorske karte",
"mbtilesImportedSuccessfully": "MBTiles datoteka uspješno uvezena",
"failedToImportMbtiles": "Neuspjeli uvoz MBTiles datoteke",
"deleteMbtilesConfirmTitle": "Izbriši offline kartu",
"deleteMbtilesConfirmMessage": "Jeste li sigurni da želite izbrisati \"{name}\"? Ovo će trajno ukloniti offline kartu.",
"mbtilesDeletedSuccessfully": "Offline karta uspješno izbrisana",
"failedToDeleteMbtiles": "Neuspjelo brisanje offline karte",
"vectorTiles": "Vektorske pločice",
"schema": "Shema",
"unknown": "Nepoznato",
"bounds": "Granice",
"onlineLayers": "Mrežni slojevi",
"offlineLayers": "Offline slojevi"
}

View File

@@ -1910,6 +1910,108 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'You'**
String get you;
/// Title for offline vector maps section
///
/// In en, this message translates to:
/// **'Offline Vector Maps'**
String get offlineVectorMaps;
/// Description for offline vector maps section
///
/// In en, this message translates to:
/// **'Import and manage offline vector map tiles (MBTiles format) for use without internet connection'**
String get offlineVectorMapsDescription;
/// Button to import MBTiles file
///
/// In en, this message translates to:
/// **'Import MBTiles File'**
String get importMbtiles;
/// Note about supported MBTiles file types
///
/// In en, this message translates to:
/// **'Supports MBTiles files with vector tiles (PBF/MVT format). Geofabrik extracts work great!'**
String get importMbtilesNote;
/// Message when no MBTiles files are available
///
/// In en, this message translates to:
/// **'No offline vector maps found'**
String get noMbtilesFiles;
/// Success message after importing MBTiles file
///
/// In en, this message translates to:
/// **'MBTiles file imported successfully'**
String get mbtilesImportedSuccessfully;
/// Error message when MBTiles import fails
///
/// In en, this message translates to:
/// **'Failed to import MBTiles file'**
String get failedToImportMbtiles;
/// Title for delete MBTiles confirmation dialog
///
/// In en, this message translates to:
/// **'Delete Offline Map'**
String get deleteMbtilesConfirmTitle;
/// Confirmation message for deleting MBTiles file
///
/// In en, this message translates to:
/// **'Are you sure you want to delete \"{name}\"? This will permanently remove the offline map.'**
String deleteMbtilesConfirmMessage(String name);
/// Success message after deleting MBTiles file
///
/// In en, this message translates to:
/// **'Offline map deleted successfully'**
String get mbtilesDeletedSuccessfully;
/// Error message when MBTiles deletion fails
///
/// In en, this message translates to:
/// **'Failed to delete offline map'**
String get failedToDeleteMbtiles;
/// Label for vector tile type
///
/// In en, this message translates to:
/// **'Vector Tiles'**
String get vectorTiles;
/// Label for vector tile schema
///
/// In en, this message translates to:
/// **'Schema'**
String get schema;
/// Unknown value label
///
/// In en, this message translates to:
/// **'Unknown'**
String get unknown;
/// Label for geographic bounds
///
/// In en, this message translates to:
/// **'Bounds'**
String get bounds;
/// Section header for online map layers
///
/// In en, this message translates to:
/// **'Online Layers'**
String get onlineLayers;
/// Section header for offline map layers (MBTiles)
///
/// In en, this message translates to:
/// **'Offline Layers'**
String get offlineLayers;
}
class _AppLocalizationsDelegate

View File

@@ -1041,4 +1041,60 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get you => 'You';
@override
String get offlineVectorMaps => 'Offline Vector Maps';
@override
String get offlineVectorMapsDescription =>
'Import and manage offline vector map tiles (MBTiles format) for use without internet connection';
@override
String get importMbtiles => 'Import MBTiles File';
@override
String get importMbtilesNote =>
'Supports MBTiles files with vector tiles (PBF/MVT format). Geofabrik extracts work great!';
@override
String get noMbtilesFiles => 'No offline vector maps found';
@override
String get mbtilesImportedSuccessfully =>
'MBTiles file imported successfully';
@override
String get failedToImportMbtiles => 'Failed to import MBTiles file';
@override
String get deleteMbtilesConfirmTitle => 'Delete Offline Map';
@override
String deleteMbtilesConfirmMessage(String name) {
return 'Are you sure you want to delete \"$name\"? This will permanently remove the offline map.';
}
@override
String get mbtilesDeletedSuccessfully => 'Offline map deleted successfully';
@override
String get failedToDeleteMbtiles => 'Failed to delete offline map';
@override
String get vectorTiles => 'Vector Tiles';
@override
String get schema => 'Schema';
@override
String get unknown => 'Unknown';
@override
String get bounds => 'Bounds';
@override
String get onlineLayers => 'Online Layers';
@override
String get offlineLayers => 'Offline Layers';
}

View File

@@ -1043,4 +1043,59 @@ class AppLocalizationsHr extends AppLocalizations {
@override
String get you => 'Ti';
@override
String get offlineVectorMaps => 'Offline vektorske karte';
@override
String get offlineVectorMapsDescription =>
'Uvezite i upravljajte offline vektorskim pločicama karata (MBTiles format) za upotrebu bez internetske veze';
@override
String get importMbtiles => 'Uvezi MBTiles datoteku';
@override
String get importMbtilesNote =>
'Podržava MBTiles datoteke s vektorskim pločicama (PBF/MVT format). Geofabrik izvodi odlično rade!';
@override
String get noMbtilesFiles => 'Nisu pronađene offline vektorske karte';
@override
String get mbtilesImportedSuccessfully => 'MBTiles datoteka uspješno uvezena';
@override
String get failedToImportMbtiles => 'Neuspjeli uvoz MBTiles datoteke';
@override
String get deleteMbtilesConfirmTitle => 'Izbriši offline kartu';
@override
String deleteMbtilesConfirmMessage(String name) {
return 'Jeste li sigurni da želite izbrisati \"$name\"? Ovo će trajno ukloniti offline kartu.';
}
@override
String get mbtilesDeletedSuccessfully => 'Offline karta uspješno izbrisana';
@override
String get failedToDeleteMbtiles => 'Neuspjelo brisanje offline karte';
@override
String get vectorTiles => 'Vektorske pločice';
@override
String get schema => 'Shema';
@override
String get unknown => 'Nepoznato';
@override
String get bounds => 'Granice';
@override
String get onlineLayers => 'Mrežni slojevi';
@override
String get offlineLayers => 'Offline slojevi';
}

View File

@@ -1043,4 +1043,62 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get you => 'Ti';
@override
String get offlineVectorMaps => 'Brezpovezni vektorski zemljevidi';
@override
String get offlineVectorMapsDescription =>
'Uvozite in upravljajte brezpovezne vektorske ploščice zemljevidov (format MBTiles) za uporabo brez internetne povezave';
@override
String get importMbtiles => 'Uvozi MBTiles datoteko';
@override
String get importMbtilesNote =>
'Podpira MBTiles datoteke z vektorskimi ploščicami (format PBF/MVT). Geofabrik izvozi odlično delujejo!';
@override
String get noMbtilesFiles =>
'Ni najdenih brezpoveznih vektorskih zemljevidov';
@override
String get mbtilesImportedSuccessfully => 'MBTiles datoteka uspešno uvožena';
@override
String get failedToImportMbtiles => 'Uvoz MBTiles datoteke ni uspel';
@override
String get deleteMbtilesConfirmTitle => 'Izbriši brezpovezni zemljevid';
@override
String deleteMbtilesConfirmMessage(String name) {
return 'Ste prepričani, da želite izbrisati \"$name\"? To bo trajno odstranilo brezpovezni zemljevid.';
}
@override
String get mbtilesDeletedSuccessfully =>
'Brezpovezni zemljevid uspešno izbrisan';
@override
String get failedToDeleteMbtiles =>
'Brisanje brezpoveznega zemljevida ni uspelo';
@override
String get vectorTiles => 'Vektorske ploščice';
@override
String get schema => 'Shema';
@override
String get unknown => 'Neznano';
@override
String get bounds => 'Meje';
@override
String get onlineLayers => 'Spletne plasti';
@override
String get offlineLayers => 'Brezpovezne plasti';
}

View File

@@ -594,5 +594,39 @@
"txPowerDbm": "Izhodna moč (dBm)",
"maxPowerDbm": "Največ: {power} dBm",
"you": "Ti"
"you": "Ti",
"offlineVectorMaps": "Brezpovezni vektorski zemljevidi",
"offlineVectorMapsDescription": "Uvozite in upravljajte brezpovezne vektorske ploščice zemljevidov (format MBTiles) za uporabo brez internetne povezave",
"importMbtiles": "Uvozi MBTiles datoteko",
"importMbtilesNote": "Podpira MBTiles datoteke z vektorskimi ploščicami (format PBF/MVT). Geofabrik izvozi odlično delujejo!",
"noMbtilesFiles": "Ni najdenih brezpoveznih vektorskih zemljevidov",
"mbtilesImportedSuccessfully": "MBTiles datoteka uspešno uvožena",
"failedToImportMbtiles": "Uvoz MBTiles datoteke ni uspel",
"deleteMbtilesConfirmTitle": "Izbriši brezpovezni zemljevid",
"deleteMbtilesConfirmMessage": "Ste prepričani, da želite izbrisati \"{name}\"? To bo trajno odstranilo brezpovezni zemljevid.",
"mbtilesDeletedSuccessfully": "Brezpovezni zemljevid uspešno izbrisan",
"failedToDeleteMbtiles": "Brisanje brezpoveznega zemljevida ni uspelo",
"vectorTiles": "Vektorske ploščice",
"schema": "Shema",
"unknown": "Neznano",
"bounds": "Meje",
"onlineLayers": "Spletne plasti",
"offlineLayers": "Brezpovezne plasti"
}