Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }