public static BitmapSource GetImageForLayer(GridLayer layer, Color lowcolor, Color highcolor, Color novaluecolor, double cutoff = 0, int intervals = 256)
        {
            var palette = CreateGradientPalette(lowcolor, highcolor, novaluecolor, intervals);
            var bmp     = new WriteableBitmap(layer.Width, layer.Height, 96, 96, PixelFormats.Indexed8, palette);

            var range = layer.GetRange();

            if (cutoff == 0 && range != null && range.Range > 0)
            {
                cutoff = range.Min;
            }

            double max = 0;

            if (range != null)
            {
                max = range.Max;
            }

            double dx = Math.Abs(max - cutoff) / (intervals - 1);

            byte[] array = new byte[layer.Width * layer.Height];
            byte   index = 0;

            for (int y = 0; y < layer.Height; y++)
            {
                for (int x = 0; x < layer.Width; x++)
                {
                    var value = layer.GetCellValue(x, (layer.Height - 1) - y);
                    if (value == layer.NoValueMarker)
                    {
                        index = 0;
                    }
                    else
                    {
                        if (value >= cutoff || cutoff == 0)
                        {
                            index = (byte)(((value - cutoff) / dx) + 1);
                        }
                        else
                        {
                            index = 0;
                        }
                    }
                    array[(y * layer.Width) + x] = index;
                }
            }

            Int32Rect r = new Int32Rect(0, 0, layer.Width, layer.Height);

            bmp.WritePixels(r, array, layer.Width, 0, 0);

            return(bmp);
        }
        public GridLayer RunSpeciesRichness()
        {
            // First load each of the layers...

            IsCancelled = false;

            var layers = new List <GridLayer>();

            foreach (string filename in LayerFiles)
            {
                ProgressMessage("Loading environmental layer {0}...", filename);
                layers.Add(new GridLayer(filename));
            }

            // Now for each point set, run the model...
            var resultLayers = new List <GridLayer>();

            Model.ProgressObserver = this;

            if (ProgressObserver != null)
            {
                ProgressObserver.ProgressMessage("Running models...");
            }

            var first = layers[0];

            int setIndex = 0;

            foreach (SpeciesRichnessPointSetViewModel pointset in MapPointSets)
            {
                _currentPointSet = pointset.Model;

                var percent = ((double)setIndex / (double)MapPointSets.Count()) * 100.0;

                if (ProgressObserver != null)
                {
                    ProgressObserver.ProgressMessage("Running model on pointset " + pointset.Name, percent);
                }

                FireStartPointSet(pointset.Model);

                var list = new List <MapPointSet>();
                list.Add(pointset.Model);
                var modelLayer = Model.RunModel(layers, list);
                if (modelLayer != null)
                {
                    if (RetainLayers)
                    {
                        pointset.Filename = string.Format("{0}{1}_{2}.grd", TempFileManager.GetTemporaryFolder(), SystemUtils.StripIllegalFilenameChars(pointset.Name), setIndex);
                        modelLayer.SaveToGRDFile(pointset.Filename);
                    }

                    resultLayers.Add(modelLayer);
                }

                if (IsCancelled)
                {
                    return(null);
                }

                FireEndPointSet(pointset.Model);

                setIndex++;
            }

            var target = new GridLayer(first.Width, first.Height)
            {
                DeltaLatitude = first.DeltaLatitude, DeltaLongitude = first.DeltaLongitude, Flags = first.Flags, Latitude0 = first.Latitude0, Longitude0 = first.Longitude0, NoValueMarker = 0
            };

            target.SetAllCells(0);
            foreach (GridLayer result in resultLayers)
            {
                for (int y = 0; y < target.Height; ++y)
                {
                    var lat = target.Latitude0 + (y * target.DeltaLatitude);            // Work out Lat. of this cell.
                    for (int x = 0; x < target.Width; ++x)
                    {
                        var lon  = target.Longitude0 + (x * target.DeltaLongitude); // Work out Long. of this cell.
                        var fVal = result.GetValueAt(lat, lon, result.NoValueMarker);
                        if (fVal == result.NoValueMarker)
                        {
                            target.SetCellValue(x, y, target.NoValueMarker);
                        }
                        else
                        {
                            if (fVal > CutOff)
                            {
                                var currentVal = target.GetCellValue(x, y);
                                target.SetCellValue(x, y, currentVal + 1);
                            }
                        }
                    }
                }
            }

            return(target);
        }
Пример #3
0
        public static BitmapSource GetImageForLayer(GridLayer layer, Color lowcolor, Color highcolor, Color novaluecolor, double cutoff = 0, int intervals = 256)
        {
            var palette = CreateGradientPalette(lowcolor, highcolor, novaluecolor, intervals);
            var bmp = new WriteableBitmap(layer.Width, layer.Height, 96, 96, PixelFormats.Indexed8, palette);

            var range = layer.GetRange();

            if (cutoff == 0 && range != null && range.Range > 0) {
                cutoff = range.Min;
            }

            double max = 0;
            if (range != null) {
                max = range.Max;
            }

            double dx = Math.Abs(max - cutoff) / (intervals - 1);
            byte[] array = new byte[layer.Width * layer.Height];
            byte index = 0;
            for (int y = 0; y < layer.Height; y++) {
                for (int x = 0; x < layer.Width; x++) {
                    var value = layer.GetCellValue(x, (layer.Height - 1) - y);
                    if (value == layer.NoValueMarker) {
                        index = 0;
                    } else {
                        if (value >= cutoff || cutoff == 0) {
                            index = (byte) (((value - cutoff) / dx) + 1);
                        } else {
                            index = 0;
                        }
                    }
                    array[(y * layer.Width) + x] = index;
                }
            }

            Int32Rect r= new Int32Rect(0, 0, layer.Width, layer.Height);

            bmp.WritePixels(r, array, layer.Width, 0, 0);

            return bmp;
        }