ArcGIS Engine柵格數據使用總結

arcengine柵格數據使用總結
兩個星期以來一直與柵格數據打交道,對AO的柵格部分應該有了一定的理解,下面是自己的一點體會,希望高手指教:-)
1、柵格數據的存儲類型
柵格數據一般可以存儲爲ESRI GRID(由一系列文件組成),TIFF格式(包括一個TIF文件和一個AUX文件),IMAGINE Image格式 在AE中一般調用ISaveAs接口來保存柵格數據
2、柵格數據集和柵格編目的區別
一個柵格數據集由一個或者多個波段(RasterBand)的數據組成,一個波段就是一個數據矩陣。對於格網數據(DEM數據)和單波段的影像數據,表現爲僅僅只有一個波段數據的柵格數據集,而對於多光譜影像數據則表現爲具有多個波段的柵格數據集
柵格編目(RasterCatalog)用於顯示某個研究區域內各種相鄰的柵格數據,這些相鄰的柵格數據沒有經過拼接處理合成一副大的影像圖
3、IRasterWorkspaceEx與IRasterWorkspace ,IRsterWorkspace2的區別
1).IRasteWorkspaceEx接口主要是用來讀取GeoDatabase中的柵格數據集和柵格編目
2) . IRasterWorkspace ,IRsterWorkspace2主要是用來讀取以文件格式存儲在本地的柵格數據
4、加載柵格數據(以存儲在本地的柵格數據文件爲例)

1.直接用IRasterLayer接口打開一個柵格文件並加載到地圖控件

IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromFilePath(fileName); // fileName指存本地的柵格文件路徑
axMapControl1.AddLayer(rasterLayer, 0);
2. 用IRasterDataset接口打開一個柵格數據集
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactory();
IWorkspace workspace;
workspace = workspaceFactory.OpenFromFile(inPath, 0); //inPath柵格數據存儲路徑
if (workspace == null)
{
Console.WriteLine('Could not open the workspace.');
return;
}
IRasterWorkspace rastWork = (IRasterWorkspace)workspace;
IRasterDataset rastDataset;
rastDataset= rastWork.OpenRasterDataset(inName);//inName柵格文件名
if (rastDataset == null)
{
Console.WriteLine('Could not open the raster dataset.');
return;
}
5、如何讀取柵格數據的屬性和遍歷柵格數據
柵格數據的屬性包括柵格大小,行數,列數,投影信息,柵格範圍等等,見下面代碼
(假設當前加載的柵格文件柵格值存儲方式爲:UShort類型)

