Пример #1
0
        private static ITheme CreateDefaultGradientTheme(string columnName, Tuple <double, double> tuple)
        {
            double minValue        = tuple.value1;
            double maxValue        = tuple.value2;
            string attribute       = columnName;
            int    numberOfClasses = 10;

            // use polygon for grids so style will be shown nicely in dialog
            var defaultStyle = new VectorStyle {
                GeometryType = typeof(IPolygon)
            };
            var blend = new ColorBlend(new Color[] { Color.Black, Color.White }, new float[] { 0, 1 });
            int size  = (int)defaultStyle.SymbolScale;

            GradientTheme gradientTheme = ThemeFactory.CreateGradientTheme(attribute, defaultStyle,
                                                                           blend,
                                                                           (float)Convert.ChangeType(minValue, typeof(float)),
                                                                           (float)Convert.ChangeType(maxValue, typeof(float)),
                                                                           size,
                                                                           size,
                                                                           false,
                                                                           false);

            return(gradientTheme);
        }
Пример #2
0
        private void UpdateTheme()
        {
            // If there was no theme attached to the layer yet, generate a default theme
            if (featureCoverage == null || featureCoverage.Features == null || featureCoverage.Features.Count == 0)
            {
                return;
            }

            Style.GeometryType = GetFeatureGeometryType(featureCoverage.Features[0] as IFeature);

            // Values to base the theme on
            //List<IVariableFilter> filters = new List<IVariableFilter>();
            if (Coverage.Time != null)
            {
                if (CurrentTime == null && Coverage.Time.Values.Count != 0)
                {
                    CurrentTime = Coverage.Time.Values[0];
                }
                //filters.Add(new VariableValueFilter(featureCoverage.Time, CurrentTime));
            }
            IMultiDimensionalArray <double> values = featureCoverage.GetValues <double>();

            if (null == values)
            {
                return;
            }
            // NOTE: we're getting all values here!

            var featureValues = new List <double>(values.Where(v => !double.IsNaN(v)));

            if (0 == featureValues.Count)
            {
                log.Error("Unable to generate default theme; no values available");
                return;
                //throw new ArgumentException();
            }

            featureValues.Sort();
            double minValue = featureValues.Min();
            double maxValue = featureValues.Max();

            if (minValue == maxValue)
            {
                // Only a single value, so no gradient theme needed/wanted: create a 'blue' single feature theme
                Theme = ThemeFactory.CreateSingleFeatureTheme(Style.GeometryType, Color.Blue, 10);
            }
            else
            {
                // Create 'green to blue' gradient theme
                Theme = ThemeFactory.CreateGradientTheme(Coverage.Components[0].Name, Style,
                                                         new ColorBlend(new Color[] { Color.Green, Color.Blue },
                                                                        new float[] { 0f, 1f }),
                                                         (float)minValue, (float)maxValue, 1, 1, false, true);
            }
        }
