diff --git a/MBTiles/Shared/MBTileData.cs b/MBTiles/Shared/MBTileData.cs index c6d00fc8..eb37664f 100644 --- a/MBTiles/Shared/MBTileData.cs +++ b/MBTiles/Shared/MBTileData.cs @@ -15,11 +15,28 @@ namespace MapControl.MBTiles { private readonly SQLiteConnection connection; + public IDictionary Metadata { get; } = new Dictionary(); + private MBTileData(string file) { connection = new SQLiteConnection("Data Source=" + Path.GetFullPath(file)); } + public void Dispose() + { + connection.Dispose(); + } + + public static async Task CreateAsync(string file) + { + var tileData = new MBTileData(file); + + await tileData.OpenAsync(); + await tileData.ReadMetadataAsync(); + + return tileData; + } + private async Task OpenAsync() { await connection.OpenAsync(); @@ -35,24 +52,8 @@ namespace MapControl.MBTiles } } - public static async Task CreateAsync(string file) + private async Task ReadMetadataAsync() { - var tileData = new MBTileData(file); - - await tileData.OpenAsync(); - - return tileData; - } - - public void Dispose() - { - connection.Dispose(); - } - - public async Task> ReadMetadataAsync() - { - var metadata = new Dictionary(); - try { using (var command = new SQLiteCommand("select * from metadata", connection)) @@ -61,7 +62,7 @@ namespace MapControl.MBTiles while (await reader.ReadAsync()) { - metadata[(string)reader["name"]] = (string)reader["value"]; + Metadata[(string)reader["name"]] = (string)reader["value"]; } } } @@ -69,17 +70,15 @@ namespace MapControl.MBTiles { Debug.WriteLine("MBTileData: " + ex.Message); } - - return metadata; } - public async Task WriteMetadataAsync(IDictionary metaData) + public async Task WriteMetadataAsync() { try { using (var command = new SQLiteCommand("insert or replace into metadata (name, value) values (@n, @v)", connection)) { - foreach (var keyValue in metaData) + foreach (var keyValue in Metadata) { command.Parameters.AddWithValue("@n", keyValue.Key); command.Parameters.AddWithValue("@v", keyValue.Value); diff --git a/MBTiles/Shared/MBTileLayer.cs b/MBTiles/Shared/MBTileLayer.cs index f49ea2d9..91b9ebd5 100644 --- a/MBTiles/Shared/MBTileLayer.cs +++ b/MBTiles/Shared/MBTileLayer.cs @@ -36,6 +36,14 @@ namespace MapControl.MBTiles set { SetValue(FileProperty, value); } } + /// + /// May be overridden to create a derived MBTileSource that handles other tile formats than png and jpg, e.g. pbf. + /// + protected virtual MBTileSource CreateTileSource(MBTileData tileData) + { + return new MBTileSource(tileData); + } + private async Task FilePropertyChanged(string file) { (TileSource as MBTileSource)?.Dispose(); @@ -48,33 +56,32 @@ namespace MapControl.MBTiles if (file != null) { - var tiledata = await MBTileData.CreateAsync(file); - var metadata = await tiledata.ReadMetadataAsync(); - string s; + var tileData = await MBTileData.CreateAsync(file); int minZoom; int maxZoom; + string s; - if (metadata.TryGetValue("name", out s)) + if (tileData.Metadata.TryGetValue("name", out s)) { SourceName = s; } - if (metadata.TryGetValue("description", out s)) + if (tileData.Metadata.TryGetValue("description", out s)) { Description = s; } - if (metadata.TryGetValue("minzoom", out s) && int.TryParse(s, out minZoom)) + if (tileData.Metadata.TryGetValue("minzoom", out s) && int.TryParse(s, out minZoom)) { MinZoomLevel = minZoom; } - if (metadata.TryGetValue("maxzoom", out s) && int.TryParse(s, out maxZoom)) + if (tileData.Metadata.TryGetValue("maxzoom", out s) && int.TryParse(s, out maxZoom)) { MaxZoomLevel = maxZoom; } - TileSource = new MBTileSource(tiledata); + TileSource = CreateTileSource(tileData); } } } diff --git a/MBTiles/Shared/MBTileSource.cs b/MBTiles/Shared/MBTileSource.cs index c3166c69..2ead69f2 100644 --- a/MBTiles/Shared/MBTileSource.cs +++ b/MBTiles/Shared/MBTileSource.cs @@ -12,7 +12,7 @@ using System.Windows.Media; namespace MapControl.MBTiles { - public sealed class MBTileSource : TileSource, IDisposable + public class MBTileSource : TileSource, IDisposable { public MBTileData TileData { get; } @@ -23,7 +23,15 @@ namespace MapControl.MBTiles public void Dispose() { - TileData.Dispose(); + Dispose(true); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + TileData.Dispose(); + } } public override async Task LoadImageAsync(int x, int y, int zoomLevel)