IRasterProps rasterProps = (IRasterProps)clipRaster;
int dHeight = rasterProps.Height;//當前柵格數據集的行數
int dWidth = rasterProps.Width; //當前柵格數據集的列數
double dX = rasterProps.MeanCellSize().X; //柵格的寬度
double dY = rasterProps.MeanCellSize().Y; //柵格的高度
IEnvelope extent=rasterProps.Extent; //當前柵格數據集的範圍
rstPixelType pixelType=rasterProps.PixelType; //當前柵格像素類型
IPnt pntSize = new PntClass();
pntSize.SetCoords(dX, dY);
IPixelBlock pixelBlock = clipRaster.CreatePixelBlock(pntSize);
IPnt pnt = new PntClass();
for (int i = 0; i < dHeight; i++)
for (int j = 0; j < dWidth; j++)
{
   pnt.SetCoords(i, j);
   clipRaster.Read(pnt, pixelBlock);
   if (pixelBlock != null)
     {
        object obj = pixelBlock.GetVal(0, 0, 0);
        MessageBox.Show( Convert.ToUInt32(obj).ToString());
     }
}
6、如何提取指定的範圍的柵格數據
提取指定範圍內的柵格數據通常用兩種方法IRasterLayerExport(esriCarto), IExtractionOp, IExtractionOp2 ([url=]esriSpatialAnalyst[/url]),IRasterLayerExport接口提供的柵格數據提取功能有限,只能以矩形範圍作爲提取範圍,而IExtractionOp接口提供了多邊形,圓,屬性,矩形等幾種形式作爲提取柵格數據.
1).IRasterLayerExport接口
IRasterLayerExport rLayerExport = new RasterLayerExportClass();
rLayerExport.RasterLayer = rasterLayer;// rasterLayer指當前加載的柵格圖層
rLayerExport.Extent = clipExtent;//clipExtent指提取柵格數據的範圍
if (proSpatialRef != null)
rLayerExport.SpatialReference = proSpatialRef;// proSpatialRef當前柵格數據的投影信息
IWorkspaceFactory pWF = new RasterWorkspaceFactoryClass();
try
{
    IWorkspace pRasterWorkspace = pWF.OpenFromFile(_folder, 0);// _folder指柵格文件保存路徑
    IRasterDataset outGeoDataset = rLayerExport.Export(pRasterWorkspace, code, strRasterType);
    //調用ISaveAs接口將導出的數據集保存
    ……………………..
}
Catch(Exception ex)
{
   Throw new Argumention(ex.Message);
}
2.IExtractionOp接口(調用此接口前,應該先檢查空間許可)
IExtractionOp extraction = new RasterExtractionOpClass();
try
{
   IGeoDataset geoDataset = extraction.Rectangle((IGeoDataset)clipRaster, clipExtent, true);
   IRaster raster = geoDataset as IRaster;
   if (raster != null)
      {
        IWorkspaceFactory WF = new RasterWorkspaceFactoryClass();
        IWorkspace rasterWorkspace = WF.OpenFromFile(_folder, 0);
        ISaveAs saveAs = (ISaveAs)raster;
        saveAs.SaveAs(“Result.tif”, rasterWorkspace, 'TIFF');
       }
}
catch (Exception ex)
{
    MessageBox..Show(Ex.message);
}
7.柵格數據重採樣
柵格數據的重採樣主要基於三種方法:最鄰近採樣(NEAREST),雙線性
ILINEAR)和三次卷積採樣(CUBIC)。
(1).最鄰近採樣:它用輸入柵格數據中最臨近柵格值作爲輸出值。因此,在重採
樣後的輸出柵格中的每個柵格值, 都是輸入柵格數據中真實存在而未加任何改變的值。這種方法簡單易用,計算量小,重採樣的速度最快。
(2).雙線性採樣:此重採樣法取待採樣點(x,y)點周圍四個鄰點,在y方向(或X方向)內插兩次,再在x方向(或y方向)內插一次,得到(x,y)點的柵格值。
(3).三次卷積採樣:這是進一步提高內插精度的一種方法。它的基本思想是增加鄰點來獲
得最佳插值函數。取待計算點周圍相鄰的16個點,與雙線性採樣類似,可先在某一方向上內插,如先在x方向上,每四個值依次內插四次,再根據四次的計算結果在y方上內插,最終得到內插結果
代碼示例:採用雙線性採樣
IRasterGeometryProc rasterGeometryProc = new RasterGeometryProcClass();
rasterGeometryProc.Resample(rstResamplingTypes.RSP_CubicConvolution, newCellSize, clipRaster);
public static IRasterLayer SetViewShedRenderer(IRaster pInRaster, string sField, string sPath)
        {

            IRasterDescriptor pRD = new RasterDescriptorClass();
            pRD.Create(pInRaster, new QueryFilterClass(), sField);
            IReclassOp pReclassOp = new RasterReclassOpClass();
            IGeoDataset pGeodataset = pInRaster as IGeoDataset;
            IRasterAnalysisEnvironment pEnv = pReclassOp as IRasterAnalysisEnvironment;
            IWorkspaceFactory pWSF = new RasterWorkspaceFactoryClass();
            IWorkspace pWS = pWSF.OpenFromFile(sPath, 0);
            pEnv.OutWorkspace = pWS;
            object objSnap = null;
            object objExtent = pGeodataset.Extent;
            pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref objExtent, ref objSnap);
            pEnv.OutSpatialReference = pGeodataset.SpatialReference;
            IRasterLayer pRLayer = new RasterLayerClass();
            IRasterBandCollection pRsBandCol = pGeodataset as IRasterBandCollection;
            IRasterBand pRasterBand = pRsBandCol.Item(0);
            pRasterBand.ComputeStatsAndHist();
            IRasterStatistics pRasterStatistic = pRasterBand.Statistics;
            double dMaxValue = pRasterStatistic.Maximum;
            double dMinValue = pRasterStatistic.Minimum;

            INumberRemap pNumRemap = new NumberRemapClass();
            pNumRemap.MapRange(dMinValue, 0, 0);
            pNumRemap.MapRange(0, dMaxValue, 1);
            IRemap pRemap = pNumRemap as IRemap;

            IRaster pOutRaster = pReclassOp.ReclassByRemap(pGeodataset, pRemap, false) as IRaster;
            pRLayer.CreateFromRaster(pOutRaster);

            return pRLayer;

        }
