private LayerViewModel CreateLayerViewModel(Dataset dataSet, Band rasterBand, int stride, IntPtr data, CreateLayerViewModel layer) { WriteableBitmap bandImage = new WriteableBitmap(rasterBand.XSize, rasterBand.YSize, 96, 96, rasterBand.DataType.ToPixelFormat(), null); bandImage.Lock(); int backBufferStride = bandImage.BackBufferStride; unsafe { if (stride == backBufferStride) { Buffer.MemoryCopy(data.ToPointer(), bandImage.BackBuffer.ToPointer(), stride * rasterBand.YSize, stride * rasterBand.YSize); } else { if (rasterBand.DataType == DataType.GDT_UInt16) { ushort *sourcePtr = (ushort *)data.ToPointer(); ushort *destPtr = (ushort *)bandImage.BackBuffer.ToPointer(); for (int scanLine = 0; scanLine < rasterBand.YSize; ++scanLine) { ushort *source = sourcePtr + scanLine * stride / 2; ushort *dest = destPtr + scanLine * backBufferStride / 2; Buffer.MemoryCopy(source, dest, stride, stride); } } else { throw new NotSupportedException(); } } } bandImage.AddDirtyRect(new Int32Rect(0, 0, rasterBand.XSize, rasterBand.YSize)); bandImage.Unlock(); // Position double[] bandTransform = new double[6]; dataSet.GetGeoTransform(bandTransform); var vecBuilder = Vector <double> .Build; var upperLeft = vecBuilder.DenseOfArray(new[] { bandTransform[0], bandTransform[3], 1 }); var xRes = bandTransform[1]; var yRes = bandTransform[5]; var bottomRight = vecBuilder.DenseOfArray(new[] { upperLeft[0] + (rasterBand.XSize * xRes), upperLeft[1] + (rasterBand.YSize * yRes), 1 }); double[,] matArray = { { bandTransform[1], bandTransform[2], bandTransform[0] }, { bandTransform[4], bandTransform[5], bandTransform[3] }, { 0, 0, 1 } }; var builder = Matrix <double> .Build; var transformMat = builder.DenseOfArray(matArray); var imageBandViewModel = new LayerViewModel( layer.GetName(), layer.SatelliteType, layer.Path, layer.ContrastEnhancement, xRes, yRes, bandImage, transformMat, upperLeft, bottomRight, layer.MinCutOff, layer.MaxCutOff, layer.R, layer.G, layer.B, false, true, true); return(imageBandViewModel); }
public ActionResult Create([Bind(Include = "MapId,Name")] CreateLayerViewModel model) { try { logger.InfoFormat("UserId={0}", User.Identity.GetUser().Id); if (ModelState.IsValid) { var mapId = model.MapId; if (mapId == null) { logger.ErrorFormat("BAD_REQUEST -- mapId is null."); ModelState.AddModelError("", Error.BAD_REQUEST); } else { using (var access = new DataAccess()) { var map = access.Maps.GetByID(mapId); if (map == null) { logger.ErrorFormat("NOT_FOUND -- Map with id={0} not found.", mapId); ModelState.AddModelError("", Error.NOT_FOUND); } else if (map.User.Id != User.Identity.GetUser().Id) { logger.ErrorFormat("FORBIDDEN -- User with id={0} cannot access map with id={1}.", User.Identity.GetUser().Id, mapId); ModelState.AddModelError("", Error.FORBIDDEN); } else { Layer layer = new Layer { Name = model.Name, Id = Guid.NewGuid(), Map = map }; var duplicateLayer = access.Layers.Get(l => l.Name.Equals(layer.Name) && l.Map.Id == mapId); if (duplicateLayer.Count() != 0) { logger.ErrorFormat("UserId={0} -- Duplicate layer name", User.Identity.GetUser().Id); ModelState.AddModelError("", string.Format("Layer with name '{0}' already exists.", layer.Name)); } else { access.Layers.Insert(layer); access.Save(); return(PartialView("AddLayer", new DetailsLayerViewModel(layer))); } } } } } else { logger.ErrorFormat("UserId={0} -- Model state is invalid", User.Identity.GetUser().Id); } } catch (Exception ex) { logger.Fatal("", ex); ModelState.AddModelError("", Error.ERROR); } return(PartialView(model)); }