Пример #1
0
 public FetchInfo(FetchInfo fetchInfo)
 {
     Extent     = new MRect(fetchInfo.Extent);
     Resolution = fetchInfo.Resolution;
     CRS        = fetchInfo.CRS;
     ChangeType = fetchInfo.ChangeType;
 }
Пример #2
0
        public void TileFetcherWithFailingFetchesShouldTryAgain()
        {
            // Arrange
            var tileProvider = new FailingTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher = new TileFetchDispatcher(cache, tileSource.Schema, async tileInfo => await TileToFeatureAsync(tileSource, tileInfo));
            var tileMachine     = new FetchMachine(fetchDispatcher);
            var level           = 3;
            var tilesInLevel    = 64;
            var fetchInfo       = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[level].UnitsPerPixel);

            // Act
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            // Act again
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            // Assert
            Assert.AreEqual(tilesInLevel * 2, tileProvider.TotalCount); // tried all tiles twice
        }
Пример #3
0
        public void RepeatedRestartsShouldNotCauseInfiniteLoop()
        {
            // Arrange
            var tileProvider = new CountingTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher  = new TileFetchDispatcher(cache, tileSource.Schema, tileInfo => TileToFeature(tileSource, tileInfo));
            var tileMachine      = new FetchMachine(fetchDispatcher);
            var numberOfWorkers  = 8;
            var numberOfRestarts = 3;
            var fetchInfo        = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[3].UnitsPerPixel);

            // Act
            for (var i = 0; i < numberOfRestarts; i++)
            {
                fetchDispatcher.SetViewport(fetchInfo);
                tileMachine.Start();
                while (fetchDispatcher.Busy)
                {
                    Thread.Sleep(1);
                }
            }

            // Assert
            Assert.Greater(numberOfWorkers * numberOfRestarts, FetchWorker.RestartCounter);
        }
Пример #4
0
        public void TestExceptionOnProvider()
        {
            // arrange
            var provider = new FakeProvider();

            using var imageLayer = new ImageLayer("imageLayer")
                  {
                      DataSource = provider
                  };
            using var map = new Map();
            map.Layers.Add(imageLayer);
            using var waitHandle = new AutoResetEvent(false);
            Exception?exception = null;

            imageLayer.DataChanged += (_, args) => {
                exception = args.Error;
                waitHandle.Go();
            };

            var fetchInfo = new FetchInfo(new MRect(-1, -1, 0, 0), 1, null, ChangeType.Discrete);

            // act
            map.RefreshData(fetchInfo);

            // assert
            waitHandle.WaitOne();
            Assert.AreEqual(ExceptionMessage, exception?.Message);
        }
Пример #5
0
        public void TestTimer()
        {
            // arrange
            DefaultRendererFactory.Create = () => new MapRenderer();
            using var memoryLayer         = CreatePointLayer();
            using var layer = new RasterizingLayer(memoryLayer);
            var schema     = new GlobalSphericalMercator();
            var box        = schema.Extent.ToMRect();
            var resolution = schema.Resolutions.First().Value.UnitsPerPixel;

            using var waitHandle = new AutoResetEvent(false);

            Assert.AreEqual(0, layer.GetFeatures(box, resolution).Count());
            layer.DataChanged += (_, _) => {
                // assert
                waitHandle.Set();
            };

            var fetchInfo = new FetchInfo(box, resolution, null, ChangeType.Discrete);

            // act
            layer.RefreshData(fetchInfo);

            // assert
            waitHandle.WaitOne();
            Assert.AreEqual(layer.GetFeatures(box, resolution).Count(), 1);
        }
