Exemplo n.º 1
0
        public override void ComputeDstEnvelope(AbstractWarpDataset srcRaster, SpatialReference dstSpatialRef,
                                                out PrjEnvelope maxPrjEnvelope, Action <int, string> progressCallback)
        {
            InitLocationArgs(srcRaster);
            var projTrans = ProjectionTransformFactory.GetProjectionTransform(_srcSpatialRef, dstSpatialRef);

            float srcResolutionX = Convert.ToSingle(_srcGeoTrans[1]);
            float srcResolutionY = Math.Abs(Convert.ToSingle(_srcGeoTrans[5]));

            double srcLeftTopX = _srcGeoTrans[0];
            double srcLeftTopY = _srcGeoTrans[3];
            int    srcWidth    = srcRaster.Width;
            int    srcHeight   = srcRaster.Height;
            Size   srcSize     = new Size(srcWidth, srcHeight);

            int wSample = 1;
            int hSample = 1;

            if (srcWidth > 1000)
            {
                wSample = srcWidth / 1000;
            }

            if (srcHeight > 1000)
            {
                hSample = srcHeight / 1000;
            }

            double[] xs    = new double[(srcWidth / wSample) * (srcHeight / hSample)];
            double[] ys    = new double[(srcWidth / wSample) * (srcHeight / hSample)];
            int      index = 0; //非真实的索引号,采样后的

            for (int rowInx = 0; rowInx <= (srcHeight - hSample); rowInx += hSample)
            {
                for (int colInx = 0; colInx <= (srcWidth - wSample); colInx += wSample)
                {
                    xs[index] = srcLeftTopX + colInx * srcResolutionX;
                    ys[index] = srcLeftTopY - rowInx * srcResolutionY;
                    index++;
                }
            }

            if (dstSpatialRef.IsSame(SpatialReferenceFactory.CreateSpatialReference(4326)) == 1)
            {
                projTrans.Transform(xs, ys);
                GeosCorrection(dstSpatialRef, xs, ys);
                maxPrjEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null);
            }
            else
            {
                _rasterProjector.ComputeDstEnvelope(_srcSpatialRef, xs, ys, srcSize, dstSpatialRef, out maxPrjEnvelope,
                                                    null);
            }

            if (_setting != null && _setting.OutEnvelope != null)
            {
                //求交
                maxPrjEnvelope.Intersect(_setting.OutEnvelope);
            }
        }