Пример #3
0
        public void LayersWithThemeGroupShareMinMax()
        {
            var table = new FeatureDataTable();

            table.Columns.Add("Id", typeof(int));
            table.Columns.Add("X", typeof(double));
            table.Columns.Add("Y", typeof(double));
            table.Columns.Add("Value", typeof(double));
            AddRow(table, new object[] { 0, 5.0, 5.0, 0.0 });
            AddRow(table, new object[] { 1, 10.0, 10.0, 10.0 });
            var dataSource = new DataTablePoint(table, "Id", "X", "Y");

            var table2 = new FeatureDataTable();

            table2.Columns.Add("Id", typeof(int));
            table2.Columns.Add("X", typeof(double));
            table2.Columns.Add("Y", typeof(double));
            table2.Columns.Add("Value", typeof(double));
            AddRow(table2, new object[] { 0, 5.0, 2.0, 0.0 });
            AddRow(table2, new object[] { 1, 10.0, 4.0, 10.0 });
            AddRow(table2, new object[] { 2, 7.0, 10.0, 20.0 });
            var dataSource2 = new DataTablePoint(table2, "Id", "X", "Y");

            var basicTheme = ThemeFactory.CreateGradientTheme("Value", null, ColorBlend.Rainbow7, 0.0, 5.0, 3, 3, false, true, 3);

            var layer = new VectorLayer {
                AutoUpdateThemeOnDataSourceChanged = true, ThemeGroup = "group1", DataSource = dataSource, Theme = basicTheme
            };
            var layer2 = new VectorLayer {
                AutoUpdateThemeOnDataSourceChanged = true, ThemeGroup = "group1", DataSource = dataSource2, Theme = basicTheme
            };

            var map = new Map();

            map.Layers.Add(layer);
            Assert.AreEqual(10.0, ((GradientTheme)layer.Theme).Max); // refresh on add

            map.Layers.Add(layer2);

            Assert.AreEqual(20.0, ((GradientTheme)layer.Theme).Max); // both to max of the group
            Assert.AreEqual(20.0, ((GradientTheme)layer2.Theme).Max);

            map.Layers.Remove(layer2);

            Assert.AreEqual(10.0, ((GradientTheme)layer.Theme).Max); // refresh on remove
        }
        protected override void CreateDefaultTheme()
        {
            // If there was no theme attached to the layer yet, generate a default theme
            if (Theme != null)
            {
                return;
            }

            //looks like min/max should suffice
            var minMaxValue = GetMinMaxValue();

            if (minMaxValue != null && minMaxValue.First != double.MaxValue && minMaxValue.Second != double.MaxValue)
            {
                const int numberOfClasses = 12;
                Theme = ThemeFactory.CreateGradientTheme(Coverage.Components[0].Name, Style,
                                                         ColorBlend.Rainbow7,
                                                         (float)minMaxValue.First, (float)minMaxValue.Second,
                                                         12, 25, false, false, numberOfClasses);
            }
            AutoUpdateThemeOnDataSourceChanged = true;
        }
        protected static ITheme GenerateDefaultTheme(string name, IList noDataValues, object minValue, object maxValue)
        {
            double min = Convert.ToDouble(minValue);
            double max = Convert.ToDouble(maxValue);

            if (double.IsInfinity(min) || double.IsNaN(min))
            {
                log.Debug("Nan or infinity is invalid as minvalue for theme. Changed it to lowest possible value");
                min = double.MinValue;
            }
            if (double.IsInfinity(max) || double.IsNaN(max))
            {
                log.Debug("Nan or infinity is invalid as maxvalue for theme. Changed it to highest possible value");
                max = double.MaxValue;
            }

            var theme = ThemeFactory.CreateGradientTheme(name, null, Thematics.ColorBlend.GreenToBlue, min, max, 1, 1, false, true);

            theme.NoDataValues = noDataValues;

            return(theme);
        }
Пример #6
0
        public void ClonePerformanceTest()
        {
            var table = new FeatureDataTable();

            table.Columns.Add("Id", typeof(int));
            table.Columns.Add("X", typeof(double));
            table.Columns.Add("Y", typeof(double));
            table.Columns.Add("Value", typeof(double));
            AddRow(table, new object[] { 0, 5.0, 5.0, 0.0 });
            AddRow(table, new object[] { 1, 10.0, 10.0, 10.0 });
            var dataSource = new DataTablePoint(table, "Id", "X", "Y");

            var basicTheme = ThemeFactory.CreateGradientTheme("Value", null, ColorBlend.Rainbow7, 0.0, 5.0, 3, 3, false, true, 8);

            var layer = new VectorLayer
            {
                AutoUpdateThemeOnDataSourceChanged = true,
                Theme      = basicTheme,
                DataSource = dataSource
            };

            TestHelper.AssertIsFasterThan(230, () => layer.Clone());
        }