Пример #6
0
        public void TileFetcherShouldRequestAllTilesJustOnes()
        {
            // Arrange
            var tileProvider = new CountingTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher = new TileFetchDispatcher(cache, tileSource.Schema, tileInfo => TileToFeature(tileSource, tileInfo));
            var tileMachine     = new FetchMachine(fetchDispatcher);
            var level           = 3;
            var expectedTiles   = 64;

            var fetchInfo = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[level].UnitsPerPixel);

            // Act
            // Get all tiles of level 3
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            // Assert
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            Assert.AreEqual(expectedTiles, tileProvider.CountByTile.Keys.Count);
            Assert.AreEqual(expectedTiles, tileProvider.CountByTile.Values.Sum());
            Assert.AreEqual(expectedTiles, tileProvider.TotalCount);
        }
Пример #7
0
        public void TileRequestThatReturnsNullShouldNotBeRequestedAgain()
        {
            // Arrange
            var tileProvider = new NullTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher = new TileFetchDispatcher(cache, tileSource.Schema, tileInfo => TileToFeature(tileSource, tileInfo));
            var tileMachine     = new FetchMachine(fetchDispatcher);
            var level           = 3;
            var tilesInLevel    = 64;
            var fetchInfo       = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[level].UnitsPerPixel);

            // Act
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }
            // do it again
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            // Assert
            Assert.AreEqual(tilesInLevel, tileProvider.TotalCount);
        }
Пример #8
0
        public async Task TestFeatureFetcherDelayAsync()
        {
            // arrange
            var extent = new MRect(0, 0, 10, 10);

            using var layer = new Layer
                  {
                      DataSource = new MemoryProvider(GenerateRandomPoints(extent, 25))
                  };
            layer.Delayer.MillisecondsToWait = 0;

            var notifications = new List <bool>();

            layer.PropertyChanged += (_, args) => {
                if (args.PropertyName == nameof(Layer.Busy))
                {
                    notifications.Add(layer.Busy);
                }
            };
            var fetchInfo = new FetchInfo(extent, 1, null, ChangeType.Discrete);

            // act
            layer.RefreshData(fetchInfo);

            // assert
            await Task.Run(() => {
                while (notifications.Count < 2)
                {
                    // just wait until we have two
                }
            });

            Assert.IsTrue(notifications[0]);
            Assert.IsFalse(notifications[1]);
        }
Пример #9
0
        public IEnumerable <IFeature> GetFeatures(FetchInfo fetchInfo)
        {
            // Note that the FetchInfo.CRS is ignored in this method. A better solution
            // would be to use the fetchInfo.CRS everywhere, but that would only make
            // sense if GetExtent would also get a CRS argument. Room for improvement.
            if (fetchInfo.Extent == null)
            {
                return(new List <IFeature>());
            }

            var copiedExtent = new MRect(fetchInfo.Extent);

            // throws exception when CRS or _provider.CRS is null (so I don't have to check it here)
            _projection.Project(CRS !, _provider.CRS !, copiedExtent);
            fetchInfo = new FetchInfo(copiedExtent, fetchInfo.Resolution, CRS, fetchInfo.ChangeType);

            var features = _provider.GetFeatures(fetchInfo) ?? new List <IFeature>();

            if (!CrsHelper.IsProjectionNeeded(_provider.CRS, CRS))
            {
                return(features);
            }

            if (!CrsHelper.IsCrsProvided(_provider.CRS, CRS))
            {
                throw new NotSupportedException($"CRS is not provided. From CRS: {_provider.CRS}. To CRS {CRS}");
            }

            var copiedFeatures = features.Copy().ToList();

            _projection.Project(_provider.CRS, CRS, copiedFeatures);
            return(copiedFeatures);
        }
Пример #10
0
 public Task <IEnumerable <IFeature> > GetFeaturesAsync(FetchInfo fetchInfo)
 {
     if (_extent.Intersects(fetchInfo.Extent))
     {
         return(Task.FromResult((IEnumerable <IFeature>) new[] { _feature }));
     }
     return(Task.FromResult(Enumerable.Empty <IFeature>()));
 }