Exemplo n.º 2
0
        public void RastAndProject <T>(Size outSize, H5T.H5Type ht5type, H5FileId fileId, string dataset, Action <int, string> progressCallback, int outWidth, int outHeight, int rowStep, IRasterDataProvider srcRaster, FilePrjSettings prjSettings, int bandnum, T fillValue, HDF5.Hdf5Operator ope)
        {
            T[,] data = new T[outSize.Height, outSize.Width];
            // 定义数据集操作部分
            long[] dims = new long[2];
            dims[0] = Convert.ToInt64(outSize.Height);
            dims[1] = Convert.ToInt64(outSize.Width);
            H5DataSpaceId dspaceId = H5S.create_simple(2, dims);
            // Define datatype for the data in the file.
            H5DataTypeId dtypeId = H5T.copy(ht5type);
            // Create the data set DATASETNAME.

            H5DataSetId dsetId = H5D.create(fileId, dataset, dtypeId, dspaceId);

            for (int oRow = 0; oRow < outHeight; oRow += rowStep)
            {
                #region 分块读取数据集
                if (progressCallback != null)
                {
                    percent++;
                    progress = percent * 100 / progressCount;
                    progressCallback(progress, string.Format("投影完成{0}%", progress));
                }
                if (oRow + rowStep > outHeight)
                {
                    rowStep = outHeight - oRow;
                }
                Size     outStepSize = new Size(outWidth, rowStep);
                double[] xs          = new double[outWidth * rowStep];
                double[] ys          = new double[outWidth * rowStep];
                double   oY          = oRow * prjSettings.OutResolutionY;
                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    y = prjSettings.OutEnvelope.LeftTop.Y - j * prjSettings.OutResolutionY - oY;
                    for (int i = 0; i < outWidth; i++)
                    {
                        x         = prjSettings.OutEnvelope.LeftTop.Y + i * prjSettings.OutResolutionX;
                        index     = i + j * outWidth;
                        xs[index] = x;
                        ys[index] = y;
                    }
                });
                _projectionTransform.InverTransform(xs, ys);
                PrjEnvelope tEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null);
                tEnvelope.Extend(srcRaster.ResolutionX, srcRaster.ResolutionY * 4);
                PrjEnvelope srcEnvelope = new PrjEnvelope(srcRaster.CoordEnvelope.MinX, srcRaster.CoordEnvelope.MaxX, srcRaster.CoordEnvelope.MinY, srcRaster.CoordEnvelope.MaxY);
                tEnvelope = PrjEnvelope.Intersect(tEnvelope, srcEnvelope);
                if (tEnvelope == null || tEnvelope.IsEmpty)
                {
                    continue;
                }
                Size tSize = tEnvelope.GetSize(srcRaster.ResolutionX, srcRaster.ResolutionY);
                int  tBeginRow = -1, tEndRow = -1, tBeginCol = -1, tEndCol = -1;
                int  oBeginRow = -1, oEndRow = -1, oBeginCol = -1, oEndCol = -1;
                PrjBlockHelper.ComputeBeginEndRowCol(srcEnvelope, new Size(srcRaster.Width, srcRaster.Height), tEnvelope, tSize,
                                                     ref oBeginRow, ref oBeginCol, ref oEndRow, ref oEndCol,
                                                     ref tBeginRow, ref tBeginCol, ref tEndRow, ref tEndCol);
                int      srcStepWidth        = oEndCol - oBeginCol;
                int      srcStepHeight       = oEndRow - oBeginRow;
                Size     srcStepSize         = new Size(srcStepWidth, srcStepHeight);
                T[]      srcBandData         = new T[srcStepWidth * srcStepHeight];
                T[]      dstBandData         = new T[outWidth * rowStep];
                double   srcStepLeftTopX     = tEnvelope.MinX;
                double   srcStepLeftTopY     = tEnvelope.MaxY;
                double   srcStepRightBottomX = tEnvelope.MaxX;
                double   srcStepRightBottomY = tEnvelope.MinY;
                UInt16[] rows                = new UInt16[outWidth * rowStep]; //正向查找表
                UInt16[] cols                = new UInt16[outWidth * rowStep]; //正向查找表
                if (progressCallback != null)
                {
                    percent++;
                    progress = percent * 100 / progressCount;
                    progressCallback(progress, string.Format("投影完成{0}%", progress));
                }
                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    for (int i = 0; i < outWidth; i++)
                    {
                        index = i + j * outWidth;
                        x     = xs[index];
                        y     = ys[index];
                        if (x >= srcStepLeftTopX && x <= srcStepRightBottomX && y <= srcStepLeftTopY && y >= srcStepRightBottomY)
                        {
                            cols[index] = (UInt16)((x - srcStepLeftTopX) / srcRaster.ResolutionX + 0.5);
                            rows[index] = (UInt16)((srcStepLeftTopY - y) / srcRaster.ResolutionY + 0.5);
                        }
                    }
                });
                xs = null;
                ys = null;
                #endregion
                //分块读取不同波段数据
                ReadBandData <T>(srcBandData, bandnum, oBeginCol, oBeginRow, srcStepWidth, srcStepHeight, GetSysDataType(ht5type));
                //投影不同分块的数据集
                _rasterProjector.Project <T>(srcBandData, srcStepSize, rows, cols, outStepSize, dstBandData, fillValue, 0, null);

                for (int i = 0; i < outStepSize.Width; i++)
                {
                    for (int j = 0; j < outStepSize.Height; j++)
                    {
                        int index = j * outStepSize.Width + i;
                        data[j + oRow, i] = dstBandData[index];
                    }
                }

                rows        = null;
                rows        = null;
                srcBandData = null;
                dstBandData = null;
            }
            H5D.write(dsetId, dtypeId, new H5Array <T>(data));
            //写数据集属性
            //Dictionary<string, string> dsetkeyvalue = ope.GetAttributes(dataset);
            //foreach (string key in dsetkeyvalue.Keys)
            //{
            //    string value = dsetkeyvalue[key];
            //    HDFAttributeDef attrdef = new HDFAttributeDef(key, typeof(string), dsetkeyvalue[key].Length, value);
            //    WriteHdfAttributes.WriteHdfAttribute(dsetId, attrdef);
            //}
            H5D.close(dsetId);
        }
