public void TileSeeder_WithDefaultWalker() { var mdfId = "Library://Samples/Sheboygan/MapsTiled/Sheboygan.MapDefinition"; var mdf = ObjectFactory.CreateMapDefinition(new Version(1, 0, 0), "Sheboygan"); mdf.ResourceID = mdfId; mdf.InitBaseMap(); var group = mdf.BaseMap.AddBaseLayerGroup("Base Layer Group"); group.Visible = true; foreach (double scale in TileTests.SCALE_LIST.Reverse()) { mdf.BaseMap.AddFiniteDisplayScale(scale); } mdf.SetExtents(-87.764986990962839, 43.691398128787782, -87.695521510899724, 43.797520000480347); var walkOptions = new DefaultTileWalkOptions(mdf); walkOptions.MetersPerUnit = 111319.490793274; var walker = new DefaultTileWalker(walkOptions); var mockTileSvc = new Mock <ITileService>(); mockTileSvc .Setup(t => t.GetTile(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <int>())) .Returns(() => MemoryStreamPool.GetStream()); var options = new TileSeederOptions(); var seeder = new TileSeeder(mockTileSvc.Object, walker, options); var stats = seeder.Run(); Assert.Equal(mdfId, stats.ResourceID); Assert.Equal(127472, stats.TilesRendered); mockTileSvc.Verify(t => t.GetTile(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <int>()), Times.Exactly(stats.TilesRendered)); /* * var tiles = walker.GetTileList(); * for (int i = 0; i < tiles.Length; i++) * { * var t = tiles[i]; * mockTileSvc.Verify(ts => ts.GetTile(mdfId, t.GroupName, t.Col, t.Row, t.Scale), Times.Once()); * } */ }
static int ReplayMapGuide(MgReplayOptions options) { int ret = 0; try { options.Validate(); var conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http", "Url", options.MapAgentUri, "Username", options.Username, "Password", options.Password); var tileSvc = (ITileService)conn.GetService((int)ServiceType.Tile); var walker = new TileListWalker(options.TileListFile); walker.ResourceID = options.ResourceID; var seederOptions = new TileSeederOptions(); seederOptions.MaxDegreeOfParallelism = options.MaxDegreeOfParallelism; seederOptions.ErrorLogger = ErrorLogger; var seeder = new TileSeeder(tileSvc, walker, seederOptions); var progress = new ConsoleProgress(); var stats = seeder.Run(progress); Console.WriteLine($"Rendered {stats.TilesRendered} tiles in {stats.Duration}"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); ret = 1; } finally { if (options.Wait) { Console.WriteLine("Press any key to continue"); Console.Read(); } } return(ret); }
public void TileSeeder_WithDefaultWalkerAndCustomBounds() { var mdfId = "Library://Samples/Sheboygan/MapsTiled/Sheboygan.MapDefinition"; var mdf = ObjectFactory.CreateMapDefinition(new Version(1, 0, 0), "Sheboygan"); mdf.ResourceID = mdfId; mdf.InitBaseMap(); var group = mdf.BaseMap.AddBaseLayerGroup("Base Layer Group"); group.Visible = true; foreach (double scale in TileTests.SCALE_LIST.Reverse()) { mdf.BaseMap.AddFiniteDisplayScale(scale); } mdf.SetExtents(-87.764986990962839, 43.691398128787782, -87.695521510899724, 43.797520000480347); var ovExtents = ObjectFactory.CreateEnvelope(-87.7278601614039, 43.7443959276596, -87.7135994943579, 43.7592852552018); var walkOptions = new DefaultTileWalkOptions(mdf); walkOptions.MetersPerUnit = 111319.490793274; walkOptions.OverrideExtents = ovExtents; var walker = new DefaultTileWalker(walkOptions); var mockTileSvc = new Mock <ITileService>(); mockTileSvc .Setup(t => t.GetTile(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <int>())) .Returns(() => MemoryStreamPool.GetStream()); var options = new TileSeederOptions(); var seeder = new TileSeeder(mockTileSvc.Object, walker, options); var stats = seeder.Run(); Assert.Equal(mdfId, stats.ResourceID); //I don't know the exact number here, but it should be less than the original and //greater than the bogus amount of 10 tiles Assert.True(stats.TilesRendered < 127472); Assert.True(stats.TilesRendered > 10); mockTileSvc.Verify(t => t.GetTile(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <int>()), Times.Exactly(stats.TilesRendered)); }
static async Task <int> RunXYZAsync(XYZSeederOptions options) { int ret = 0; try { options.Validate(); var xyz = new XYZTileService(options.UrlTemplate); var walker = new XYZTileWalker(options.MinX, options.MinY, options.MaxX, options.MaxY, options.MaxZoomLevel ?? XYZTileWalker.DEFAULT_MAX_ZOOM_LEVEL); if (options.SpecificZoomLevels != null) { walker.SetSpecificZoomLevels(options.SpecificZoomLevels); } var seederOptions = new TileSeederOptions(); seederOptions.MaxDegreeOfParallelism = options.MaxDegreeOfParallelism; seederOptions.ErrorLogger = ErrorLogger; var seeder = new TileSeeder(xyz, walker, seederOptions); var progress = new ConsoleProgress(); var stats = await seeder.RunAsync(progress); Console.WriteLine($"Rendered {stats.TilesRendered} tiles in {stats.Duration}"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); ret = 1; } finally { if (options.Wait) { Console.WriteLine("Press any key to continue"); Console.Read(); } } return(ret); }
static int RunXYZ(XYZSeederOptions options) { int ret = 0; try { options.Validate(); var xyz = new XYZTileService(options.UrlTemplate); var walker = new XYZTileWalker(options.MinX, options.MinY, options.MaxX, options.MaxY); var seederOptions = new TileSeederOptions(); seederOptions.MaxDegreeOfParallelism = options.MaxDegreeOfParallelism; seederOptions.ErrorLogger = ErrorLogger; var seeder = new TileSeeder(xyz, walker, seederOptions); var progress = new ConsoleProgress(); var stats = seeder.Run(progress); Console.WriteLine($"Rendered {stats.TilesRendered} tiles in {stats.Duration}"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); ret = 1; } finally { if (options.Wait) { Console.WriteLine("Press any key to continue"); Console.Read(); } } return(ret); }
static int RunMapGuide(MgTileSeederOptions options) { int ret = 0; try { options.Validate(); var conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http", "Url", options.MapAgentUri, "Username", options.Username, "Password", options.Password); var tileSvc = (ITileService)conn.GetService((int)ServiceType.Tile); var res = conn.ResourceService.GetResource(options.ResourceID); DefaultTileWalkOptions walkOptions = null; switch (res) { case IMapDefinition mdf: walkOptions = new DefaultTileWalkOptions(mdf, options.Groups.ToArray()); //If meters-per-unit not specified and this is >= 2.6 or higher, we can use //CREATERUNTIMEMAP to get this value if (options.MetersPerUnit == default(double)) { if (conn.SiteVersion >= new Version(2, 6)) { Console.WriteLine("Using CREATERUNTIMEMAP to obtain required meters-per-unit value"); var createRt = (ICreateRuntimeMap)conn.CreateCommand((int)CommandType.CreateRuntimeMap); createRt.MapDefinition = options.ResourceID; createRt.RequestedFeatures = (int)RuntimeMapRequestedFeatures.None; var rtMapInfo = createRt.Execute(); options.MetersPerUnit = rtMapInfo.CoordinateSystem.MetersPerUnit; Console.WriteLine($"Using meters-per-unit value of: {options.MetersPerUnit}"); } } break; case ITileSetDefinition tsd: walkOptions = new DefaultTileWalkOptions(tsd, options.Groups.ToArray()); //Wrong options. Fortunately we have enough information here to tell them what the *correct* //arguments are if (tsd.TileStoreParameters.TileProvider == "XYZ") { var bbox = tsd.Extents; var urls = new List <string>(); foreach (var grp in tsd.BaseMapLayerGroups) { urls.Add(options.MapAgentUri + "?OPERATION=GETTILEIMAGE&VERSION=1.2.0&USERNAME=Anonymous&MAPDEFINITION=" + tsd.ResourceID + "&BASEMAPLAYERGROUPNAME=" + grp.Name + "&TILECOL={y}&TILEROW={x}&SCALEINDEX={z}"); } Console.WriteLine("[ERROR]: Cannot use mapguide tiling mode for seeding XYZ tile sets. Use xyz tiling mode instead. Example(s):"); foreach (var url in urls) { Console.WriteLine($" MgTileSeeder xyz --url \"{url}\" --minx {bbox.MinX} --miny {bbox.MinY} --maxx {bbox.MaxX} --maxy {bbox.MaxY}"); } if (options.Wait) { Console.WriteLine("Press any key to continue"); Console.Read(); } return(1); } //If meters-per-unit not specified and the tile set is using the "Default" provider, we can create //a Map Definition linked to the tile set, save it to a temp resource and call CREATERUNTIMEMAP //from it to obtain the reuqired meters-per-unit value if (options.MetersPerUnit == default(double) && tsd.TileStoreParameters.TileProvider == "Default") { IMapDefinition3 mdf3 = (IMapDefinition3)ObjectFactory.CreateMapDefinition(new Version(3, 0, 0), "LinkedTileSet"); string tmpId = $"Session:{conn.SessionID}//{mdf3.Name}.MapDefinition"; var text = tsd.Extents; mdf3.SetExtents(text.MinX, text.MinY, text.MaxX, text.MaxY); mdf3.CoordinateSystem = tsd.GetDefaultCoordinateSystem(); mdf3.TileSetDefinitionID = tsd.ResourceID; conn.ResourceService.SaveResourceAs(mdf3, tmpId); Console.WriteLine("Using CREATERUNTIMEMAP to obtain required meters-per-unit value"); var createRt = (ICreateRuntimeMap)conn.CreateCommand((int)CommandType.CreateRuntimeMap); createRt.MapDefinition = tmpId; createRt.RequestedFeatures = (int)RuntimeMapRequestedFeatures.None; var rtMapInfo = createRt.Execute(); options.MetersPerUnit = rtMapInfo.CoordinateSystem.MetersPerUnit; Console.WriteLine($"Using meters-per-unit value of: {options.MetersPerUnit}"); } break; default: throw new ArgumentException("Invalid resource type"); } walkOptions.MetersPerUnit = options.MetersPerUnit; var walker = new DefaultTileWalker(walkOptions); var seederOptions = new TileSeederOptions(); seederOptions.MaxDegreeOfParallelism = options.MaxDegreeOfParallelism; seederOptions.ErrorLogger = ErrorLogger; var seeder = new TileSeeder(tileSvc, walker, seederOptions); var progress = new ConsoleProgress(); var stats = seeder.Run(progress); Console.WriteLine($"Rendered {stats.TilesRendered} tiles in {stats.Duration}"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); ret = 1; } finally { if (options.Wait) { Console.WriteLine("Press any key to continue"); Console.Read(); } } return(ret); }
public async Task <int> PublishAsync(IStaticMapPublishingOptions options) { _tileStart = DateTime.UtcNow; string imgDir = null; string utfDir = null; bool downloadedImageTiles = false; bool downloadedUTFGridTiles = false; if (!string.IsNullOrEmpty(options.ImageTileSet?.ResourceID)) { imgDir = GetImageTileSaveDirectory(options, o => o.ImageTileSet.ResourceID); Directory.CreateDirectory(imgDir); } if (!string.IsNullOrEmpty(options.UTFGridTileSet?.ResourceID)) { utfDir = GetImageTileSaveDirectory(options, o => o.UTFGridTileSet.ResourceID); Directory.CreateDirectory(utfDir); } if (!string.IsNullOrEmpty(options.ImageTileSet?.ResourceID)) { if (options.ImageTileSet.Mode == TileSetRefMode.Local && !options.ImageTileSet.SkipTileDownloading) { var tileSvc = new XYZTileService(BuildUrlTemplate(options, o => o.ImageTileSet.ResourceID, o => o.ImageTileSet.GroupName)); var walker = new XYZTileWalker(options.Bounds.MinX, options.Bounds.MinY, options.Bounds.MaxX, options.Bounds.MaxY); var seedOpts = new TileSeederOptions { MaxDegreeOfParallelism = options.MaxDegreeOfParallelism }; if (Directory.Exists(imgDir)) { seedOpts.SaveTile = (tr, stream) => { var tilePath = Path.Combine(imgDir, tr.GroupName, $"{tr.Scale}" /* z */, $"{tr.Row}" /* x */, $"{tr.Col}.png" /* y */); var parentDir = Path.GetDirectoryName(tilePath); if (!Directory.Exists(parentDir)) { Directory.CreateDirectory(parentDir); } using (var fw = File.OpenWrite(tilePath)) { Utility.CopyStream(stream, fw); } }; } else { seedOpts.SaveTile = null; } seedOpts.ErrorLogger = (tr, ex) => { }; var seeder = new TileSeeder(tileSvc, walker, seedOpts); seeder.RandomizeRequests = options.RandomizeRequests; await seeder.RunAsync(this); downloadedImageTiles = true; } else { await _stdout.WriteLineAsync($"Skipping downloading of tiles for: {options.ImageTileSet.ResourceID}"); } } var imageElapsed = DateTime.UtcNow - _tileStart; _tileStart = DateTime.UtcNow; if (!string.IsNullOrEmpty(options.UTFGridTileSet?.ResourceID)) { if (options.UTFGridTileSet.Mode == TileSetRefMode.Local && !options.UTFGridTileSet.SkipTileDownloading) { var tileSvc = new XYZTileService(BuildUrlTemplate(options, o => o.UTFGridTileSet.ResourceID, o => o.UTFGridTileSet.GroupName)); var walker = new XYZTileWalker(options.Bounds.MinX, options.Bounds.MinY, options.Bounds.MaxX, options.Bounds.MaxY); var seedOpts = new TileSeederOptions { MaxDegreeOfParallelism = options.MaxDegreeOfParallelism }; if (Directory.Exists(utfDir)) { seedOpts.SaveTile = (tr, stream) => { var tilePath = Path.Combine(utfDir, tr.GroupName, $"{tr.Scale}" /* z */, $"{tr.Row}" /* x */, $"{tr.Col}.json" /* y */); var parentDir = Path.GetDirectoryName(tilePath); if (!Directory.Exists(parentDir)) { Directory.CreateDirectory(parentDir); } using (var fw = File.OpenWrite(tilePath)) { Utility.CopyStream(stream, fw); } }; } else { seedOpts.SaveTile = null; } seedOpts.ErrorLogger = (tr, ex) => { }; var seeder = new TileSeeder(tileSvc, walker, seedOpts); seeder.RandomizeRequests = options.RandomizeRequests; await seeder.RunAsync(this); downloadedUTFGridTiles = true; } else { await _stdout.WriteLineAsync($"Skipping downloading of tiles for: {options.UTFGridTileSet.ResourceID}"); } } var utfElapsed = DateTime.UtcNow - _tileStart; if (downloadedImageTiles) { await _stdout.WriteLineAsync($"Image tiles downloaded in {(int)imageElapsed.TotalSeconds}s"); } if (downloadedUTFGridTiles) { await _stdout.WriteLineAsync($"UTFGrid tiles downloaded in {(int)utfElapsed.TotalSeconds}s"); } return(0); }