Пример #11
0
 public IEnumerable <IFeature> GetFeatures(FetchInfo fetchInfo)
 {
     if (_extent.Intersects(fetchInfo.Extent))
     {
         return(new[] { _feature });
     }
     return(new List <IFeature>());
 }
Пример #12
0
        public IEnumerable <IFeature> GetFeatures(FetchInfo fetchInfo)
        {
            var features = new List <RasterFeature>();

            if (TryGetMap(fetchInfo.ToViewport(), out var raster))
            {
                features.Add(new RasterFeature(raster));
            }
            return(features);
        }
Пример #13
0
 /// <inheritdoc />
 public void RefreshData(FetchInfo fetchInfo)
 {
     if (Enabled &&
         fetchInfo.Extent?.GetArea() > 0 &&
         MaxVisible >= fetchInfo.Resolution &&
         MinVisible <= fetchInfo.Resolution)
     {
         _tileFetchDispatcher.SetViewport(fetchInfo);
         _tileFetchDispatcher.StartFetching();
     }
 }
Пример #14
0
        public async Task <IEnumerable <IFeature> > GetFeaturesAsync(FetchInfo fetchInfo)
        {
            if (GetFetchInfo(ref fetchInfo))
            {
                return(Enumerable.Empty <IFeature>());
            }

            var features = await _provider.GetFeaturesAsync(fetchInfo);

            return(features.Project(_provider.CRS, CRS, _projection));
        }
Пример #15
0
        public async Task <IEnumerable <IFeature> > GetFeaturesAsync(FetchInfo fetchInfo)
        {
            var(success, raster) = await TryGetMapAsync(fetchInfo.ToViewport());

            if (success)
            {
                return new[] { new RasterFeature(raster) }
            }
            ;
            return(Enumerable.Empty <IFeature>());
        }
Пример #16
0
        public FeatureFetcher(FetchInfo fetchInfo, IProvider <IFeature> provider, DataArrivedDelegate dataArrived, long timeOfRequest = default)
        {
            _dataArrived = dataArrived;
            var biggerBox = fetchInfo.Extent.Grow(
                SymbolStyle.DefaultWidth * 2 * fetchInfo.Resolution,
                SymbolStyle.DefaultHeight * 2 * fetchInfo.Resolution);

            _fetchInfo = new FetchInfo(biggerBox, fetchInfo.Resolution, fetchInfo.CRS, fetchInfo.ChangeType);

            _provider      = provider;
            _timeOfRequest = timeOfRequest;
        }
Пример #17
0
 public void FetchOnThread(FetchInfo fetchInfo)
 {
     try
     {
         var features = DataSource?.GetFeatures(fetchInfo).ToList();
         FetchCompleted(features, null);
     }
     catch (Exception exception)
     {
         FetchCompleted(null, exception);
     }
 }
Пример #18
0
        public async Task FetchOnThreadAsync(FetchInfo fetchInfo)
        {
            try
            {
                var features = DataSource != null ? await DataSource.GetFeaturesAsync(fetchInfo) : new List <IFeature>();

                FetchCompleted(features, null);
            }
            catch (Exception exception)
            {
                FetchCompleted(null, exception);
            }
        }
Пример #19
0
        public void SetViewport(FetchInfo fetchInfo)
        {
            // Fetch a bigger extent to include partially visible symbols.
            // todo: Take into account the maximum symbol size of the layer

            var biggerBox = fetchInfo.Extent.Grow(
                SymbolStyle.DefaultWidth * 2 * fetchInfo.Resolution,
                SymbolStyle.DefaultHeight * 2 * fetchInfo.Resolution);

            _fetchInfo = new FetchInfo(biggerBox, fetchInfo.Resolution, fetchInfo.CRS, fetchInfo.ChangeType);


            _modified = true;
            Busy      = true;
        }