Exemplo n.º 3
0
        private void ProjectRaster <T>(IRasterDataProvider srcRaster, FilePrjSettings prjSettings, Action <int, string> progressCallback, IRasterDataProvider prdWriter, T fillValue, double dataWeight, float zoom)
        {
            enumDataType dataType       = prdWriter.DataType;
            PrjEnvelope  outEnvelope    = prjSettings.OutEnvelope;
            float        outResolutionX = prjSettings.OutResolutionX;
            float        outResolutionY = prjSettings.OutResolutionY;
            Size         outSize        = prjSettings.OutSize;
            int          outWidth       = outSize.Width;
            int          outHeight      = outSize.Height;
            int          outBandCount   = prjSettings.OutBandNos.Length;

            if (progressCallback != null)
            {
                progressCallback(_readyProgress++, "投影准备");
            }
            int         srcHeight       = srcRaster.Height;
            int         srcWidth        = srcRaster.Width;
            PrjPoint    outLeftTopPoint = outEnvelope.LeftTop;
            float       srcResolutionX  = srcRaster.ResolutionX;
            float       srcResolutionY  = srcRaster.ResolutionY;
            Size        srcSize         = new Size(srcWidth, srcHeight);
            double      outLtPointX     = outLeftTopPoint.X;
            double      outLtPointY     = outLeftTopPoint.Y;
            PrjEnvelope srcEnvelope     = new PrjEnvelope(srcRaster.CoordEnvelope.MinX, srcRaster.CoordEnvelope.MaxX, srcRaster.CoordEnvelope.MinY, srcRaster.CoordEnvelope.MaxY);
            long        mem             = MemoryHelper.GetAvalidPhyMemory();

#if !WIN64
            mem = mem < 800 * 1024 * 1024 ? mem : 800 * 1024 * 1024;
#endif
            long maxLimit = mem / (6 * 8 * 2);
            int  rowStep  = (int)(maxLimit / outWidth);
            if (rowStep == 0)
            {
                rowStep = 1;
            }
            if (rowStep > outHeight)
            {
                rowStep = outHeight;
            }
            int stepCount     = (int)(Math.Ceiling((double)outHeight / rowStep));
            int percent       = 0;
            int progress      = 0;
            int progressCount = outBandCount * stepCount + stepCount * 2;

            for (int oRow = 0; oRow < outHeight; oRow += rowStep)
            {
                if (progressCallback != null)
                {
                    percent++;
                    progress = percent * 100 / progressCount;
                    progressCallback(progress, string.Format("投影完成{0}%", progress));
                }
                if (oRow + rowStep > outHeight)
                {
                    rowStep = outHeight - oRow;
                }
                Size     outStepSize = new Size(outWidth, rowStep);
                double[] xs          = new double[outWidth * rowStep];
                double[] ys          = new double[outWidth * rowStep];
                double   oY          = oRow * outResolutionY;
                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    y = outLtPointY - j * outResolutionY - oY;
                    for (int i = 0; i < outWidth; i++)
                    {
                        x         = outLtPointX + i * outResolutionX;
                        index     = i + j * outWidth;
                        xs[index] = x;
                        ys[index] = y;
                    }
                });
                _projectionTransform.InverTransform(xs, ys);
                PrjEnvelope tEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null);
                tEnvelope.Extend(srcResolutionX, srcResolutionY * 4);
                tEnvelope = PrjEnvelope.Intersect(tEnvelope, srcEnvelope);
                if (tEnvelope == null || tEnvelope.IsEmpty)
                {
                    continue;
                }
                Size tSize = tEnvelope.GetSize(srcResolutionX, srcResolutionY);
                int  tBeginRow = -1, tEndRow = -1, tBeginCol = -1, tEndCol = -1;
                int  oBeginRow = -1, oEndRow = -1, oBeginCol = -1, oEndCol = -1;
                PrjBlockHelper.ComputeBeginEndRowCol(srcEnvelope, srcSize, tEnvelope, tSize,
                                                     ref oBeginRow, ref oBeginCol, ref oEndRow, ref oEndCol,
                                                     ref tBeginRow, ref tBeginCol, ref tEndRow, ref tEndCol);
                int      srcStepWidth        = oEndCol - oBeginCol;
                int      srcStepHeight       = oEndRow - oBeginRow;
                Size     srcStepSize         = new Size(srcStepWidth, srcStepHeight);
                T[]      srcBandData         = new T[srcStepWidth * srcStepHeight];
                T[]      dstBandData         = new T[outWidth * rowStep];
                double   srcStepLeftTopX     = tEnvelope.MinX;
                double   srcStepLeftTopY     = tEnvelope.MaxY;
                double   srcStepRightBottomX = tEnvelope.MaxX;
                double   srcStepRightBottomY = tEnvelope.MinY;
                UInt16[] rows                = new UInt16[outWidth * rowStep]; //正向查找表
                UInt16[] cols                = new UInt16[outWidth * rowStep]; //正向查找表
                if (progressCallback != null)
                {
                    percent++;
                    progress = percent * 100 / progressCount;
                    progressCallback(progress, string.Format("投影完成{0}%", progress));
                }
                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    for (int i = 0; i < outWidth; i++)
                    {
                        index = i + j * outWidth;
                        x     = xs[index];
                        y     = ys[index];
                        if (x >= srcStepLeftTopX && x <= srcStepRightBottomX && y <= srcStepLeftTopY && y >= srcStepRightBottomY)
                        {
                            cols[index] = (UInt16)((x - srcStepLeftTopX) / srcResolutionX + 0.5);
                            rows[index] = (UInt16)((srcStepLeftTopY - y) / srcResolutionY + 0.5);
                        }
                    }
                });
                xs = null;
                ys = null;
                for (int b = 0; b < outBandCount; b++)
                {
                    if (progressCallback != null)
                    {
                        percent++;
                        progress = percent * 100 / progressCount;
                        progressCallback(progress, string.Format("投影完成{0}%", progress));
                    }
                    ReadBandData <T>(srcBandData, b, oBeginCol, oBeginRow, srcStepWidth, srcStepHeight, dataType);

                    //用于测试全图输出结果,用于查看插值的效果:
#if DebugEaseGrid
                    GCHandle hTe = GCHandle.Alloc(srcBandData, GCHandleType.Pinned);
                    try
                    { Random  random    = new Random(12);
                      IntPtr  bufferPtr = hTe.AddrOfPinnedObject();
                      Int16[] tmp       = new Int16[srcBandData.Length];
                      for (int i = 0; i < srcBandData.Length; i++)
                      {
                          tmp[i] = (Int16)random.Next(200, 255);
                      }
                      Marshal.Copy(tmp, 0, bufferPtr, tmp.Length); }
                    finally
                    {
                        hTe.Free();
                    }
#endif
                    _rasterProjector.Project <T>(srcBandData, srcStepSize, rows, cols, outStepSize, dstBandData, fillValue, 0, null);
                    if (dataWeight == 1)
                    {
                        WriteDataToLDF <T>(prdWriter, dataType, outWidth, rowStep, oRow, dstBandData, b);
                    }
                    else
                    {
                        WriteDataToLDF <T>(prdWriter, dataType, outWidth, rowStep, oRow, dstBandData, b, dataWeight, zoom);
                    }
                }
                rows        = null;
                rows        = null;
                srcBandData = null;
                dstBandData = null;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        ///数据集投影
        /// </summary>
        /// <typeparam name="T">数据集类型</typeparam>
        /// <param name="sourcedata">原始数据集</param>
        /// <param name="srcEnvelope">原始数据集坐标范围(正弦坐标系)</param>
        /// <param name="dstEnvelope">目标数据集坐标范围(品面坐标系)</param>
        /// <param name="outSize">输出范围</param>
        /// <param name="dstResoultion">输出分辨率</param>
        /// <param name="srcResoultionX">原始数据集分辨率X</param>
        /// <param name="srcResoultionY">原始数据集分辨率Y</param>
        /// <returns></returns>
        private static SDataByProject <T> GetDataByProject <T>(T[,] sourcedata, PrjEnvelope srcEnvelope, PrjEnvelope dstEnvelope, Size inSize,
                                                               Size outSize, float dstResoultion, float srcResoultionX, float srcResoultionY, T fillValue, ISpatialReference dstSpatialRef, out UInt16[] rows, out UInt16[] cols, out Size srcStepSize)
        {
            rows        = null;
            cols        = null;
            srcStepSize = Size.Empty;
            IProjectionTransform _projectionTransform;
            //初始化原始坐标系转化对象
            //ISpatialReference dstSpatialRef = SpatialReference.GetDefault();
            string            proj4str      = "proj4 = +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs";
            ISpatialReference srcSpatialRef = SpatialReference.FromProj4(proj4str);

            _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, dstSpatialRef);
            //坐标系转换
            int rowStep = outSize.Height;

            for (int oRow = 0; oRow < outSize.Height; oRow += rowStep)
            {
                if (oRow + rowStep > outSize.Height)
                {
                    rowStep = outSize.Height - oRow;
                }
                Size     outStepSize = new Size(outSize.Width, rowStep);
                double[] xs          = new double[outSize.Width * rowStep];
                double[] ys          = new double[outSize.Width * rowStep];
                double   oY          = oRow * dstResoultion;
                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    y = dstEnvelope.LeftTop.Y - j * dstResoultion - oY;
                    for (int i = 0; i < outSize.Width; i++)
                    {
                        x         = dstEnvelope.LeftTop.X + i * dstResoultion;
                        index     = i + j * outSize.Width;
                        xs[index] = x;
                        ys[index] = y;
                    }
                });
                _projectionTransform.InverTransform(xs, ys);

                PrjEnvelope tEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null);
                tEnvelope.Extend(srcResoultionX, srcResoultionY * 4);
                tEnvelope = PrjEnvelope.Intersect(tEnvelope, srcEnvelope);
                if (tEnvelope == null || tEnvelope.IsEmpty)
                {
                    continue;
                }
                Size tSize = tEnvelope.GetSize(srcResoultionX, srcResoultionY);
                int  tBeginRow = -1, tEndRow = -1, tBeginCol = -1, tEndCol = -1;
                int  oBeginRow = -1, oEndRow = -1, oBeginCol = -1, oEndCol = -1;
                PrjBlockHelper.ComputeBeginEndRowCol(srcEnvelope, new Size(inSize.Width, inSize.Height), tEnvelope, tSize,
                                                     ref oBeginRow, ref oBeginCol, ref oEndRow, ref oEndCol,
                                                     ref tBeginRow, ref tBeginCol, ref tEndRow, ref tEndCol);
                int srcStepWidth  = oEndCol - oBeginCol;
                int srcStepHeight = oEndRow - oBeginRow;
                srcStepSize = new Size(srcStepWidth, srcStepHeight);

                T[,] dstData = new T[outSize.Height, outSize.Width];
                //double srcStepLeftTopX = tEnvelope.MinX;
                //double srcStepLeftTopY = tEnvelope.MaxY;
                //double srcStepRightBottomX = tEnvelope.MaxX;
                //double srcStepRightBottomY = tEnvelope.MinY;
                double   srcStepLeftTopX     = srcEnvelope.MinX;
                double   srcStepLeftTopY     = srcEnvelope.MaxY;
                double   srcStepRightBottomX = srcEnvelope.MaxX;
                double   srcStepRightBottomY = srcEnvelope.MinY;
                UInt16[] rowTemps            = new UInt16[outSize.Width * rowStep]; //正向查找表
                UInt16[] colTemps            = new UInt16[outSize.Width * rowStep]; //正向查找表

                Parallel.For(0, rowStep, j =>
                {
                    double x;
                    double y;
                    int index;
                    for (int i = 0; i < outSize.Width; i++)
                    {
                        index = i + j * outSize.Width;
                        x     = xs[index];
                        y     = ys[index];
                        if (x >= srcStepLeftTopX && x <= srcStepRightBottomX && y <= srcStepLeftTopY && y >= srcStepRightBottomY)
                        {
                            colTemps[index] = (UInt16)((x - srcStepLeftTopX) / srcResoultionX + 0.5);
                            rowTemps[index] = (UInt16)((srcStepLeftTopY - y) / srcResoultionY + 0.5);
                        }
                    }
                });
                rows = rowTemps;
                cols = colTemps;
                return(DoProject <T>(sourcedata, fillValue, ref outStepSize, ref srcStepSize, dstData, rows, cols));
            }
            return(null);
        }
Exemplo n.º 5
0
        // 2
        private void ProjectRaster(AbstractWarpDataset srcRaster, FilePrjSettings prjSettings,
                                   AbstractWarpDataset prdWriter, Action <int, string> progressCallback, UInt16 fillValue, int beginBandIndex,
                                   double dataWeight, float zoom)
        {
            var timer = System.Diagnostics.Stopwatch.StartNew();

            //输出数据类型
            float outResolutionX = prjSettings.OutResolutionX;
            float outResolutionY = prjSettings.OutResolutionY;
            Size  outSize        = prjSettings.OutSize;
            int   outWidth       = outSize.Width;
            int   outHeight      = outSize.Height;
            int   outBandCount   = prjSettings.OutBandNos.Length;

            if (progressCallback != null)
            {
                progressCallback(_readyProgress++, "投影准备");
            }
            int      srcHeight       = srcRaster.Height;
            int      srcWidth        = srcRaster.Width;
            PrjPoint outLeftTopPoint = prjSettings.OutEnvelope.LeftTop;
            //源数据的分辨率
            float srcResolutionX = Convert.ToSingle(_srcGeoTrans[1]);
            float srcResolutionY = Math.Abs(Convert.ToSingle(_srcGeoTrans[5]));
            //输入数据的大小
            Size srcSize = new Size()
            {
                Width = srcWidth, Height = srcHeight
            };
            //输出数据的左上角地理坐标
            double outLtPointX = outLeftTopPoint.X;
            double outLtPointY = outLeftTopPoint.Y;
            //输入数据源的坐标范围
            PrjEnvelope srcEnvelope = new PrjEnvelope(_srcGeoTrans[0], _srcGeoTrans[0] + srcWidth * _srcGeoTrans[1],
                                                      _srcGeoTrans[3] + srcHeight * _srcGeoTrans[5], _srcGeoTrans[3], _srcSpatialRef);
            ulong mem = MemoryHelper.GetAvalidPhyMemory();

            mem = mem > 10.0 * 1024 * 1024 * 1024 ? Convert.ToUInt64(10.0 * 1024 * 1024 * 1024) : mem;
            ulong maxLimit = mem / (6 * 8);
            int   rowStep  = (int)(maxLimit / (UInt32)outWidth);

            if (rowStep == 0)
            {
                rowStep = 1;
            }
            if (rowStep > outHeight)
            {
                rowStep = outHeight;
            }
            int  stepCount             = (int)(Math.Ceiling((double)outHeight / rowStep));
            int  percent               = 0;
            int  progress              = 0;
            int  progressCount         = outBandCount * stepCount + stepCount * 2;
            long stepGeolocationTime   = 0,
                 stepReadDataTime      = 0,
                 stepRadiationTime     = 0,
                 stepProjectRasterTime = 0,
                 stepWriteDataTime     = 0;

            for (int oRow = 0; oRow < outHeight; oRow += rowStep)
            {
                if (progressCallback != null)
                {
                    percent++;
                    progress = percent * 100 / progressCount;
                    progressCallback(progress, string.Format("投影完成{0}%", progress));
                }

                if (oRow + rowStep > outHeight)
                {
                    rowStep = outHeight - oRow;
                }

                //经纬度数据
                double[] xs, ys;
                UInt16[] rows, cols;
                try
                {
                    xs   = new double[outWidth * rowStep];
                    ys   = new double[outWidth * rowStep];
                    rows = new UInt16[outWidth * rowStep];
                    cols = new UInt16[outWidth * rowStep];
                }
                catch (Exception ex)
                {
                    throw;
                }

                Size  srcStepSize = new Size();
                Block oBlock, tBlock;
                timer.Restart();

                #region 初始化查找表

                {
                    double oY = oRow * outResolutionY;
                    Parallel.For(0, rowStep, j =>
                    {
                        double x;
                        double y;
                        int index;
                        y = outLtPointY - j * outResolutionY - oY;
                        for (int i = 0; i < outWidth; i++)
                        {
                            x         = outLtPointX + i * outResolutionX;
                            index     = i + j * outWidth;
                            xs[index] = x;
                            ys[index] = y;
                        }
                    });
                    GeosInverCorrection(_dstSpatialRef, xs, ys);
                    _projectionTransform.InverTransform(xs, ys);
                    PrjEnvelope tEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null);
                    tEnvelope.Extend(srcResolutionX, srcResolutionY * 4);
                    tEnvelope = PrjEnvelope.Intersect(tEnvelope, srcEnvelope);
                    if (tEnvelope == null || tEnvelope.IsEmpty)
                    {
                        continue;
                    }
                    Size tSize = tEnvelope.GetSize(srcResolutionX, srcResolutionY);
                    PrjBlockHelper.ComputeBlock(srcEnvelope, srcSize, tEnvelope, tSize, out oBlock, out tBlock);
                    int srcStepWidth  = oBlock.xEnd - oBlock.xBegin;
                    int srcStepHeight = oBlock.yEnd - oBlock.yBegin;
                    srcStepSize = new Size(srcStepWidth, srcStepHeight);

                    double srcStepLeftTopX     = tEnvelope.MinX;
                    double srcStepLeftTopY     = tEnvelope.MaxY;
                    double srcStepRightBottomX = tEnvelope.MaxX;
                    double srcStepRightBottomY = tEnvelope.MinY;

                    if (progressCallback != null)
                    {
                        percent++;
                        progress = percent * 100 / progressCount;
                    }

                    Parallel.For(0, rowStep, j =>
                    {
                        double x;
                        double y;
                        int index;
                        for (int i = 0; i < outWidth; i++)
                        {
                            index = i + j * outWidth;
                            x     = xs[index];
                            y     = ys[index];
                            if (x >= srcStepLeftTopX && x <= srcStepRightBottomX && y <= srcStepLeftTopY &&
                                y >= srcStepRightBottomY)
                            {
                                cols[index] = (UInt16)((x - srcStepLeftTopX) / srcResolutionX + 0.5);
                                rows[index] = (UInt16)((srcStepLeftTopY - y) / srcResolutionY + 0.5);
                            }
                        }
                    });
                    xs = null;
                    ys = null;
                }

                #endregion

                stepGeolocationTime += timer.ElapsedMilliseconds;

                //输入波段数据缓冲区
                UInt16[] srcBandData = new UInt16[srcStepSize.Width * srcStepSize.Height];
                //输出波段数据缓冲区
                UInt16[] dstBandData = new UInt16[outWidth * rowStep];
                //逐波段写入数据
                for (int b = beginBandIndex; b < outBandCount + beginBandIndex; b++)
                {
                    if (progressCallback != null)
                    {
                        percent++;
                        progress = percent * 100 / progressCount;
                    }

                    var bandNum = b - beginBandIndex;
                    timer.Restart();
                    ReadBandData <UInt16>(srcBandData, bandNum, oBlock.xBegin, oBlock.yBegin, srcStepSize.Width,
                                          srcStepSize.Height, DataType.GDT_UInt16);
                    stepReadDataTime += timer.ElapsedMilliseconds;

                    Size srcBlockSize = new Size(srcStepSize.Width, srcStepSize.Height);
                    //进行辐射定标
                    timer.Restart();
                    DoRadiation(srcRaster, bandNum, srcBandData, null, srcBlockSize, srcBlockSize);
                    stepRadiationTime += timer.ElapsedMilliseconds;

                    //用于测试全图输出结果,用于查看插值的效果:
#if DebugEaseGrid
                    GCHandle hTe = GCHandle.Alloc(srcBandData, GCHandleType.Pinned);
                    try
                    { Random  random    = new Random(12);
                      IntPtr  bufferPtr = hTe.AddrOfPinnedObject();
                      Int16[] tmp       = new Int16[srcBandData.Length];
                      for (int i = 0; i < srcBandData.Length; i++)
                      {
                          tmp[i] = (Int16)random.Next(200, 255);
                      }
                      Marshal.Copy(tmp, 0, bufferPtr, tmp.Length); }
                    finally
                    {
                        hTe.Free();
                    }
#endif
                    //Size outStepSize = new Size(outWidth, rowStep);
                    timer.Restart();
                    _rasterProjector.Project <UInt16>(srcBandData, srcStepSize, rows, cols, new Size(outWidth, rowStep),
                                                      dstBandData, fillValue, 0, null);
                    stepProjectRasterTime += timer.ElapsedMilliseconds;

                    timer.Restart();
                    if (dataWeight == 1)
                    {
                        WriteDataToLDF <UInt16>(prdWriter, DataType.GDT_UInt16, outWidth, rowStep, oRow, dstBandData, b);
                    }
                    else
                    {
                        WriteDataToLDF <UInt16>(prdWriter, DataType.GDT_UInt16, outWidth, rowStep, oRow, dstBandData, b,
                                                dataWeight, zoom);
                    }
                    stepWriteDataTime += timer.ElapsedMilliseconds;
                }

                rows        = null;
                rows        = null;
                srcBandData = null;
                dstBandData = null;
            }

            Console.WriteLine($"坐标投影转换:{stepGeolocationTime}ms");
            Console.WriteLine($"读取波段数据:{stepReadDataTime}ms");
            Console.WriteLine($"定标波段数据:{stepRadiationTime}ms");
            Console.WriteLine($"投影波段数据:{stepProjectRasterTime}ms");
            Console.WriteLine($"写入波段数据:{stepWriteDataTime}ms");
        }
