From 8130f8ea9cefa88aa40af783bf8b75bca7b4c0f9 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Sat, 28 Mar 2026 08:00:31 +0100 Subject: [PATCH] Updated MapsforgeTileSource --- Directory.Build.props | 2 +- MapsforgeTiles/README.md | 13 ++- MapsforgeTiles/Shared/MapsforgeTileSource.cs | 83 +++++++++++--------- 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index ad267061..13ae5d3e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ XAML Map Control Clemens Fischer Copyright © 2026 Clemens Fischer - 16.1.0 + 16.2.0 $(Version) ..\..\MapControl.snk true diff --git a/MapsforgeTiles/README.md b/MapsforgeTiles/README.md index 21427687..127ce2db 100644 --- a/MapsforgeTiles/README.md +++ b/MapsforgeTiles/README.md @@ -12,19 +12,18 @@ Map files can be downloaded from the [Mapsforge Download Server](https://downloa `MapsforgeTileSource` is initialized by a static `LoadMaps` method that takes the file path to either a single map file or a directory containing multiple map files. -The `MapsforgeTileSource` instance constructor takes a string parameter that specifies a Mapsforge theme. This is either -the full path of an XML `rendertheme` file, or the name of one of the built-in themes (ignoring case), e.g. `Default`. +The class has a `Theme` property that specifies a Mapsforge theme. This is either the path of an XML `rendertheme` file, +the path of a ZIP file containing a render theme, or the name of one of the built-in themes (ignoring case), e.g. `Default`. See [MapsforgeThemes.java](https://github.com/mapsforge/mapsforge/blob/master/mapsforge-themes/src/main/java/org/mapsforge/map/rendertheme/internal/MapsforgeThemes.java) -for available theme names. An additional constructor parameters specifies the size of the tile source's internal cache. +for available theme names. Code sample: ``` MapControl.MapsforgeTiles.MapsforgeTileSource.LoadMaps(".\mapfiles"); -map.MapLayer = new MapTileLayer -{ - TileSource = new MapControl.MapsforgeTiles.MapsforgeTileSource("Default") -}; +var tileSource = new MapControl.MapsforgeTiles.MapsforgeTileSource { Theme = "Default" }; + +map.MapLayer = new MapTileLayer { TileSource = tileSource }; ``` --- diff --git a/MapsforgeTiles/Shared/MapsforgeTileSource.cs b/MapsforgeTiles/Shared/MapsforgeTileSource.cs index ace12580..3d043fdd 100644 --- a/MapsforgeTiles/Shared/MapsforgeTileSource.cs +++ b/MapsforgeTiles/Shared/MapsforgeTileSource.cs @@ -83,45 +83,7 @@ namespace MapControl.MapsforgeTiles { if (renderThemeFuture == null) { - lock (displayModel) - { - if (renderThemeFuture == null) - { - if (mapDataStore == null) - { - throw new InvalidOperationException("No map files loaded."); - } - - Logger?.LogInformation("Loading render theme \"{theme}\".", Theme); - - ZipInputStream zipInputStream = null; - XmlRenderTheme renderTheme; - - if (Theme.EndsWith(".zip")) - { - zipInputStream = new ZipInputStream(new FileInputStream(Theme)); - renderTheme = new ZipRenderTheme( - Path.GetFileName(Theme).Replace(".zip", ".xml"), - new ZipXmlThemeResourceProvider(zipInputStream)); - } - else if (Theme.EndsWith(".xml")) - { - renderTheme = new ExternalRenderTheme(Theme); - } - else - { - renderTheme = MapsforgeThemes.valueOf(Theme.ToUpper()); - } - - tileCache = new InMemoryTileCache(CacheCapacity); - renderer = new DatabaseRenderer(mapDataStore, AwtGraphicFactory.INSTANCE, tileCache, null, true, false, null); - renderThemeFuture = new RenderThemeFuture(AwtGraphicFactory.INSTANCE, renderTheme, displayModel); - renderThemeFuture.run(); - zipInputStream?.close(); - - Logger?.LogInformation("Loading render theme done."); - } - } + Initialize(); } int[] imageBuffer = null; @@ -141,5 +103,48 @@ namespace MapControl.MapsforgeTiles return imageBuffer; } + + private void Initialize() + { + lock (displayModel) + { + if (renderThemeFuture == null) + { + if (mapDataStore == null) + { + throw new InvalidOperationException("No map files loaded."); + } + + Logger?.LogInformation("Loading render theme \"{theme}\".", Theme); + + ZipInputStream zipInputStream = null; + XmlRenderTheme renderTheme; + + if (Theme.EndsWith(".zip")) + { + zipInputStream = new ZipInputStream(new FileInputStream(Theme)); + renderTheme = new ZipRenderTheme( + Path.GetFileName(Theme).Replace(".zip", ".xml"), + new ZipXmlThemeResourceProvider(zipInputStream)); + } + else if (Theme.EndsWith(".xml")) + { + renderTheme = new ExternalRenderTheme(Theme); + } + else + { + renderTheme = MapsforgeThemes.valueOf(Theme.ToUpper()); + } + + tileCache = new InMemoryTileCache(CacheCapacity); + renderer = new DatabaseRenderer(mapDataStore, AwtGraphicFactory.INSTANCE, tileCache, null, true, false, null); + renderThemeFuture = new RenderThemeFuture(AwtGraphicFactory.INSTANCE, renderTheme, displayModel); + renderThemeFuture.run(); + zipInputStream?.close(); + + Logger?.LogInformation("Loading render theme done."); + } + } + } } }