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); }
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; }