Exemplo n.º 6
0
        public string[] FilesSVDStatAOI(string[] filesL, int bandNumL, string[] fillvalueL, string[] filesR, int bandNumR, string[] fillvalueR, double leftRatio, double rightRatio, string outDir, Action <int, string> progressCallback, bool LisMicaps = false, bool RisMicaps = false)
        {
            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }
            if (StatRegionSet.UseVectorAOIRegion)//使用自定义区域
            {
                PrjEnvelope RegionEnv = null;
                string      regionName = "all";
                int         outaoiwidthL, outaoiheightL, outaoiwidthR, outaoiheightR;
                int[]       outaoiIndexL, outaoiIndexR;
                if (StatRegionSet.UseVectorAOIRegion)
                {
                    RegionEnv     = StatRegionSet.AOIPrjEnvelope;
                    _aoiContainer = StatRegionSet.AoiContainer;
                    regionName    = StatRegionSet.AOIName;
                }
                PrjEnvelope dstleftPrj, dstrightPrj, dstPrjEnv;
                float       reslxL, reslyL, reslxR, reslyR;
                int[]       dataPosL, dataPosR;
                if (!CheckRegionIntersect(filesL[0], RegionEnv, out dstleftPrj, out reslxL, out reslyL, out dataPosL))
                {
                    throw new ArgumentException("设置的区域没有可分析的左场数据!");
                }
                if (!CheckRegionIntersect(filesR[0], RegionEnv, out dstrightPrj, out reslxR, out reslyR, out dataPosR))
                {
                    throw new ArgumentException("设置的区域没有可分析的右场数据!");
                }
                dstPrjEnv = PrjEnvelope.Intersect(dstleftPrj, dstrightPrj);
                if (dstPrjEnv == null || dstPrjEnv.Height == 0 || dstPrjEnv.Width == 0)
                {
                    throw new ArgumentException("左右场的AOI区域无交集,无法进行统计分析!");
                }
                if (progressCallback != null)
                {
                    progressCallback(0, "开始读取左场数据...");
                }
                CoordEnvelope subFileEnv = new CoordEnvelope(dstleftPrj.MinX, dstleftPrj.MaxX, dstleftPrj.MinY, dstleftPrj.MaxY);
                StatRegionSet.SubRegionEnvLeft = subFileEnv;
                if (leftRatio < 1)
                {
                    leftRatio = 1;
                }
                Size subAOISize = new Size(dataPosL[2], dataPosL[3]);         //AOI外包矩形在file中的大小
                outaoiwidthL  = (int)(subAOISize.Width / leftRatio);          //AOI外包矩形的输出列数
                outaoiheightL = (int)(subAOISize.Height / leftRatio);         //AOI外包矩形的输出行数
                Size outAOISize = new Size(outaoiwidthL, outaoiheightL);      //输出文件的大小
                outaoiIndexL = GetAOI(subFileEnv, _aoiContainer, outAOISize); //AOI在输出文件中的Index
                if (outaoiIndexL == null || outaoiIndexL.Length <= 0)
                {
                    throw new ArgumentException("左场重采样AOI区域为空!");
                }
                StatRegionSet.SubRegionOutSizeLeft  = outAOISize;
                StatRegionSet.SubRegionOutIndexLeft = outaoiIndexL;
                double[,] marixL = GetTimeSeriesResampledDataFromSubRegionOutIndex(filesL, bandNumL, fillvalueL, outaoiIndexL, dataPosL, outAOISize);
                Size leftSize = new Size(marixL.GetLength(1), marixL.GetLength(0));  //左场数据大小
                if (progressCallback != null)
                {
                    progressCallback(5, "开始读取右场数据...");
                }
                subFileEnv = new CoordEnvelope(dstrightPrj.MinX, dstrightPrj.MaxX, dstrightPrj.MinY, dstrightPrj.MaxY);
                StatRegionSet.SubRegionEnvRight = subFileEnv;
                if (rightRatio < 1)
                {
                    rightRatio = 1;
                }
                subAOISize    = new Size(dataPosR[2], dataPosR[3]);            //AOI外包矩形在file中的大小
                outaoiwidthR  = (int)(subAOISize.Width / rightRatio);          //AOI外包矩形的输出列数
                outaoiheightR = (int)(subAOISize.Height / rightRatio);         //AOI外包矩形的输出行数
                outAOISize    = new Size(outaoiwidthR, outaoiheightR);         //输出文件的大小
                outaoiIndexR  = GetAOI(subFileEnv, _aoiContainer, outAOISize); //AOI在输出文件中的Index
                if (outaoiIndexR == null || outaoiIndexR.Length <= 0)
                {
                    throw new ArgumentException("右场重采样AOI区域为空!");
                }
                StatRegionSet.SubRegionOutSizeRight  = outAOISize;
                StatRegionSet.SubRegionOutIndexRight = outaoiIndexR;
                double[,] marixr = GetTimeSeriesResampledDataFromSubRegionOutIndex(filesL, bandNumL, fillvalueL, outaoiIndexL, dataPosL, outAOISize);
                Size rightSize = new Size(marixr.GetLength(1), marixr.GetLength(0)); //右场数据大小

                if (progressCallback != null)
                {
                    progressCallback(15, "完成数据采样及标准化,开始矩阵计算...");
                }
                CloudParaStat stat = new CloudParaStat();
                return(stat.AlglibSVDWithAOI(marixL, marixr, outDir, filesL[0], leftSize, rightSize, progressCallback));
            }
            return(null);
        }