コード例 #1
0
        private static TileLayer GetKaagTileLayer()
        {
            var mbTilesTileSource = new MbTilesTileSource(App.MbTileConnectionString);
            var mbTilesLayer      = new TileLayer(mbTilesTileSource);

            return(mbTilesLayer);
        }
コード例 #2
0
        public static TileLayer CreateMbTilesLayer(string path)
        {
            var mbTilesTileSource = new MbTilesTileSource(new SQLiteConnectionString(path, true));
            var mbTilesLayer      = new TileLayer(mbTilesTileSource);

            return(mbTilesLayer);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: zwzhlj100000/BruTile
        static void Main()
        {
            MbTilesTileSource.SetPlatform(new SQLite.Net.Platform.Win32.SQLitePlatformWin32());

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MbTilesForm());
        }
コード例 #5
0
ファイル: MbTilesForm.cs プロジェクト: ymx0627/BruTile
        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;
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: ymx0627/BruTile
        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}");
        }
コード例 #8
0
ファイル: MbTilesSample.cs プロジェクト: mshakurov/ui
        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"
            });
        }
コード例 #9
0
        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);
                    }
                }
            }
        }
コード例 #10
0
 public static ITileSource CreateOfflineSource(string filePath)
 {
     try
     {
         ITileSource layerSource = new MbTilesTileSource(new SQLiteConnectionString(filePath, true), null, MbTilesType.Overlay, true);
         return(layerSource);
     }
     catch
     {
         return(null);
     }
 }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
ファイル: SerializationTests.cs プロジェクト: galchen/brutile
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
        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);
        }
コード例 #20
0
ファイル: MbTilesForm.cs プロジェクト: bertt/BruTile
        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);
        }
コード例 #21
0
ファイル: MbTilesForm.cs プロジェクト: rsfc/BruTile
        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);
        }
コード例 #22
0
        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);
        }
コード例 #23
0
        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);
        }
コード例 #24
0
        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());
        }
コード例 #25
0
        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);
        }
コード例 #26
0
        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);
        }
コード例 #27
0
        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);
        }
コード例 #28
0
        /// <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);
        }
コード例 #29
0
ファイル: MbTilesForm.cs プロジェクト: ymx0627/BruTile
        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();
                }
            }
        }
コード例 #30
0
ファイル: MbTilesForm.cs プロジェクト: bertt/BruTile
        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;
            }
        }
コード例 #31
0
ファイル: MbTilesForm.cs プロジェクト: bertt/BruTile
        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();
                }
            }
        }
コード例 #32
0
ファイル: MbTilesProviderTest.cs プロジェクト: bertt/BruTile
 public void TestConstructorFilename()
 {
     MbTilesTileSource source;
     Assert.DoesNotThrow( () => source = new MbTilesTileSource(MbTilesFile));
 }
コード例 #33
0
        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\'>&copy; OpenMapTiles</a> <a href=\'http://www.openstreetmap.org/about/\' target=\'_blank\'>&copy; 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;
        }
コード例 #34
0
        public void TestConstructorFilename()
        {
            MbTilesTileSource source;

            Assert.DoesNotThrow(() => source = new MbTilesTileSource(MbTilesFile));
        }
コード例 #35
0
        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\'>&copy; OpenMapTiles</a> <a href=\'http://www.openstreetmap.org/about/\' target=\'_blank\'>&copy; 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);
        }