Пример #20
0
        private bool GetFetchInfo(ref FetchInfo fetchInfo)
        {
            // Note that the FetchInfo.CRS is ignored in this method. A better solution
            // would be to use the fetchInfo.CRS everywhere, but that would only make
            // sense if GetExtent would also get a CRS argument. Room for improvement.
            if (fetchInfo.Extent == null)
            {
                return(true);
            }

            var copiedExtent = new MRect(fetchInfo.Extent);

            // throws exception when CRS or _provider.CRS is null (so I don't have to check it here)
            _projection.Project(CRS !, _provider.CRS !, copiedExtent);
            fetchInfo = new FetchInfo(copiedExtent, fetchInfo.Resolution, CRS, fetchInfo.ChangeType);
            return(false);
        }
Пример #21
0
        public virtual IEnumerable <T> GetFeatures(FetchInfo fetchInfo)
        {
            if (fetchInfo == null)
            {
                throw new ArgumentNullException(nameof(fetchInfo));
            }
            if (fetchInfo.Extent == null)
            {
                throw new ArgumentNullException(nameof(fetchInfo.Extent));
            }

            var features = Features.ToList();

            fetchInfo = new FetchInfo(fetchInfo);
            // Use a larger extent so that symbols partially outside of the extent are included
            var biggerBox     = fetchInfo.Extent?.Grow(fetchInfo.Resolution * SymbolSize * 0.5);
            var grownFeatures = features.Where(f => f != null && (f.Extent?.Intersects(biggerBox) ?? false));

            return(grownFeatures.ToList());
        }
Пример #22
0
        public override IEnumerable <IFeature> GetFeatures(MRect box, double resolution)
        {
            if (box == null)
            {
                return(Enumerable.Empty <IFeature>());
            }

            var biggerBox = box.Grow(
                SymbolStyle.DefaultWidth * 2 * resolution,
                SymbolStyle.DefaultHeight * 2 * resolution);
            var fetchInfo = new FetchInfo(biggerBox, resolution, CRS);

            if (DataSource is null)
            {
                return(Enumerable.Empty <IFeature>());
            }

#pragma warning disable VSTHRD002 // Allow use of .Result for test purposes
            return(DataSource.GetFeaturesAsync(fetchInfo).Result);

#pragma warning restore VSTHRD002 //
        }
Пример #23
0
        public void TilesFetchedShouldNotBeFetchAgain()
        {
            // Arrange
            var tileProvider = new CountingTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher = new TileFetchDispatcher(cache, tileSource.Schema, tileInfo => TileToFeature(tileSource, tileInfo));
            var tileMachine     = new FetchMachine(fetchDispatcher);
            var level           = 3;
            var expectedTiles   = 64;
            var fetchInfo       = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[level].UnitsPerPixel);

            // Act
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }
            var countAfterFirstTry = tileProvider.CountByTile.Keys.Count;

            // do it again
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            // Assert
            Assert.AreEqual(countAfterFirstTry, tileProvider.CountByTile.Values.Sum());
            Assert.AreEqual(expectedTiles, tileProvider.CountByTile.Keys.Count);
            Assert.AreEqual(expectedTiles, tileProvider.CountByTile.Values.Sum());
            Assert.AreEqual(expectedTiles, tileProvider.TotalCount);
        }
Пример #24
0
        public void TileFetcherWithSometimesFailingFetchesShouldTryAgain()
        {
            // Arrange
            var tileProvider = new SometimesFailingTileProvider();
            var tileSchema   = new GlobalSphericalMercator();
            var tileSource   = new TileSource(tileProvider, tileSchema);

            using var cache = new MemoryCache <IFeature?>();
            var fetchDispatcher = new TileFetchDispatcher(cache, tileSource.Schema, tileInfo => TileToFeature(tileSource, tileInfo));
            var tileMachine     = new FetchMachine(fetchDispatcher);
            var level           = 3;
            var tilesInLevel    = 64;
            var fetchInfo       = new FetchInfo(tileSchema.Extent.ToMRect(), tileSchema.Resolutions[level].UnitsPerPixel);

            // Act
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            var tileCountAfterFirstBatch = tileProvider.TotalCount;

            // Act again
            fetchDispatcher.SetViewport(fetchInfo);
            tileMachine.Start();
            while (fetchDispatcher.Busy)
            {
                Thread.Sleep(1);
            }

            // Assert
            Assert.GreaterOrEqual(tileProvider.TotalCount, tileCountAfterFirstBatch);
            Assert.GreaterOrEqual(tileProvider.CountByTile.Values.Sum(), tilesInLevel);
        }