Пример #7
0
        protected override void CreateDefaultTheme()
        {
            // If there was no theme attached to the layer yet, generate a default theme
            if (Theme != null)
            {
                return;
            }

            //looks like min/max should suffice
            var minMaxValue = GetMinMaxValue();

            if (minMaxValue != null)
            {
                var attributeName = ((INetworkCoverage)Coverage).SegmentGenerationMethod == SegmentGenerationMethod.SegmentPerLocation
                                        ? Coverage.Components[0].Name
                                        : "Chainage";

                Theme = ThemeFactory.CreateGradientTheme(attributeName, Style, ColorBlend.Rainbow7,
                                                         (float)minMaxValue.First, (float)minMaxValue.Second,
                                                         10, 25, false, false, 12);
            }
            AutoUpdateThemeOnDataSourceChanged = true;
        }
        public void GradientThemeScaleToWithColorBlends()
        {
            var blend = new ColorBlend(new[] { Color.Black, Color.White }, new[] { 0f, 1f });
            var theme = ThemeFactory.CreateGradientTheme("", null, blend, 0.0, 5.0, 3, 3, false, true, 3);

            AssertColor(Color.Black, theme.GetFillColor(-1.0));
            AssertColor(Color.Black, theme.GetFillColor(0.0));
            AssertColor(Color.FromArgb(255, 64, 64, 64), theme.GetFillColor(1.25));
            AssertColor(Color.FromArgb(255, 128, 128, 128), theme.GetFillColor(2.5));
            AssertColor(Color.FromArgb(255, 191, 191, 191), theme.GetFillColor(3.75));
            AssertColor(Color.White, theme.GetFillColor(5.0));
            AssertColor(Color.White, theme.GetFillColor(6.0));

            theme.ScaleTo(-2.0, 1.0);

            AssertColor(Color.Black, theme.GetFillColor(-3.0));
            AssertColor(Color.Black, theme.GetFillColor(-2.0));
            AssertColor(Color.FromArgb(255, 64, 64, 64), theme.GetFillColor(-1.25));
            AssertColor(Color.FromArgb(255, 128, 128, 128), theme.GetFillColor(-0.5));
            AssertColor(Color.FromArgb(255, 191, 191, 191), theme.GetFillColor(0.25));
            AssertColor(Color.White, theme.GetFillColor(1.0));
            AssertColor(Color.White, theme.GetFillColor(2.0));
        }
