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