Пример #1
0
        public float GridQuery(gView.Framework.Carto.IDisplay display, IPoint point, ISpatialReference sRef)
        {
            float floatNodata = (float)_nodata;

            TFWFile tfw = this.WorldFile as TFWFile;

            if (tfw == null)
            {
                return(floatNodata);
            }

            if (this.SpatialReference != null && sRef != null &&
                !sRef.Equals(this.SpatialReference))
            {
                point = GeometricTransformerFactory.Transform2D(point, sRef, this.SpatialReference) as IPoint;
            }
            if (point == null)
            {
                return(floatNodata);
            }

            // Punkt transformieren -> Bild
            vector2[] vecs = new vector2[1];
            vecs[0] = new vector2(point.X, point.Y);

            if (!tfw.ProjectInv(vecs))
            {
                return(floatNodata);
            }

            if (vecs[0].x < 0 || vecs[0].x >= _iWidth ||
                vecs[0].y < 0 || vecs[0].y >= _iHeight)
            {
                return(floatNodata);
            }

            unsafe
            {
                fixed(float *buf = new float[2])
                {
                    _gridQueryBand.ReadRaster((int)vecs[0].x, (int)vecs[0].y, 1, 1,
                                              (IntPtr)buf,
                                              1, 1, OSGeo_v3.GDAL.DataType.GDT_CFloat32, 4, 0);

                    if ((_hasNoDataVal != 0 && buf[0] == floatNodata) ||
                        (_useIgnoreValue && buf[0] == _ignoreValue))
                    {
                        return(floatNodata);
                    }

                    return(buf[0]);
                }
            }
        }
Пример #2
0
        private ICursor QueryGrid(int x, int y)
        {
            try
            {
                using (var gdalDataset = OpenGdalDataset())
                {
                    unsafe
                    {
                        var floatNodata = (float)_nodata;

                        fixed(float *buf = new float[2])
                        {
                            OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(1);

                            band.ReadRaster(x, y, 1, 1,
                                            (IntPtr)buf,
                                            1, 1, OSGeo_v3.GDAL.DataType.GDT_CFloat32, 4, 0);

                            if ((_hasNoDataVal != 0 && buf[0] == floatNodata) ||
                                (_useIgnoreValue && buf[0] == _ignoreValue))
                            {
                                return(null);
                            }

                            string[] tags   = { "ImageX", "ImageY", "band1" };
                            object[] values = { x, y, buf[0] };

                            band.Dispose();

                            return(new QueryCursor(tags, values));
                        }
                    }
                }
            }
            finally
            {
            }
        }
Пример #3
0
        private ICursor QueryImage(int x, int y)
        {
            using (var gdalDataset = OpenGdalDataset())
            {
                unsafe
                {
                    int              bandCount = gdalDataset.RasterCount;
                    string[]         tags      = new string[bandCount + 2];
                    object[]         values    = new object[bandCount + 2];
                    List <ArgbColor> colors    = new List <ArgbColor>();

                    for (int i = 1; i <= bandCount; ++i)
                    {
                        OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(i);

                        string bandName = "";
                        switch ((ColorInterp)band.GetRasterColorInterpretation())
                        {
                        case ColorInterp.BlueBand:
                            bandName = "(blue)";
                            break;

                        case ColorInterp.GreenBand:
                            bandName = "(green)";
                            break;

                        case ColorInterp.RedBand:
                            bandName = "(red)";
                            break;

                        case ColorInterp.GrayIndex:
                            for (int iColor = 0; iColor < 256; iColor++)
                            {
                                colors.Add(ArgbColor.FromArgb(255, iColor, iColor, iColor));
                            }
                            break;

                        case ColorInterp.PaletteIndex:
                            tags   = new string[tags.Length + 4];
                            values = new object[values.Length + 4];

                            OSGeo_v3.GDAL.ColorTable colTable = band.GetRasterColorTable();
                            if (colTable == null)
                            {
                                break;
                            }

                            int colCount = colTable.GetCount();
                            for (int iColor = 0; iColor < colCount; iColor++)
                            {
                                OSGeo_v3.GDAL.ColorEntry colEntry = colTable.GetColorEntry(iColor);
                                colors.Add(ArgbColor.FromArgb(
                                               colEntry.c4, colEntry.c1, colEntry.c2, colEntry.c3));
                            }

                            break;
                        }

                        int c = 0;

                        int *buf = &c;

                        band.ReadRaster(x, y, 1, 1,
                                        (IntPtr)buf,
                                        1, 1, OSGeo_v3.GDAL.DataType.GDT_Int32, 4, 0);

                        band.Dispose();

                        tags[i + 1]   = "Band " + i.ToString() + " " + bandName;
                        values[i + 1] = c;

                        if (colors.Count > 0 && c >= 0 && c < colors.Count)
                        {
                            ArgbColor col = colors[c];
                            tags[i + 2]   = "Alpha";
                            values[i + 2] = col.A;
                            tags[i + 3]   = "Red";
                            values[i + 3] = col.R;
                            tags[i + 4]   = "Green";
                            values[i + 4] = col.G;
                            tags[i + 5]   = "Blue";
                            values[i + 5] = col.B;
                        }
                    }

                    tags[0] = "ImageX"; values[0] = x;
                    tags[1] = "ImageY"; values[1] = y;

                    return(new QueryCursor(tags, values));
                }
            }
        }