柵格圖層和矢量圖層的屬性表瀏覽

if (pLyr is IFeatureLayer)
{
DataTable pTable = new DataTable();
IFeatureLayer pFealyr = pLyr as IFeatureLayer;
IFeatureClass pFCls = pFealyr.FeatureClass;
string shape = '';
if (pFCls.ShapeType == esriGeometryType.esriGeometryPoint)
shape = 'Point';
else if (pFCls.ShapeType == esriGeometryType.esriGeometryPolyline)
shape = 'Polyline';
else if (pFCls.ShapeType == esriGeometryType.esriGeometryPolygon)
shape = 'Polygon';

for (int i = 0; i < pFCls.Fields.FieldCount; i++)
{
pTable.Columns.Add(pFCls.Fields.get_Field(i).Name);
}
IFeatureCursor pCursor = pFCls.Search(null, false);
int ishape = pFCls.Fields.FindField('Shape');
IFeature pFea = pCursor.NextFeature();
while (pFea != null)
{
DataRow pRow = pTable.NewRow();
for (int i = 0; i < pFCls.Fields.FieldCount; i++)
{
if (i == ishape)
{
pRow = shape;
continue;
}
pRow = pFea.get_Value(i).ToString();
}
pTable.Rows.Add(pRow);
pFea = pCursor.NextFeature();
}
dataGridView1.DataSource = pTable;
}
else if (pLyr is IRasterLayer)
{
IRasterLayer pRlyr = pLyr as IRasterLayer;
IRaster pRaster = pRlyr.Raster;
IRasterProps pProp = pRaster as IRasterProps;
pProp.PixelType = rstPixelType.PT_LONG;
if (pProp.PixelType == rstPixelType.PT_LONG)
{
IRasterBandCollection pBcol = pRaster as IRasterBandCollection;
IRasterBand pBand = pBcol.Item(0);
ITable pRTable = pBand.AttributeTable;

DataTable pTable = new DataTable();
for (int i = 0; i < pRTable.Fields.FieldCount; i++)
pTable.Columns.Add(pRTable.Fields.get_Field(i).Name);


ICursor pCursor= pRTable.Search(null, false);
IRow pRrow= pCursor.NextRow();
while (pRrow != null)
{
DataRow pRow = pTable.NewRow();
for (int i =0 ;i<pRrow .Fields .FieldCount ;i++)
{
pRow = pRrow.get_Value(i).ToString () ;
}
pTable.Rows.Add(pRow);
pRrow = pCursor.NextRow();
}
dataGridView1.DataSource = pTable;
}

}
IRasterWorkspace2 IRasterDataset CreateRasterDataset C#

public IRasterDataset CreateFileRasterDataset(string directoryName, string fileName)
{
// This function creates a new img file in the given workspace
// and then assigns pixel values
try
{
IRasterDataset rasterDataset = null;
IPoint originPoint = new PointClass();
originPoint.PutCoords(0, 0);

// Create the dataset
IRasterWorkspace2 rasterWorkspace2 = null;
rasterWorkspace2 = CreateRasterWorkspace(directoryName);

rasterDataset = rasterWorkspace2.CreateRasterDataset(fileName, 'IMAGINE Image', originPoint, 200, 100, 1, 1, 1, rstPixelType.PT_UCHAR, new UnknownCoordinateSystemClass(), true);

IRawPixels rawPixels = null;
IPixelBlock3 pixelBlock3 = null;
IPnt pixelBlockOrigin = null;
IPnt pixelBlockSize = null;
IRasterBandCollection rasterBandCollection;
IRasterProps rasterProps;



// QI for IRawPixels and IRasterProps
rasterBandCollection = (IRasterBandCollection)rasterDataset;
rawPixels = (IRawPixels)rasterBandCollection.Item(0);
rasterProps = (IRasterProps)rawPixels;



// Create pixelblock
pixelBlockOrigin = new DblPntClass();
pixelBlockOrigin.SetCoords(0, 0);

pixelBlockSize = new DblPntClass();
pixelBlockSize.SetCoords(rasterProps.Width, rasterProps.Height);

pixelBlock3 = (IPixelBlock3)rawPixels.CreatePixelBlock(pixelBlockSize);



// Read pixelblock
rawPixels.Read(pixelBlockOrigin, (IPixelBlock)pixelBlock3);

// Get pixeldata array
System.Object[,] pixelData;
pixelData = (System.Object[,])pixelBlock3.get_PixelDataByRef(0);

// Loop through all the pixels and assign value
for (int i = 0; i < rasterProps.Width; i++)
for (int j = 0; j < rasterProps.Height; j++)
pixelData[i, j] = (i * j) % 255;



// Write the pixeldata back
System.Object cachePointer;

cachePointer = rawPixels.AcquireCache();

rawPixels.Write(pixelBlockOrigin, (IPixelBlock)pixelBlock3);

rawPixels.ReturnCache(cachePointer);

// Return raster dataset
return rasterDataset;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
return null;
}
}



