private static TileLayer GetKaagTileLayer() { var mbTilesTileSource = new MbTilesTileSource(App.MbTileConnectionString); var mbTilesLayer = new TileLayer(mbTilesTileSource); return(mbTilesLayer); }
public static TileLayer CreateMbTilesLayer(string path) { var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(path, true)); var mbTilesLayer = new TileLayer(mbTilesTileSource); return(mbTilesLayer); }
private ITileSource CreateTileSource(Source source) { ITileSource tileSource = null; if (source.Tiles == null || source.Tiles.Count == 0) { return(null); } if (source.Tiles[0].StartsWith("http")) { tileSource = new HttpTileSource(new GlobalSphericalMercator( source.Scheme == "tms" ? YAxis.TMS : YAxis.OSM, minZoomLevel: source.ZoomMin ?? 0, maxZoomLevel: source.ZoomMax ?? 30 ), source.Tiles[0], //"{s}", source.Tiles, name: source.Name, attribution: new Attribution(source.Attribution) ); } else if (source.Tiles[0].StartsWith("mbtiles://")) { // We should get the tile source from someone else tileSource = new MbTilesTileSource(new SQLiteConnectionString(source.Tiles[0].Substring(10), false), new GlobalSphericalMercator( source.Scheme == "tms" ? YAxis.TMS : YAxis.OSM, minZoomLevel: source.ZoomMin ?? 0, maxZoomLevel: source.ZoomMax ?? 14 )); } return(tileSource); }
static void Main() { MbTilesTileSource.SetPlatform(new SQLite.Net.Platform.Win32.SQLitePlatformWin32()); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MbTilesForm()); }
private void getSampleFileFromInternetToolStripMenuItem_Click(object sender, EventArgs e) { var path = Path.Combine(Path.GetTempPath(), "mapbox.haiti-terrain.mbtiles"); var req = WebRequest.Create("http://a.tiles.mapbox.com/mapbox/download/haiti-terrain.mbtiles"); var success = true; try { Enabled = false; var tmpFile = Path.GetTempFileName(); using (var response = req.GetResponse()) { using (var streamWriter = new BinaryWriter(File.OpenWrite(tmpFile))) { using (var stream = response.GetResponseStream()) { var buffer = new byte[4 * 8192]; while (true) { if (stream != null) { var read = stream.Read(buffer, 0, buffer.Length); if (read <= 0) { break; } streamWriter.Write(buffer, 0, read); } } } } } _source = null; File.Copy(tmpFile, path, true); File.Delete(tmpFile); } catch (Exception ex) { Debug.WriteLine(ex.Message); success = false; } finally { if (success) { _source = new MbTilesTileSource(new SQLiteConnectionString(path, false)); var scale = (float)(1.1 * Math.Max(_source.Schema.Extent.Width / picMap.Width, _source.Schema.Extent.Height / picMap.Height)); _mapTransform = new MapTransform( new PointF((float)_source.Schema.Extent.CenterX, (float)_source.Schema.Extent.CenterY), scale, picMap.Width, picMap.Height); RenderToBuffer(); } Enabled = true; } }
public TileLayer GetKaagTileLayer() { WriteResourceToFile("FamilieWandelPad.RouteBuilder.Assets.Kaag.mbtiles", "Kaag.mbtiles"); var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString("Kaag.mbtiles")); var mbTilesLayer = new TileLayer(mbTilesTileSource); return(mbTilesLayer); }
static void Main() { // Dear BruTile maintainer, // If the code in this file does not compile and needs changes you // also need to update the 'getting started' sample in the wiki. // 1) Create a tile source // This is an example that creates the OpenStreetMap tile source: var tileSource = new HttpTileSource(new GlobalSphericalMercator(0, 18), "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", new[] { "a", "b", "c" }, "OSM"); // 2) Calculate which tiles you need // the extent of the visible map changes but lets start with the whole world var extent = new Extent(-20037508, -20037508, 20037508, 20037508); var screenWidthInPixels = 400; // The width of the map on screen in pixels var resolution = extent.Width / screenWidthInPixels; var tileInfos = tileSource.Schema.GetTileInfos(extent, resolution); // 3) Fetch the tiles from the service Console.WriteLine("Show tile info"); foreach (var tileInfo in tileInfos) { var tile = tileSource.GetTile(tileInfo); Console.WriteLine( $"tile col: {tileInfo.Index.Col}, " + $"tile row: {tileInfo.Index.Row}, " + $"tile level: {tileInfo.Index.Level} , " + $"tile size {tile.Length}"); } // 4) Try some of the known tile sources // You can easily create an ITileSource for a number of predefined tile servers // with single line statements like: var tileSource1 = KnownTileSources.Create(); // The default is OpenStreetMap var tileSource2 = KnownTileSources.Create(KnownTileSource.BingAerial); var tileSource3 = KnownTileSources.Create(KnownTileSource.BingHybrid); var tileSource4 = KnownTileSources.Create(KnownTileSource.StamenTonerLite); var tileSource5 = KnownTileSources.Create(KnownTileSource.EsriWorldShadedRelief); // 6) Use MBTiles, the sqlite format for tile data, to work with tiles stored on your device. var mbtilesTilesource = new MbTilesTileSource(new SQLiteConnectionString("Resources/world.mbtiles", false)); var mbTilesTile = mbtilesTilesource.GetTile(new TileInfo { Index = new TileIndex(0, 0, 0) }); Console.WriteLine(); Console.WriteLine("MBTiles"); Console.WriteLine($"This is a byte array of an image file loaded from MBTiles with size: {mbTilesTile.Length}"); }
public static ILayer CreateLayer(ISQLitePlatform platform, string path) { MbTilesTileSource.SetPlatform(platform); var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); return(new TileLayer(tileSource) { Name = "MbTiles" }); }
public static void LoadAllOfflineMaps() { string MBTilesPath = MainActivity.rootPath + "/MBTiles"; var filesList = Directory.GetFiles(MBTilesPath); //Load Australia First foreach (var file in filesList) { if (file.EndsWith(".mbtiles")) { if (file.EndsWith("Country.mbtiles")) { Log.Information($"File {file}"); //Map not clear. GPX visible var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(file, true)); //GPX not visible //var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(file, true), null, MbTilesType.Overlay, true, true); var mbTilesLayer = new TileLayer(mbTilesTileSource) { Name = file }; Fragments.Fragment_map.map.Layers.Add(mbTilesLayer); } } } //Load the rest foreach (var file in filesList) { if (file.EndsWith(".mbtiles")) { if (!file.EndsWith("Country.mbtiles")) { Log.Information($"File {file}"); //Map not clear. GPX visible var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(file, true)); //GPX not visible //var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(file, true), null, MbTilesType.Overlay, true, true); var mbTilesLayer = new TileLayer(mbTilesTileSource) { Name = file }; Fragments.Fragment_map.map.Layers.Add(mbTilesLayer); } } } }
public static ITileSource CreateOfflineSource(string filePath) { try { ITileSource layerSource = new MbTilesTileSource(new SQLiteConnectionString(filePath, true), null, MbTilesType.Overlay, true); return(layerSource); } catch { return(null); } }
public void SchemaGeneratedFromMbTilesContainingSmallArea() { // arrange var path = Path.Combine(Paths.AssemblyDirectory, "Resources", "el-molar.mbtiles"); // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false, _encryptionKey)); // assert Assert.AreEqual(95490133.792558521d, tileSource.Schema.Extent.Area, 0.0001d); Assert.AreEqual(17, tileSource.Schema.Resolutions.Count); }
public void SchemaGeneratedFromMbTilesContainingSmallAreaWithFewLevels() { // arrange var path = Path.Combine(Paths.AssemblyDirectory, "Resources", "torrejon-de-ardoz.mbtiles"); // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false, _encryptionKey)); // assert Assert.AreEqual(692609746.90386355, tileSource.Schema.Extent.Area); Assert.AreEqual(5, tileSource.Schema.Resolutions.Count); }
public void SchemaGeneratedFromMbTilesContainingSmallArea() { // arrange SQLitePCL.Batteries.Init(); const string path = ".\\Resources\\el-molar.mbtiles"; // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); // assert Assert.AreEqual(95490133.792558521d, tileSource.Schema.Extent.Area); Assert.AreEqual(17, tileSource.Schema.Resolutions.Count); }
public void SchemaGeneratedFromMbTilesContainingSmallAreaWithFewLevels() { // arrange SQLitePCL.Batteries.Init(); const string path = ".\\Resources\\torrejon-de-ardoz.mbtiles"; // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); // assert Assert.AreEqual(692609746.90386355, tileSource.Schema.Extent.Area); Assert.AreEqual(5, tileSource.Schema.Resolutions.Count); }
public void TestMbTiles() { var p1 = new MbTilesTileSource(@"C:\Users\obe.IVV-AACHEN\Downloads\geography-class.mbtiles"); var p2 = SandD(p1); Assert.IsNotNull(p2); Assert.AreEqual(p1.Format, p2.Format, "MbTiles Format not equal"); Assert.AreEqual(p1.Type, p2.Type, "MbTiles Type not equal"); string msg; Assert.IsTrue(EqualTileSources(p1, p2, out msg), msg); //Assert.IsTrue(EqualTileSchemas(p1.Schema, p2.Schema, out msg), msg); }
public void SchemaGeneratedFromMbTiles() { // arrange var path = Path.Combine(Paths.AssemblyDirectory, "Resources", "test.mbtiles"); // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false, _encryptionKey)); // assert var extent = new Extent(-20037508.3427892, -20037471.205137, 20037508.3427892, 20037471.205137); Assert.IsTrue(extent.Area / tileSource.Schema.Extent.Area > 0.0000001); Assert.AreEqual(3, tileSource.Schema.Resolutions.Count); }
public void SchemaGeneratedFromMbTiles() { // arrange SQLitePCL.Batteries.Init(); const string path = ".\\Resources\\test.mbtiles"; // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); // assert var extent = new Extent(-20037508.3427892, -20037471.205137, 20037508.3427892, 20037471.205137); Assert.IsTrue(extent.Area / tileSource.Schema.Extent.Area > 0.0000001); Assert.AreEqual(3, tileSource.Schema.Resolutions.Count); }
public void FetchTiles() { // arrange MbTilesTileSource.SetPlatform(new SQLitePlatformWin32()); const string path = ".\\Resources\\test.mbtiles"; var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); var extent = tileSource.Extent; var tileInfos = tileSource.Schema.GetTileInfos(extent, "1").ToList(); // act var data = tileSource.GetTile(tileInfos.First()); // assert Assert.True(data.Length > 0); }
protected override void OnLoad(EventArgs e) { /* http://a.tiles.mapbox.com/mapbox/download/haiti-terrain-grey.mbtiles */ var path = Path.Combine(Path.GetTempPath(), "mapbox.haiti-terrain-grey.mbtiles"); if (File.Exists(path)) { _source = new MbTilesTileSource(new SQLiteConnectionString(path, false)); var scale = (float)(1.1 * Math.Max(_source.Schema.Extent.Width / picMap.Width, _source.Schema.Extent.Height / picMap.Height)); _mapTransform = new MapTransform( new PointF((float)_source.Schema.Extent.CenterX, (float)_source.Schema.Extent.CenterY), scale, picMap.Width, picMap.Height); RenderToBuffer(); } base.OnLoad(e); }
public void SchemaGeneratedFromMbTilesWithSchemaInConstructor() { // arrange SQLitePCL.Batteries.Init(); const string path = ".\\Resources\\torrejon-de-ardoz.mbtiles"; // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false), new GlobalSphericalMercator("png", YAxis.TMS, null)); // assert var tile = tileSource.GetTile(new TileInfo { Index = new TileIndex(2006, 2552, "12") }); Assert.NotNull(tile); }
public void SchemaGeneratedFromMbTilesWithSchemaInConstructor() { // arrange SQLitePCL.Batteries.Init(); var path = Path.Combine(Paths.AssemblyDirectory, "Resources", "torrejon-de-ardoz.mbtiles"); // act var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false, _encryptionKey), new GlobalSphericalMercator("png", YAxis.TMS, null)); // assert var tile = tileSource.GetTile(new TileInfo { Index = new TileIndex(2006, 2552, "12") }); Assert.NotNull(tile); }
public MbTilesConfiguration(string mbtilesFile) { _mbTilesFile = mbtilesFile; LegendText = Path.GetFileNameWithoutExtension(_mbTilesFile); #if DEBUG SQLiteLog.Enabled = true; #endif var uri = new Uri(_mbTilesFile); var tileSource = new MbTilesTileSource(uri.LocalPath); TileSource = tileSource; TileFetcher = new TileFetcher(tileSource.Provider, BruTileLayerPlugin.Settings.MemoryCacheMinimum, BruTileLayerPlugin.Settings.MemoryCacheMaximum, new TileFetcher.NoopCache()); }
public void FetchTiles() { // arrange var path = Path.Combine(Paths.AssemblyDirectory, "Resources", "test.mbtiles"); var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false, _encryptionKey)); var extent = tileSource.Schema.Extent; var tileInfos = tileSource.Schema.GetTileInfos(extent, "1").ToList(); tileSource.Attribution = new Attribution("attribution", "url"); // act var data = tileSource.GetTile(tileInfos.First()); // assert Assert.True(data.Length > 0); Assert.AreEqual(MbTilesType.BaseLayer, tileSource.Type); Assert.AreEqual("attribution", tileSource.Attribution.Text); }
public void TestMbTiles(string mbTilesFile) { if (!File.Exists(mbTilesFile)) { throw new IgnoreException(string.Format("File '{0}' does not exist.", mbTilesFile)); } var p1 = new MbTilesTileSource(mbTilesFile); var p2 = SandD(p1); Assert.IsNotNull(p2); Assert.AreEqual(p1.Format, p2.Format, "MbTiles Format not equal"); Assert.AreEqual(p1.Type, p2.Type, "MbTiles Type not equal"); string msg; Assert.IsTrue(EqualTileSources(p1, p2, out msg), msg); //Assert.IsTrue(EqualTileSchemas(p1.Schema, p2.Schema, out msg), msg); }
public void FetchTiles() { // arrange SQLitePCL.Batteries.Init(); const string path = ".\\Resources\\test.mbtiles"; var tileSource = new MbTilesTileSource(new SQLiteConnectionString(path, false)); var extent = tileSource.Schema.Extent; var tileInfos = tileSource.Schema.GetTileInfos(extent, "1").ToList(); tileSource.Attribution = new Attribution("attribution", "url"); // act var data = tileSource.GetTile(tileInfos.First()); // assert Assert.True(data.Length > 0); Assert.AreEqual(MbTilesType.BaseLayer, tileSource.Type); Assert.AreEqual("attribution", tileSource.Attribution.Text); }
/// <summary> /// Create the TileSource, that provides the data for the IDrawableTileSource /// </summary> /// <param name="source"></param> /// <returns></returns> private static ITileSource CreateTileSource(JsonSource source) { ITileSource tileSource = null; if (source.Tiles == null || source.Tiles.Count == 0) { return(null); } if (source.Tiles[0].StartsWith("http")) { tileSource = new HttpTileSource(new GlobalSphericalMercator( source.Scheme == "tms" ? YAxis.TMS : YAxis.OSM, minZoomLevel: source.ZoomMin ?? 0, maxZoomLevel: source.ZoomMax ?? 30 ), source.Tiles[0], //"{s}", source.Tiles, name: source.Name, attribution: new Attribution(source.Attribution) ); } else if (source.Tiles[0].StartsWith("mbtiles://")) { // We should get the tile source from someone else var filename = source.Tiles[0].Substring(10); filename = Path.Combine(DirectoryForFiles, filename); if (!File.Exists(filename)) { return(null); } tileSource = new MbTilesTileSource(new SQLiteConnectionString(filename, false), //new GlobalSphericalMercator( // source.Scheme == "tms" ? YAxis.TMS : YAxis.OSM, // minZoomLevel: source.ZoomMin ?? 0, // maxZoomLevel: source.ZoomMax ?? 30) null ); } return(tileSource); }
private void openToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofn = new OpenFileDialog()) { ofn.Filter = @"MbTiles file|*.mbtiles"; ofn.FilterIndex = 0; ofn.Multiselect = false; ofn.CheckFileExists = true; if (ofn.ShowDialog() == DialogResult.OK) { _source = new MbTilesTileSource(new SQLiteConnectionString(ofn.FileName, false)); var extent = _source.Schema.Extent; var scale = (float)(1.1 * Math.Max(extent.Width / picMap.Width, extent.Height / picMap.Height)); _mapTransform = new MapTransform( new PointF((float)extent.CenterX, (float)extent.CenterY), scale, picMap.Width, picMap.Height); RenderToBuffer(); } } }
private void getSampleFileFromInternetToolStripMenuItem_Click(object sender, EventArgs e) { var path = Path.Combine(Path.GetTempPath(), "mapbox.haiti-terrain.mbtiles"); var req = WebRequest.Create("http://a.tiles.mapbox.com/mapbox/download/haiti-terrain.mbtiles"); var success = true; try { Enabled = false; var tmpFile = Path.GetTempFileName(); using (var response = req.GetResponse()) { using (var streamWriter = new BinaryWriter(File.OpenWrite(tmpFile))) { using (var stream = response.GetResponseStream()) { var buffer = new byte[4 * 8192]; while (true) { var read = stream.Read(buffer, 0, buffer.Length); if (read <= 0) break; streamWriter.Write(buffer, 0, read); } } } } _source = null; File.Copy(tmpFile, path, true); File.Delete(tmpFile); } catch (Exception ex) { Debug.WriteLine(ex.Message); success = false; } finally { if (success) { _source = new MbTilesTileSource(new SQLiteConnectionString(path, false)); var scale = (float)(1.1 * Math.Max(_source.Schema.Extent.Width / picMap.Width, _source.Schema.Extent.Height / picMap.Height)); _mapTransform = new MapTransform( new PointF((float)_source.Schema.Extent.CenterX, (float)_source.Schema.Extent.CenterY), scale, picMap.Width, picMap.Height); RenderToBuffer(); } Enabled = true; } }
private void openToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofn = new OpenFileDialog()) { ofn.Filter = @"MbTiles file|*.mbtiles"; ofn.FilterIndex = 0; ofn.Multiselect = false; ofn.CheckFileExists = true; if (ofn.ShowDialog() == DialogResult.OK) { _source = new MbTilesTileSource(new SQLiteConnectionString(ofn.FileName, false)); var extent = _source.Extent; var scale = (float)(1.1 * Math.Max(extent.Width / picMap.Width, extent.Height / picMap.Height)); _mapTransform = new MapTransform( new PointF((float)extent.CenterX, (float)extent.CenterY), scale, picMap.Width, picMap.Height); RenderToBuffer(); } } }
public void TestConstructorFilename() { MbTilesTileSource source; Assert.DoesNotThrow( () => source = new MbTilesTileSource(MbTilesFile)); }
public MapboxGLStyler(Stream input, Map map) { using (var reader = new StreamReader(input)) styleJson = JsonConvert.DeserializeObject <MapboxGL>(reader.ReadToEnd()); Zoom = styleJson.Zoom ?? 20; // Save urls for sprite and glyphs SpriteUrl = styleJson.Sprite; GlyphsUrl = styleJson.Glyphs; var filterConverter = new FilterConverter(); var styleLayerConverter = new StyleLayerConverter(); // Create SymbolProvider, that belongs to all Styles and VectorTileLayers var symbolProvider = new SymbolProvider(map); foreach (var styleLayer in styleJson.StyleLayers) { if (styleLayer.Type.Equals("background") && styleLayer.Paint.BackgroundColor != null) { Background = styleLayer.Paint.BackgroundColor; map.BackColor = Background; } // Create filters for each style layer if (styleLayer.NativeFilter != null) { styleLayer.Filter = filterConverter.ConvertFilter(styleLayer.NativeFilter); } // Create ThemeStyles for each style layer styleLayer.Style = new MapboxGLThemeStyle(styleLayerConverter, styleLayer, SpriteAtlas, map.Viewport, symbolProvider) { MinVisible = styleLayer.MinVisible, MaxVisible = styleLayer.MaxVisible }; } // Read all tile sources foreach (var source in styleJson.Sources) { var sourceJson = source.Value; switch (source.Value.Type) { case "raster": if (!string.IsNullOrEmpty(source.Value.Url)) { // Get TileJSON from http/https url sourceJson = new Source(); } // Create new raster layer var rasterLayer = CreateRasterLayer(sourceJson); if (rasterLayer != null) { rasterLayer.Name = source.Key; rasterLayer.Style = new StyleCollection(); // Add all ThemeStyles for this layer foreach (var styleLayer in styleJson.StyleLayers) { if (!rasterLayer.Name.Equals(styleLayer.Source, StringComparison.CurrentCultureIgnoreCase)) { continue; } ((StyleCollection)rasterLayer.Style).Add(styleLayer.Style); } map.Layers.Add(rasterLayer); } break; case "vector": if (!string.IsNullOrEmpty(source.Value.Url)) { if (source.Value.Url.StartsWith("http")) { // TODO: Get TileJSON from http/https url sourceJson = JsonConvert.DeserializeObject <Source>(@"{'tiles':['https://free.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key=tXiQqN3lIgskyDErJCeY'],'name':'OpenMapTiles','format':'pbf','basename':'v3.7.mbtiles','id':'openmaptiles','attribution':'<a href=\'http://www.openmaptiles.org/\' target=\'_blank\'>© OpenMapTiles</a> <a href=\'http://www.openstreetmap.org/about/\' target=\'_blank\'>© OpenStreetMap contributors</a>','description':'A tileset showcasing all layers in OpenMapTiles. http://openmaptiles.org','maxzoom':14,'minzoom':0,'pixel_scale':'256','vector_layers':[{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'water','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'waterway','description':''},{'maxzoom':14,'fields':{'class':'String','subclass':'String'},'minzoom':0,'id':'landcover','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'landuse','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:nl':'String','name:pl':'String','ele':'Number','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:ru':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ele_ft':'Number','name:ja_kana':'String','name:is':'String','osm_id':'Number','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'mountain_peak','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'park','description':''},{'maxzoom':14,'fields':{'admin_level':'Number','disputed':'Number','maritime':'Number'},'minzoom':0,'id':'boundary','description':''},{'maxzoom':14,'fields':{'ref':'String','class':'String'},'minzoom':0,'id':'aeroway','description':''},{'maxzoom':14,'fields':{'layer':'Number','service':'String','level':'Number','brunnel':'String','indoor':'Number','ramp':'Number','subclass':'String','oneway':'Number','class':'String'},'minzoom':0,'id':'transportation','description':''},{'maxzoom':14,'fields':{'render_min_height':'Number','render_height':'Number'},'minzoom':0,'id':'building','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'water_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','layer':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','subclass':'String','name:de':'String','indoor':'Number','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','network':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ref':'String','name:ja_kana':'String','level':'Number','ref_length':'Number','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'transportation_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','capital':'Number','name:sl':'String','name:lv':'String','name:ja':'String','name:ko_rm':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:th':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','iso_a2':'String','name:ja_kana':'String','name:is':'String','name:lt':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'place','description':''},{'maxzoom':14,'fields':{'housenumber':'String'},'minzoom':0,'id':'housenumber','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','subclass':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','agg_stop':'Number','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'poi','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:nl':'String','name:pl':'String','ele':'Number','name:lt':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:latin':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:ko_rm':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:ru':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:th':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ele_ft':'Number','name:ja_kana':'String','name:is':'String','osm_id':'Number','iata':'String','icao':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'aerodrome_label','description':''}],'center':[-12.2168,28.6135,4],'bounds':[-180,-85.0511,180,85.0511],'maskLevel':'8','planettime':'1523232000000','version':'3.7','tilejson':'2.0.0'}"); sourceJson.Name = source.Key; } else if (source.Value.Url.StartsWith("mbtiles")) { var dataSource = new MbTilesTileSource(new SQLiteConnectionString(source.Value.Url.Substring(10), false)); sourceJson = JsonConvert.DeserializeObject <Source>(@"{'vector_layers':[{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'water','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:lv':'String','name:bg':'String','name:cy':'String','name:fi':'String','name:he':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sr':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:ko_rm':'String','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:sv':'String','name_en':'String','name:hu':'String','name:hr':'String','class':'String','name:sq':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'waterway','description':''},{'maxzoom':14,'fields':{'class':'String','subclass':'String'},'minzoom':0,'id':'landcover','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'landuse','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:lv':'String','name:pl':'String','name:de':'String','name:ca':'String','name:bg':'String','name:cy':'String','name:fi':'String','name:he':'String','name:da':'String','ele':'Number','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:ko_rm':'String','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:ru':'String','name:sv':'String','name_en':'String','name:hu':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','ele_ft':'Number','name:ja_kana':'String','name:is':'String','osm_id':'Number','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'mountain_peak','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'park','description':''},{'maxzoom':14,'fields':{'admin_level':'Number','disputed':'Number','maritime':'Number'},'minzoom':0,'id':'boundary','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'aeroway','description':''},{'maxzoom':14,'fields':{'brunnel':'String','ramp':'Number','class':'String','service':'String','oneway':'Number'},'minzoom':0,'id':'transportation','description':''},{'maxzoom':14,'fields':{'render_min_height':'Number','render_height':'Number'},'minzoom':0,'id':'building','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:lv':'String','name:bg':'String','name:cy':'String','name:fi':'String','name:he':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sr':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:ko_rm':'String','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:sv':'String','name_en':'String','name:hu':'String','name:hr':'String','class':'String','name:sq':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'water_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:lv':'String','name:bg':'String','name:cy':'String','name:fi':'String','name:he':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sr':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:ko_rm':'String','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:sv':'String','name_en':'String','name:hu':'String','name:hr':'String','class':'String','name:sq':'String','network':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','ref':'String','name:ja_kana':'String','ref_length':'Number','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'transportation_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:lv':'String','name:bg':'String','name:cy':'String','name:hr':'String','name:fi':'String','name:he':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sr':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:ko_rm':'String','name:no':'String','name:kk':'String','capital':'Number','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:sv':'String','name_en':'String','name:hu':'String','name:lt':'String','class':'String','name:sq':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'place','description':''},{'maxzoom':14,'fields':{'housenumber':'String'},'minzoom':0,'id':'housenumber','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:ka':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:lv':'String','name:bg':'String','name:cy':'String','name:fi':'String','name:he':'String','name:da':'String','subclass':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:be':'String','name:zh':'String','name:sr':'String','name:sl':'String','name:nl':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:ko_rm':'String','name:ja_rm':'String','name:br':'String','name:bs':'String','name:lb':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:sv':'String','name_en':'String','name:hu':'String','name:hr':'String','class':'String','name:sq':'String','name:el':'String','name:ga':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'poi','description':''}]}"); //sourceJson = JsonConvert.DeserializeObject<Source>(dataSource.Json); sourceJson.Name = source.Key; sourceJson.Tiles = new List <string> { source.Value.Url }; sourceJson.Scheme = dataSource.Schema.YAxis == YAxis.TMS ? "tms" : "osm"; sourceJson.Bounds = new JValue[] { new JValue(dataSource.Schema.Extent.MinX), new JValue(dataSource.Schema.Extent.MinY), new JValue(dataSource.Schema.Extent.MaxX), new JValue(dataSource.Schema.Extent.MinX) }; } } // Create new vector layer var vectorTilelayer = CreateVectorLayer(sourceJson, symbolProvider); // Layer has a list of ThemeStyles, one for each style in style file vectorTilelayer.Style = new StyleCollection(); // Add all ThemeStyles for this layer foreach (var styleLayer in styleJson.StyleLayers) { ((StyleCollection)vectorTilelayer.Style).Add(styleLayer.Style); } // Add bounds to bounds of SymbolProvider symbolProvider.Bounds.Join(((VectorTileProvider)vectorTilelayer.DataSource).Bounds); // Only when Style avalible vectorTilelayer.Enabled = ((StyleCollection)vectorTilelayer.Style).Count > 0; // Add layer to map map.Layers.Add(vectorTilelayer); break; case "geoJson": break; case "image": break; case "video": break; default: throw new ArgumentException($"{source.Value.Type} isn't a valid source"); } } // Now add SymbolLayer at top most on map map.Layers.Add(new Layer("Symbols") { DataSource = symbolProvider, CRS = "EPSG:3857", MinVisible = 0, MaxVisible = double.PositiveInfinity, }); if (styleJson.Center != null) { Center = Projection.SphericalMercator.FromLonLat(styleJson.Center[0], styleJson.Center[1]); map.NavigateTo(Center); } map.ZoomMode = ZoomMode.None; }
public void TestConstructorFilename() { MbTilesTileSource source; Assert.DoesNotThrow(() => source = new MbTilesTileSource(MbTilesFile)); }
private static IDrawableTileSource CreateVectorTileSource(JsonStyleFile jsonStyle, string name, JsonSource source, MGLSpriteAtlas spriteAtlas) { JsonSource jsonSource = null; if (!string.IsNullOrEmpty(source.Url)) { if (source.Url.StartsWith("http")) { // TODO: Get TileJSON from http/https url jsonSource = JsonConvert.DeserializeObject <JsonSource>(@"{'tiles':['https://free.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key=tXiQqN3lIgskyDErJCeY'],'name':'OpenMapTiles','format':'pbf','basename':'v3.7.mbtiles','id':'openmaptiles','attribution':'<a href=\'http://www.openmaptiles.org/\' target=\'_blank\'>© OpenMapTiles</a> <a href=\'http://www.openstreetmap.org/about/\' target=\'_blank\'>© OpenStreetMap contributors</a>','description':'A tileset showcasing all layers in OpenMapTiles. http://openmaptiles.org','maxzoom':14,'minzoom':0,'pixel_scale':'256','vector_layers':[{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'water','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'waterway','description':''},{'maxzoom':14,'fields':{'class':'String','subclass':'String'},'minzoom':0,'id':'landcover','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'landuse','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:nl':'String','name:pl':'String','ele':'Number','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:ru':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ele_ft':'Number','name:ja_kana':'String','name:is':'String','osm_id':'Number','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'mountain_peak','description':''},{'maxzoom':14,'fields':{'class':'String'},'minzoom':0,'id':'park','description':''},{'maxzoom':14,'fields':{'admin_level':'Number','disputed':'Number','maritime':'Number'},'minzoom':0,'id':'boundary','description':''},{'maxzoom':14,'fields':{'ref':'String','class':'String'},'minzoom':0,'id':'aeroway','description':''},{'maxzoom':14,'fields':{'layer':'Number','service':'String','level':'Number','brunnel':'String','indoor':'Number','ramp':'Number','subclass':'String','oneway':'Number','class':'String'},'minzoom':0,'id':'transportation','description':''},{'maxzoom':14,'fields':{'render_min_height':'Number','render_height':'Number'},'minzoom':0,'id':'building','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'water_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','layer':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','subclass':'String','name:de':'String','indoor':'Number','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','network':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ref':'String','name:ja_kana':'String','level':'Number','ref_length':'Number','name:is':'String','name:th':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'transportation_name','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','capital':'Number','name:sl':'String','name:lv':'String','name:ja':'String','name:ko_rm':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:th':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','iso_a2':'String','name:ja_kana':'String','name:is':'String','name:lt':'String','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'place','description':''},{'maxzoom':14,'fields':{'housenumber':'String'},'minzoom':0,'id':'housenumber','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','rank':'Number','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:ru':'String','name:pl':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','subclass':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:lt':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:ko_rm':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','name:ja_kana':'String','name:is':'String','name:th':'String','agg_stop':'Number','name:latin':'String','name:sr-Latn':'String','name:et':'String','name:nl':'String','name:es':'String'},'minzoom':0,'id':'poi','description':''},{'maxzoom':14,'fields':{'name:mt':'String','name:pt':'String','name:az':'String','name:cy':'String','name:rm':'String','name:ko':'String','name:kn':'String','name:ar':'String','name:cs':'String','name_de':'String','name:ro':'String','name:it':'String','name_int':'String','name:nl':'String','name:pl':'String','ele':'Number','name:lt':'String','name:ca':'String','name:hu':'String','name:ka':'String','name:fi':'String','name:da':'String','name:de':'String','name:tr':'String','name:fr':'String','name:mk':'String','name:nonlatin':'String','name:fy':'String','name:zh':'String','name:latin':'String','name:sl':'String','name:lv':'String','name:ja':'String','name:ko_rm':'String','name:no':'String','name:kk':'String','name:sv':'String','name:he':'String','name:ja_rm':'String','name:ga':'String','name:br':'String','name:bs':'String','name:lb':'String','class':'String','name:la':'String','name:sk':'String','name:uk':'String','name:hy':'String','name:ru':'String','name:be':'String','name_en':'String','name:bg':'String','name:hr':'String','name:sr':'String','name:sq':'String','name:th':'String','name:el':'String','name:eo':'String','name:en':'String','name':'String','name:gd':'String','ele_ft':'Number','name:ja_kana':'String','name:is':'String','osm_id':'Number','iata':'String','icao':'String','name:sr-Latn':'String','name:et':'String','name:es':'String'},'minzoom':0,'id':'aerodrome_label','description':''}],'center':[-12.2168,28.6135,4],'bounds':[-180,-85.0511,180,85.0511],'maskLevel':'8','planettime':'1523232000000','version':'3.7','tilejson':'2.0.0'}"); jsonSource.Name = name; } else if (source.Url.StartsWith("mbtiles")) { var filename = source.Url.Substring(10); filename = Path.Combine(DirectoryForFiles, filename); if (!File.Exists(filename)) { return(null); } var connection = new SQLiteConnectionString(filename, false); var dataSource = new MbTilesTileSource(connection); jsonSource = JsonConvert.DeserializeObject <JsonSource>(dataSource.Json); jsonSource.Name = name; jsonSource.Tiles = new List <string> { source.Url }; jsonSource.Scheme = dataSource.Schema.YAxis == YAxis.TMS ? "tms" : "osm"; jsonSource.Bounds = new JValue[] { new JValue(dataSource.Schema.Extent.MinX), new JValue(dataSource.Schema.Extent.MinY), new JValue(dataSource.Schema.Extent.MaxX), new JValue(dataSource.Schema.Extent.MinX) }; } } if (jsonSource == null) { return(null); } // Create new vector layer var tileSource = CreateTileSource(jsonSource); if (jsonSource.Bounds != null) { var left = jsonSource.Bounds[0].Type == JTokenType.Float ? (float)jsonSource.Bounds[0] : -180.0f; var bottom = jsonSource.Bounds[1].Type == JTokenType.Float ? (float)jsonSource.Bounds[1] : -85.0511f; var right = jsonSource.Bounds[2].Type == JTokenType.Float ? (float)jsonSource.Bounds[2] : 180.0f; var top = jsonSource.Bounds[3].Type == JTokenType.Float ? (float)jsonSource.Bounds[3] : 85.0511f; } var vectorTileSource = new MGLVectorTileSource(name, tileSource) { //MinVisible = (jsonSource?.ZoomMax ?? 30).ToResolution(), //MaxVisible = (jsonSource?.ZoomMin ?? 0).ToResolution(), TileSize = (int)jsonSource?.TileSize, }; // If we have a new vector tile provider, than get styles for this if (vectorTileSource != null) { vectorTileSource.StyleLayers.AddRange(ExtractStyles(vectorTileSource.Name, jsonStyle.StyleLayers, spriteAtlas)); } return(vectorTileSource); }