Пример #4
0
        private IRasterPaintContext PaintGrid(int x, int y, int wWidth, int wHeight, int iWidth, int iHeight)
        {
            int pixelSpace = 4;

            using (var bitmap = GraphicsEngine.Current.Engine.CreateBitmap(iWidth, iHeight + 100, GraphicsEngine.PixelFormat.Rgba32))
            {
                var bitmapData          = bitmap.LockBitmapPixelData(GraphicsEngine.BitmapLockMode.ReadWrite, GraphicsEngine.PixelFormat.Rgba32);
                OSGeo_v3.GDAL.Band band = null;

                try
                {
                    int    stride = bitmapData.Stride;
                    IntPtr buf    = bitmapData.Scan0;

                    using (var gdalDataset = OpenGdalDataset())
                    {
                        List <ArgbColor> colors = new List <ArgbColor>();
                        using (band = gdalDataset.GetRasterBand(1))
                        {
                            band.ReadRaster(x, y, wWidth, wHeight,
                                            buf,
                                            iWidth, iHeight, OSGeo_v3.GDAL.DataType.GDT_CFloat32, pixelSpace, stride);

                            band.Dispose();
                        }

                        unsafe
                        {
                            byte * ptr = (byte *)(bitmapData.Scan0);
                            float *v   = (float *)(bitmapData.Scan0);

                            var floatNodata = (float)_nodata;
                            for (int i = 0; i < iHeight; i++)
                            {
                                for (int j = 0; j < iWidth; j++)
                                {
                                    if (_renderRawGridValues)
                                    {
                                        if (_hasNoDataVal == 1 && *v == floatNodata)
                                        {
                                            ptr[0] = ptr[1] = ptr[2] = ptr[3] = 0;
                                        }
                                        else
                                        {
                                            var int24Bytes = new Int24(*v * 100f).GetBytes();
                                            ptr[0] = int24Bytes[0];
                                            ptr[1] = int24Bytes[1];
                                            ptr[2] = int24Bytes[2];
                                            ptr[3] = 255;
                                        }
                                        //byte* vb = (byte*)v;
                                        //ptr[0] = *vb; vb++;
                                        //ptr[1] = *vb; vb++;
                                        //ptr[2] = *vb; vb++;
                                        //ptr[3] = *vb;
                                    }
                                    else
                                    {
                                        if (_hasNoDataVal == 1 && *v == floatNodata)
                                        {
                                            ptr[0] = ptr[1] = ptr[2] = ptr[3] = 0;
                                        }
                                        else
                                        {
                                            double c = (*v - _min) / (_max - _min);
                                            double a = _minColor.A + c * (_maxColor.A - _minColor.A);
                                            double r = _minColor.R + c * (_maxColor.R - _minColor.R);
                                            double g = _minColor.G + c * (_maxColor.G - _minColor.G);
                                            double b = _minColor.B + c * (_maxColor.B - _minColor.B);
                                            ptr[0] = (byte)b; ptr[1] = (byte)g; ptr[2] = (byte)r;
                                            ptr[3] = (byte)a; // alpha
                                        }
                                    }
                                    ptr += pixelSpace;
                                    v++;
                                }
                                ptr += bitmapData.Stride - bitmapData.Width * pixelSpace;
                                v    = (float *)ptr;
                            }
                        }

                        if (bitmap != null)
                        {
                            bitmap.UnlockBitmapPixelData(bitmapData);
                            bitmapData = null;
                        }

                        var contextBitmap = GraphicsEngine.Current.Engine.CreateBitmap(iWidth, iHeight, GraphicsEngine.PixelFormat.Rgba32);
                        using (var canvas = contextBitmap.CreateCanvas())
                        {
                            canvas.DrawBitmap(bitmap, new GraphicsEngine.CanvasPoint(0, 0));
                        }

                        return(new RasterPaintContext(contextBitmap));
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (bitmap != null && bitmapData != null)
                    {
                        bitmap.UnlockBitmapPixelData(bitmapData);
                    }
                }
            }
        }
Пример #5
0
        private IRasterPaintContext PaintWavelet(int x, int y, int wWidth, int wHeight, int iWidth, int iHeight, ICancelTracker cancelTracker)
        {
            if (CancelTracker.Canceled(cancelTracker))
            {
                return(null);
            }

            int pixelSpace = 4;
            var bitmap     = Current.Engine.CreateBitmap(iWidth, iHeight, GraphicsEngine.PixelFormat.Rgba32);
            var bitmapData = bitmap.LockBitmapPixelData(BitmapLockMode.ReadWrite, GraphicsEngine.PixelFormat.Rgba32);

            try
            {
                int    stride = bitmapData.Stride;
                IntPtr buf    = bitmapData.Scan0;

                using (var gdalDataset = OpenGdalDataset())
                {
                    for (int i = 1; i <= (gdalDataset.RasterCount > 3 ? 3 : gdalDataset.RasterCount); ++i)
                    {
                        using (OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(i))
                        {
                            int ch = 0;
                            switch ((ColorInterp)band.GetRasterColorInterpretation())
                            {
                            case ColorInterp.BlueBand:
                                ch = 0;
                                break;

                            case ColorInterp.GreenBand:
                                ch = 1;
                                break;

                            case ColorInterp.RedBand:
                                ch = 2;
                                break;
                            }
                            band.ReadRaster(x, y, wWidth, wHeight,
                                            new IntPtr(buf.ToInt64() + ch),
                                            iWidth, iHeight, OSGeo_v3.GDAL.DataType.GDT_Byte, pixelSpace, stride);
                        }
                    }

                    return(new RasterPaintContext(bitmap));
                }
            }
            catch (Exception ex)
            {
                if (bitmap != null && bitmapData != null)
                {
                    bitmap.UnlockBitmapPixelData(bitmapData);
                    bitmapData = null;
                    bitmap.Dispose();
                    bitmap = null;
                }

                throw ex;
            }
            finally
            {
                if (bitmap != null && bitmapData != null)
                {
                    bitmap.UnlockBitmapPixelData(bitmapData);
                }
            }
        }
Пример #6
0
        private IRasterPaintContext PaintImage(int x, int y, int wWidth, int wHeight, int iWidth, int iHeight, ICancelTracker cancelTracker)
        {
            if (CancelTracker.Canceled(cancelTracker))
            {
                return(null);
            }

            int pixelSpace = 3;
            var bitmap     = Current.Engine.CreateBitmap(iWidth, iHeight, GraphicsEngine.PixelFormat.Rgb24);
            var bitmapData = bitmap.LockBitmapPixelData(BitmapLockMode.WriteOnly, GraphicsEngine.PixelFormat.Rgb24);

            try
            {
                int    stride = bitmapData.Stride;
                IntPtr buf    = bitmapData.Scan0;

                using (var gdalDataset = OpenGdalDataset())
                {
                    List <ArgbColor> colors = new List <ArgbColor>();
                    for (int i = 1; i <= (gdalDataset.RasterCount > 3 ? 3 : gdalDataset.RasterCount); ++i)
                    {
                        using (OSGeo_v3.GDAL.Band band = gdalDataset.GetRasterBand(i))
                        {
                            int ch = 0;
                            switch ((ColorInterp)band.GetRasterColorInterpretation())
                            {
                            case ColorInterp.BlueBand:
                                ch = 0;
                                break;

                            case ColorInterp.GreenBand:
                                ch = 1;
                                break;

                            case ColorInterp.RedBand:
                                ch = 2;
                                break;

                            case ColorInterp.GrayIndex:
                                for (int iColor = 0; iColor < 256; iColor++)
                                {
                                    colors.Add(ArgbColor.FromArgb(255, iColor, iColor, iColor));
                                }
                                break;

                            case ColorInterp.PaletteIndex:
                                OSGeo_v3.GDAL.ColorTable colTable = band.GetRasterColorTable();
                                if (colTable == null)
                                {
                                    break;
                                }

                                int colCount = colTable.GetCount();
                                for (int iColor = 0; iColor < colCount; iColor++)
                                {
                                    OSGeo_v3.GDAL.ColorEntry colEntry = colTable.GetColorEntry(iColor);
                                    colors.Add(ArgbColor.FromArgb(
                                                   colEntry.c4, colEntry.c1, colEntry.c2, colEntry.c3));
                                }

                                break;
                            }
                            band.ReadRaster(x, y, wWidth, wHeight,
                                            new IntPtr(buf.ToInt64() + ch),
                                            iWidth, iHeight, OSGeo_v3.GDAL.DataType.GDT_Byte, pixelSpace, stride);

                            band.Dispose();
                        }
                    }
                    if (colors.Count > 0)
                    {
                        unsafe
                        {
                            byte *ptr = (byte *)(bitmapData.Scan0);
                            for (int i = 0; i < bitmapData.Height; i++)
                            {
                                if (CancelTracker.Canceled(cancelTracker))
                                {
                                    return(null);
                                }

                                for (int j = 0; j < bitmapData.Width; j++)
                                {
                                    // write the logic implementation here
                                    byte      c   = ptr[0];
                                    ArgbColor col = colors[c];
                                    ptr[0] = col.B;
                                    ptr[1] = col.G;
                                    ptr[2] = col.R;
                                    ptr   += pixelSpace;
                                }
                                ptr += bitmapData.Stride - bitmapData.Width * pixelSpace;
                            }
                        }
                    }

                    return(new RasterPaintContext(bitmap));
                }
            }
            catch (Exception ex)
            {
                if (bitmap != null && bitmapData != null)
                {
                    bitmap.UnlockBitmapPixelData(bitmapData);
                    bitmapData = null;
                    bitmap.Dispose();
                    bitmap = null;
                }

                throw ex;
            }
            finally
            {
                if (bitmap != null && bitmapData != null)
                {
                    bitmap.UnlockBitmapPixelData(bitmapData);
                }
            }
        }