public IRasterWorkspace2 CreateRasterWorkspace(string pathName)
{
// Create RasterWorkspace
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();

return workspaceFactory.OpenFromFile(pathName, 0) as IRasterWorkspace2;
}



public IRasterDataset tin2raster(string tempBathyTIN,string geoPath, string gridName)
{
string tinFolder = System.IO.Path.GetDirectoryName(tempBathyTIN);
string tinName = System.IO.Path.GetFileName(tempBathyTIN);
IRasterDataset rasterDataset = new RasterDatasetClass();
try
{
string rasterPath = System.IO.Path.GetDirectoryName(geoPath);
IWorkspaceFactory TinWF = new TinWorkspaceFactory();
ITinWorkspace TinWK = TinWF.OpenFromFile(tinFolder,0)as ITinWorkspace;
ITinAdvanced2 tinAd = TinWK.OpenTin(tinName) as ITinAdvanced2;
IEnvelope extent = tinAd.Extent;
IPoint origin = extent.LowerLeft;
origin.X = origin.X - (5 * 0.5);
origin.Y = origin.Y - (5 * 0.5);
int nCol = (int)Math.Round(extent.Width / 5) + 1;
int nRow = (int)Math.Round(extent.Height / 5) +1;

ISpatialReference2 spatialRef = (ISpatialReference2)extent.SpatialReference;

IWorkspaceFactory rasterWF = new RasterWorkspaceFactoryClass();
IRasterWorkspace2 workSpace = (IRasterWorkspace2)rasterWF.OpenFromFile(rasterPath,0);

rasterDataset = workSpace.CreateRasterDataset(gridName, 'GRID', origin,nCol,nRow,5,5,1,ESRI.ArcGIS.Geodatabase.rstPixelType.PT_FLOAT, spatialRef,true);


IRasterBandCollection bandColl = (IRasterBandCollection) rasterDataset;
IRasterBand rasterBand = bandColl.Item(0);
IRawPixels rawPixels = (IRawPixels)rasterBand;
IPnt blockSize = new DblPntClass();
blockSize.X = nCol;
blockSize.Y = nRow;
IPixelBlock3 pixelBlock = (IPixelBlock3)rawPixels.CreatePixelBlock(blockSize);
ITinSurface tinSurface = (ITinSurface)tinAd;
IRasterProps rasterProps = (IRasterProps)rawPixels;
object nodataFloat;
//long nodataInt;
object val = pixelBlock.get_PixelDataByRef(0);
MessageBox.Show(val.ToString());
double cellsize = 5;
origin.X = origin.X + (5 * 0.5);
origin.Y = origin.Y + (5 * nRow) - (5 * 0.5);

nodataFloat = Convert.ToDouble(rasterProps.NoDataValue.ToString());
tinSurface.QueryPixelBlock(origin.X,origin.Y,cellsize,cellsize,esriRasterizationType.esriElevationAsRaster,nodataFloat,val);
IPnt offset = new DblPntClass();
offset.X = 0;
offset.Y = 0;
rawPixels.Write(offset,pixelBlock as IPixelBlock);


}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());

}
return rasterDataset;

}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章