private IEnumerable <string> CollectLayerIds()
        {
            HashSet <string> ids = new HashSet <string>();

            foreach (var layer in _map.MapLayer)
            {
                ids.Add(layer.ResourceId);
            }
            IMapDefinition3 mdf3 = _map as IMapDefinition3;

            if (_map.BaseMap != null)
            {
                foreach (var grp in _map.BaseMap.BaseMapLayerGroups)
                {
                    foreach (var layer in grp.BaseMapLayer)
                    {
                        ids.Add(layer.ResourceId);
                    }
                }
            }
            else if (mdf3 != null && !string.IsNullOrEmpty(mdf3.TileSetDefinitionID))
            {
                var tsd = (ITileSetDefinition)_service.CurrentConnection.ResourceService.GetResource(mdf3.TileSetDefinitionID);
                foreach (var grp in tsd.BaseMapLayerGroups)
                {
                    foreach (var layer in grp.BaseMapLayer)
                    {
                        ids.Add(layer.ResourceId);
                    }
                }
            }
            return(ids);
        }
        public void DeserializationTest_V30()
        {
            var res = ObjectFactory.DeserializeXml(Utils.ReadAllText($"Resources{System.IO.Path.DirectorySeparatorChar}UT_LinkedTileSet.mdf"));

            Assert.IsAssignableFrom <IMapDefinition3>(res);
            IMapDefinition3 mdf = (IMapDefinition3)res;

            Assert.Equal("Base Map linked to Tile Set", mdf.Name);
            Assert.Equal("PROJCS[\"WGS84.PseudoMercator\",GEOGCS[\"LL84\",DATUM[\"WGS84\",SPHEROID[\"WGS84\",6378137.000,298.25722293]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Popular Visualisation Pseudo Mercator\"],PARAMETER[\"false_easting\",0.000],PARAMETER[\"false_northing\",0.000],PARAMETER[\"central_meridian\",0.00000000000000],UNIT[\"Meter\",1.00000000000000]]", mdf.CoordinateSystem);
            Assert.NotNull(mdf.Extents);
            var extent = mdf.Extents;

            Assert.Equal(-9773613.7373958, extent.MinX);
            Assert.Equal(5417109.9090669, extent.MinY);
            Assert.Equal(-9758770.5921973, extent.MaxX);
            Assert.Equal(5435129.2308673, extent.MaxY);
            Assert.Equal(1, mdf.GetDynamicLayerCount());
            Assert.NotNull(mdf.GetLayerByName("RoadCenterLines"));
            Assert.Equal(TileSourceType.External, mdf.TileSourceType);
            Assert.Equal("Library://UnitTests/TileSets/Sheboygan.TileSetDefinition", mdf.TileSetDefinitionID);
        }
        public void CreateTest_V30()
        {
            var res = ObjectFactory.CreateMapDefinition(new Version(3, 0, 0), "TestMap");

            Assert.IsAssignableFrom <IMapDefinition3>(res);
            IMapDefinition3 mdf = (IMapDefinition3)res;

            Assert.Equal("TestMap", res.Name);
            Assert.Null(mdf.BaseMap);
            Assert.Equal(TileSourceType.None, mdf.TileSourceType);
            Assert.Null(mdf.TileSetDefinitionID);

            Assert.Throws <ArgumentException>(() => mdf.TileSetDefinitionID = "Library://Test.asgkjdsf");
            mdf.TileSetDefinitionID = "Library://UnitTests/TileSets/Sheboygan.TileSetDefinition";

            Assert.Equal("Library://UnitTests/TileSets/Sheboygan.TileSetDefinition", mdf.TileSetDefinitionID);
            Assert.Equal(TileSourceType.External, mdf.TileSourceType);
            mdf.InitBaseMap();
            Assert.Equal(TileSourceType.Inline, mdf.TileSourceType);
            Assert.Null(mdf.TileSetDefinitionID);
        }
Exemple #4
0
        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);
        }