Пример #9
0
        private void UpdateTheme()
        {
            // If there was no theme attached to the layer yet, generate a default theme
            if (featureCoverage == null || featureCoverage.Features == null || featureCoverage.Features.Count == 0)
            {
                return;
            }

            Style.GeometryType = GetFeatureGeometryType(featureCoverage.Features[0]);

            // Values to base the theme on
            if (Coverage.Time != null)
            {
                if (CurrentTime == null && Coverage.Time.Values.Count != 0)
                {
                    CurrentTime = Coverage.Time.Values[0];
                }
            }

            IMultiDimensionalArray <double> values = featureCoverage.GetValues <double>();

            if (null == values)
            {
                return;
            }

            // NOTE: we're getting all values here!
            var featureValues = new List <double>(values.Where(v => !double.IsNaN(v) && !double.IsInfinity(v)));

            if (0 == featureValues.Count)
            {
                Log.Error("Unable to generate default theme; no values available");
                return;
            }

            featureValues.Sort();
            double minValue = featureValues.Min();
            double maxValue = featureValues.Max();

            if (base.Theme == null)
            {
                // Create default Theme
                if (minValue == maxValue)
                {
                    // Only a single value, so no gradient theme needed/wanted: create a 'blue' single feature theme
                    Theme = ThemeFactory.CreateSingleFeatureTheme(Style.GeometryType, Color.Blue, 10);
                }
                else
                {
                    // Create 'green to blue' gradient theme
                    Theme = ThemeFactory.CreateGradientTheme(Coverage.Components[0].Name, Style,
                                                             new ColorBlend(new[] { Color.Green, Color.Blue },
                                                                            new[] { 0f, 1f }),
                                                             (float)minValue, (float)maxValue, 1, 1, false, true);
                }
            }
            else
            {
                if (AutoUpdateThemeOnDataSourceChanged)
                {
                    Theme.ScaleTo(minValue, maxValue);
                }
            }
        }
        private void CreateDefaultTheme()
        {
            // If there was no theme attached to the layer yet, generate a default theme
            if (Theme != null || networkCoverage == null || networkCoverage.Locations == null)
            {
                return;
            }

            //looks like min/max should suffice
            IList <double> values = GetAllValues();

            if (null == values)
            {
                return;
            }

            var minValue = networkCoverage.DefaultValue; // ???
            var maxValue = minValue;

            // NOTE: we should be getting al the values here!
            var featureValues = new List <double>(values);

            if (0 != featureValues.Count)
            {
                featureValues.Sort();
                minValue = featureValues[0];
                maxValue = featureValues[featureValues.Count - 1];
            }

            if (minValue == maxValue)
            {
                // Only a single value, so no gradient theme needed/wanted: create a 'blue' single feature theme
                if (networkCoverage.SegmentGenerationMethod != SegmentGenerationMethod.None)
                {
                    SegmentLayer.Theme = ThemeFactory.CreateSingleFeatureTheme(SegmentLayer.Style.GeometryType,
                                                                               Color.PaleTurquoise, 6);
                }
                LocationLayer.Theme = ThemeFactory.CreateSingleFeatureTheme(LocationLayer.Style.GeometryType, Color.Blue, 10);
            }
            else
            {
                int numberOfClasses = 12;
                if (networkCoverage.SegmentGenerationMethod != SegmentGenerationMethod.None)
                {
                    // Create flashy gradient theme
                    if (NetworkCoverage.SegmentGenerationMethod == SegmentGenerationMethod.SegmentPerLocation)
                    {
                        SegmentLayer.Theme = ThemeFactory.CreateGradientTheme(Coverage.Components[0].Name, SegmentLayer.Style,
                                                                              ColorBlend.Rainbow7,
                                                                              (float)minValue, (float)maxValue,
                                                                              10, 25, false,
                                                                              false, numberOfClasses);
                    }
                    else
                    {
                        SegmentLayer.Theme = ThemeFactory.CreateGradientTheme("Offset", SegmentLayer.Style,
                                                                              ColorBlend.Rainbow7,
                                                                              (float)minValue, (float)maxValue,
                                                                              10, 25, false,
                                                                              false, numberOfClasses);
                    }
                }

                LocationLayer.Theme = ThemeFactory.CreateGradientTheme(Coverage.Components[0].Name, LocationLayer.Style,
                                                                       ColorBlend.Rainbow7,
                                                                       (float)minValue, (float)maxValue,
                                                                       12, 25, false, false, numberOfClasses);
            }
        }
        public void GradientThemeRescaledAsExpected()
        {
            var featureCoverage = new FeatureCoverage();

            featureCoverage.Arguments.Add(new Variable <IFeature>());
            featureCoverage.Components.Add(new Variable <double>());

            var branches = CreateNBranchesNetwork(5);

            featureCoverage.Features = new EventedList <IFeature>(branches);

            double variableValue  = 0.0;
            var    expectedColors = new Dictionary <IFeature, Color>(5);
            double minvalue       = 1.0;
            double maxvalue       = 3.0;

            foreach (var branch in branches)
            {
                featureCoverage[branch] = variableValue;
                int grayscaleValue = variableValue <= minvalue
                                         ? 0
                                         : variableValue >= maxvalue
                                               ? 255
                                               : Convert.ToInt32(255 * (variableValue - minvalue) / (maxvalue - minvalue));
                expectedColors[branch] = Color.FromArgb(255, grayscaleValue, grayscaleValue, grayscaleValue);
                variableValue         += 1;
            }

            var theme = ThemeFactory.CreateGradientTheme("", null, new ColorBlend(new[] { Color.Black, Color.White },
                                                                                  new[] { 0f, 1f }), minvalue, maxvalue, 3, 3, false, true,
                                                         3);

            var fcLayer = new FeatureCoverageLayer
            {
                AutoUpdateThemeOnDataSourceChanged = false,
                Coverage = featureCoverage,
                Theme    = theme
            };

            foreach (var branch in branches)
            {
                AssertColor(expectedColors[branch], fcLayer.Theme.GetFillColor((double)featureCoverage[branch]));
            }

            fcLayer.Theme.ScaleTo(0.0, 2.0);

            var min = ((GradientTheme)fcLayer.Theme).Min;
            var max = ((GradientTheme)fcLayer.Theme).Max;

            Assert.AreEqual(0.0, min);
            Assert.AreEqual(2.0, max);
            foreach (var branch in branches)
            {
                variableValue = (double)featureCoverage[branch];
                int greyScaleValue = variableValue <= min
                                         ? 0
                                         : variableValue >= max
                                               ? 255
                                               : Convert.ToInt32(255 * (variableValue - min) / (max - min));
                AssertColor(Color.FromArgb(255, greyScaleValue, greyScaleValue, greyScaleValue), fcLayer.Theme.GetFillColor(variableValue));
            }
        }