Пример #25
0
 public FetchInfo(FetchInfo rhs)
 {
     this.State = rhs.State;
     this.Since = rhs.Since;
     this.RequestType = rhs.RequestType;
 }
Пример #26
0
 public Task <IEnumerable <IFeature> > GetFeaturesAsync(FetchInfo fetchInfo)
 {
     throw new Exception(ExceptionMessage);
 }
Пример #27
0
 public override void RefreshData(FetchInfo fetchInfo)
 {
     OnDataChanged(new DataChangedEventArgs());
 }
Пример #28
0
        public async Task <IEnumerable <IFeature> > GetFeaturesAsync(FetchInfo fetchInfo)
        {
            var features = await _provider.GetFeaturesAsync(fetchInfo);

            return(GetFeaturesInView(fetchInfo.Resolution, _labelStyle, features, _rectangleLine, _rectangleFill));
        }
Пример #29
0
 public IEnumerable <IFeature> GetFeatures(FetchInfo fetchInfo)
 {
     throw new Exception(ExceptionMessage);
 }
Пример #30
0
 public static Viewport ToViewport(this FetchInfo fetchInfo)
 {
     return(Viewport.Create(fetchInfo.Extent, fetchInfo.Resolution));
 }
Пример #31
0
            public uint Whitelist; // bitmask flags, see WL_ALL

            #endregion Fields

            #region Constructors

            public PlayerModel()
            {
                Name = null;
                Team = -1;
                Squad = -1;
                EAGUID = String.Empty;
                FirstSeenTimestamp = DateTime.Now;
                FirstSpawnTimestamp = DateTime.MinValue;
                LastSeenTimestamp = DateTime.MinValue;
                Tag = String.Empty;
                TagVerified = false;
                ScoreRound = -1;
                KillsRound = -1;
                DeathsRound = -1;
                Rounds = -1;
                Rank = -1;
                KDRRound = -1;
                SPMRound = -1;
                KPMRound = -1;
                ScoreTotal = 0;
                KillsTotal = 0;
                DeathsTotal = 0;
                MovesTotal = 0;
                MovesByMBTotal = 0;
                IsDeployed = false;
                MovesRound = 0;
                MovesByMBRound = 0;
                MovedTimestamp = DateTime.MinValue;
                MovedByMBTimestamp = DateTime.MinValue;
                SpawnChatMessage = String.Empty;
                SpawnYellMessage = String.Empty;
                QuietMessage = false;
                DelayedMove = null;
                LastMoveTo = 0;
                LastMoveFrom = 0;
                TagFetchStatus = new FetchInfo();
                ScrambledSquad = -1;
                OriginalSquad = -1;
                DispersalGroup = 0;
                Friendex = -1;
                KDR = -1;
                SPM = -1;
                KPM = -1;
                StatsVerified = false;
                PersonaId = String.Empty;
                StatsFetchStatus = new FetchInfo();
                Subscribed = false;
                Whitelist = 0;
            }
Пример #32
0
        public IEnumerable <IFeature> GetFeatures(FetchInfo fetchInfo)
        {
            var features = _provider.GetFeatures(fetchInfo);

            return(GetFeaturesInView(fetchInfo.Resolution, _labelStyle, features, _rectangleLine, _rectangleFill));
        }