Ejemplo n.º 1
0
 /// <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);
     }
 }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
 /// <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);
     }
 }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
        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;
            }
        }