/// <summary> /// 读取指定位置大小某一角度信息 /// </summary> /// <param name="mark">角度信息标志位,0:太阳天顶角;1:卫星天顶角;2:相对方向角;</param> private void DirectReadAngle(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, Core.DF.enumDataType dataType, int xBufferSize, int yBufferSize, int mark) { if (xSize == xBufferSize && ySize == yBufferSize) { Int16[] bandBuffer = new Int16[xSize * ySize]; List <Int16[]> angles = null; using (FileStream fs = new FileStream(_fileName, FileMode.Open)) { angles = ReadAngleInfo(fs, yOffset, ySize, mark); } Parallel.For(0, ySize, (j) => { for (int i = xOffset + 1, k = 0; i <= (xOffset + xSize); i++, k++) { bandBuffer[k + j * xSize] = Lagrange(angles[j], i); } }); Marshal.Copy(bandBuffer, 0, buffer, bandBuffer.Length); } else { double[] bandBuffer = new double[xBufferSize * yBufferSize]; List <Int16[]> angles = null; int[] yIndex = ComputeTargetIndexs(ySize, yBufferSize, yOffset); int[] xIndex = ComputeTargetIndexs(xSize, xBufferSize, xOffset); using (FileStream fs = new FileStream(_fileName, FileMode.Open)) { angles = ReadAngleInfo(fs, yIndex, mark); } Parallel.For(0, yBufferSize, (j) => { for (int i = 0; i < xIndex.Length; i++) { bandBuffer[i + j * xBufferSize] = Lagrange(angles[j], xIndex[i]); } }); Marshal.Copy(bandBuffer, 0, buffer, bandBuffer.Length); } }
protected override void DirectRead(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, Core.DF.enumDataType dataType, int xBufferSize, int yBufferSize) { //base.DirectRead(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize); switch (_bandName) { case "Latitude": DirectReadGeo(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, true); break; case "Longitude": DirectReadGeo(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, false); break; case "SolarZenith": DirectReadAngle(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, 0); break; case "SatelliteZenith": DirectReadAngle(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, 1); break; case "RelativeAzimuth": DirectReadAngle(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, 2); break; } }
/// <summary> /// 读取指定位置大小某一角度信息 /// </summary> private void DirectReadAngle(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, Core.DF.enumDataType dataType, int xBufferSize, int yBufferSize, int mark) { if (xSize == xBufferSize && ySize == yBufferSize) { float[] bandBuffer = new float[xSize * ySize]; List <float[]> angles = new List <float[]>(); using (FileStream _fs = new FileStream(_fileName, FileMode.Open)) { if (mark == 0) { angles = ReadSolarZenith(_fs, yOffset, ySize); } else if (mark == 1) { angles = ReadSatZenith(_fs, yOffset, ySize); } else { angles = ReadRelAzimuth(_fs, yOffset, ySize); } } Parallel.For(0, ySize, (j) => { for (int i = xOffset + 1, k = 0; i <= (xOffset + xSize); i++, k++) { bandBuffer[k + j * xSize] = Lagrange(angles[j], i); } }); Marshal.Copy(bandBuffer, 0, buffer, bandBuffer.Length); } }
public void DirectReadGeo(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, Core.DF.enumDataType dataType, int xBufferSize, int yBufferSize, bool isLat) { if (xSize == xBufferSize && ySize == yBufferSize) { double[] bandBuffer = new double[xSize * ySize]; List <double[]> lons = null; using (FileStream fs = new FileStream(_fileName, FileMode.Open)) { lons = ReadPositionInfo(fs, yOffset, ySize, isLat); } Parallel.For(0, ySize, (j) => { for (int i = xOffset + 1, k = 0; i <= (xOffset + xSize); i++, k++) { bandBuffer[k + j * xSize] = Lagrange(lons[j], i); } }); Marshal.Copy(bandBuffer, 0, buffer, bandBuffer.Length); } else { double[] bandBuffer = new double[xBufferSize * yBufferSize]; List <double[]> lons = null; //计算行索引 int[] yIndex = ComputeTargetIndexs(ySize, yBufferSize, yOffset); int[] xIndex = ComputeTargetIndexs(xSize, xBufferSize, xOffset); using (FileStream fs = new FileStream(_fileName, FileMode.Open)) { lons = ReadPositionInfo(fs, yIndex, isLat); } Parallel.For(0, yBufferSize, (j) => { for (int i = 0; i < xIndex.Length; i++) { bandBuffer[i + j * xBufferSize] = Lagrange(lons[j], xIndex[i]); } }); Marshal.Copy(bandBuffer, 0, buffer, bandBuffer.Length); } }
protected override void DirectRead(int xOffset, int yOffset, int xSize, int ySize, IntPtr buffer, Core.DF.enumDataType dataType, int xBufferSize, int yBufferSize) { switch (_bandName) { case "Latitude": DirectReadGeo(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, true); break; case "Longitude": DirectReadGeo(xOffset, yOffset, xSize, ySize, buffer, dataType, xBufferSize, yBufferSize, false); break; } }