天天看點

栅格資料處理方法

轉自: http://www.cnblogs.com/linghe/archive/2009/02/09/1386843.html

兩個星期以來一直與栅格資料打交道,對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 (esriSpatialAnalyst),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);

栅格資料重分類 (2009-01-10 10:10:09)

标簽:栅格 重分類 分類:AE二次開發

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[i] = shape;

continue;

}

pRow[i] = 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[i] = pRrow.get_Value(i).ToString () ;

}

pTable.Rows.Add(pRow);

pRrow = pCursor.NextRow();

}

dataGridView1.DataSource = pTable;

}

}

建立栅格資料集 (2008-04-20 14:14:05)

标簽:arcgis engine c# 代碼 it 分類:三文魚的GIS

關鍵詞:建立栅格資料集 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;

}