1. 程式人生 > >ArcEngine + C# 獲取柵格資料像元值

ArcEngine + C# 獲取柵格資料像元值

此文問獲得柵格資料的像元值(即高程),有可能部分見解不到位,望大神看到了不惜指教!

///

    ///  得到高程(通過畫素值)
    /// </summary>
    /// <param name="maskTifPath">Raster路徑</param>
    private List<int> GetElevation(string maskTifPath, List<IPoint> pointColList)//pointcollist是點集合,可以參照博文獲得點集合
    {



        IRaster raster = GetRaster(maskTifPath);//參見博文獲得raster資料
        //得到一段光柵帶
        IRasterBandCollection rasterBandCollection = (IRasterBandCollection)raster;
        for (int icount = 0; icount < rasterBandCollection.Count; icount++)//測試資料count為1
        {
            IRasterBand rasterBand = rasterBandCollection.Item(icount);
            //畫素
            IRawPixels rawPixels = (IRawPixels)rasterBand;
            IRasterProps rasterProps = (IRasterProps)rawPixels;
            //IGeoDataset geodataset = (IGeoDataset)raster;
            //IEnvelope2 envelop = new EnvelopeClass();
            //envelop = (IEnvelope2)geodataset.Extent;
            //IPoint point = envelop.UpperLeft;
            // 像元大致範圍
            //double blockX = (double)rasterProps.MeanCellSize().X;//網格X間距
            //double blockY = (double)rasterProps.MeanCellSize().Y;//網格Y間距
            //double blockArea = blockX * blockY;//網格面積

            //int columns = rasterProps.Width;//dem列數
            //int rows = rasterProps.Height;//dem行數
            //   指定畫素塊大小
            IPnt blockSize = new DblPnt();
            //blockSize.X = columns;
            //blockSize.Y = rows;
            blockSize.X = 5;//賦值為多少比較合適?
            blockSize.Y = 5;
            //blockSize.X = blockX;
            //blockSize.Y = blockY;
            //指定畫素塊大小來建立畫素快
            IPixelBlock3 pixelBlock = (IPixelBlock3)rawPixels.CreatePixelBlock(blockSize);
            IPnt blockOrigin = new DblPnt();
            IPoint point = new PointClass();
            List<int> pixels = new List<int>();
            for (int j = 0; j < pointColList.Count; j++)
            {
                point = pointColList[j];
                blockOrigin.X = point.X;
                blockOrigin.Y = point.Y;
                //   讀取指定位置的畫素塊(blockOrigin為指定位置)
                rawPixels.Read(blockOrigin, (IPixelBlock)pixelBlock);
                //儲存格網dem的二維陣列
                System.Array pixelData = (System.Array)pixelBlock.get_PixelDataByRef(icount);
                // 獲得每一個柵格的高程值
                for (int col = 0; col < pixelData.GetLength(0); col++)
                {
                    for (int row = 0; row < pixelData.GetLength(1); row++)
                    {
                        pixels.Add(Convert.ToInt32(pixelData.GetValue(col, row)));
                    }
                }
                return pixels;
            }

        }
    }