前言
GIS数据一般可分为两种主要的类型:栅格数据和矢量数据。矢量数据由弧、结点、线以及它们之间用以组成地理空间数据的关联关系来定义。真实要素和真实表面可以表示为存储在GIS中的矢量数据。
栅格数据则是栅格单元的矩形矩阵,以行和列的形式表示。表面可以通过栅格数据呈现,数据中的每个栅格单元均表示实际信息的某个值。该值可以为高程数据、污染程度、地下水位高度等。栅格数据从数学的角度来看就是一个二维矩阵。栅格数据一般可以存储为ESRI GRID (由一系列文件组成),TIFF格式(包括一个TIF文件和一个AUX文件)。
一个栅格数据集由一个或者多个波段(RasterBand)的数据组成,一个波段就是一个数据矩阵。对于格网数据(DEM数据)和单波段的影像数据,表现为仅仅只有一个波段数据的栅格数据集,而对于多光谱影像数据则表现为具有多个波段的栅格数据集。
模块与相关接口
模块
ArcGIS提供了两个扩展模块对栅格数据进行分析:ArcGIS Spatial Analyst和ArcGIS 3D Analyst。其中SpatialAnalyst模块提供了一整套的空间建模和分析工具,用来执行栅格和矢量分析;3DAnalyst主要用于显示、分析和生成表明数据,并且提供了三维建模和分析的工具。两个模块都可以计算坡度、坡向和山体阴影等功能。
GeoAnalyst类库是一个被拥有3D扩展和空间分析扩展所共享的类库,包含的核心的空间分析操作。该类库基于对栅格类相关的对象和接口的Datasourcesraster类库上。
相关接口
IRaster
IRaster 接口被Raster 对象实现,Raster 对象是一个内存对象,IRaster 接口用于控制对栅格数据像素的读取,此接口还有一个ResampleMethod方法用于控制栅格数据的重采样,该接口的方法和数据成员如下:
IRasterDataset
该接口用来描述栅格数据集,栅格数据集可以认为是对栅格数据的抽象,用于代表磁盘上的栅格数据。该接口的方法和数据成员如下:
IRasterBandCollection
栅格数据是由一个或多个波段组成,这些波段的集合就是被IRasterBandCollection 接口控制,如果要获取某一个具体的波段,应该考虑使用该接口。该接口的方法和数据成员如下:
IRasterGeometryProc
IRasterGeometryProc 接口被RasterGeometryProc对象实现,而RasterGeometryProc对象只能操作Raster对象,因为Raster对象是内存对象,那么也就意味着对Raster的对象的操作是临时的。
该接口是用来对Raster进行处理的,该接口包含众多的对Raster进行处理的方法。该接口的方法和数据成员如下:
IRasterLayer
用来承载Raster对象的重要接口,该接口也可以用来控制栅格数据的渲染。
栅格分析
原始图像:
1、裁剪
/// <summary>
/// 裁剪分析
/// </summary>
/// <param name="pGeoDataset">空间数据集</param>
/// <param name="pPolygon">裁剪多边形</param>
/// <returns>裁剪数据集</returns>
public IGeoDataset CreateExtractOp(IGeoDataset pGeoDataset,IPolygon pPolygon)
{
IExtractionOp pExtractionOp = new RasterExtractionOpClass();
IGeoDataset pGeoOutput = pExtractionOp.Polygon(pGeoDataset, pPolygon, true);
return pGeoOutput;
}
裁剪结果为:
2、通视分析
通视分析以观察者和目标形成一条线,可视的部分以绿色显示,不可视的部分以红色显示。通视分析主要由ISurface接口的GetLineOfSight()方法实现,该方法定义如下:
public void GetLineOfSight (
IPoint pObserver,
IPoint pTarget,
ref IPoint ppObstruction,
ref IPolyline ppVisibleLines,
ref IPolyline ppInvisibleLines,
ref bool pbIsVisible,
ref bool bApplyCurvature,
ref bool bApplyRefraction,
ref object pRefractionFactor
);
其中输出的ppVisibleLines和ppInvisibleLines为通视分析后的可见路线和不可见路线,具体实现如下:
/// <summary>
/// 透视分析
/// </summary>
/// <param name="axMapControl1">Map控件</param>
/// <param name="pRasterLayer">栅格图层</param>
public void LineOfSight(AxMapControl axMapControl1, IRasterLayer pRasterLayer)
{
if (pRasterLayer != null)
{
IRasterSurface pRasterSurface = new RasterSurfaceClass();
pRasterSurface.PutRaster(pRasterLayer.Raster, 0);
ISurface pSurface = pRasterSurface as ISurface;
IPolyline pPolyline = axMapControl1.TrackLine() as IPolyline;
IPoint pPoint = null;
IPolyline pVPolyline = null;
IPolyline pInPolyline = null;
object pRef = 0.13;
bool pBool = true;
double pZ1 = pSurface.GetElevation(pPolyline.FromPoint);
double pZ2 = pSurface.GetElevation(pPolyline.ToPoint);
IPoint pPoint1 = new PointClass();
pPoint1.Z = pZ1;
pPoint1.X = pPolyline.FromPoint.X;
pPoint1.Y = pPolyline.FromPoint.Y;
IPoint pPoint2 = new PointClass();
pPoint2.Z = pZ2;
pPoint2.X = pPolyline.ToPoint.X;
pPoint2.Y = pPolyline.ToPoint.Y;
pSurface.GetLineOfSight(pPoint1,pPoint2,out pPoint,out pVPolyline,out pInPolyline,out pBool,false,false,ref pRef);
if (pVPolyline != null)
{
IElement pLineElementV = new LineElementClass();
pLineElementV.Geometry = pVPolyline;
ILineSymbol pLinesymbolV = new SimpleLineSymbolClass();
pLinesymbolV.Width = 2;
IRgbColor pColorV = new RgbColorClass();
pColorV.Green = 255;
pLinesymbolV.Color = pColorV;
ILineElement pLineV = pLineElementV as ILineElement;
pLineV.Symbol = pLinesymbolV;
axMapControl1.ActiveView.GraphicsContainer.AddElement(pLineElementV, 0);
}
if (pInPolyline != null)
{
IElement pLineElementIn = new LineElementClass();
pLineElementIn.Geometry = pInPolyline;
ILineSymbol pLinesymbolIn = new SimpleLineSymbolClass();
pLinesymbolIn.Width = 2;
IRgbColor pColorIn = new RgbColorClass();
pColorIn.Red = 255;
pLinesymbolIn.Color = pColorIn;
ILineElement pLineIn = pLineElementIn as ILineElement;
pLineIn.Symbol = pLinesymbolIn;
axMapControl1.ActiveView.GraphicsContainer.AddElement(pLineElementIn, 1);
}
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
}
通视分析结果为:
3、分级渲染
分级渲染主要由IRasterClassifyColorRampRenderer接口实现,该接口可以设置分级的级数,各级的符号等信息。分级渲染的实现(级数:9)如下:
/// <summary>
/// 分级渲染
/// </summary>
/// <param name="pRasterLayer">栅格图层</param>
/// <returns>栅格渲染</returns>
public IRasterRenderer ClassifyRenderer(IRasterLayer pRasterLayer)
{
IRasterClassifyColorRampRenderer pClassifyRenderer = new RasterClassifyColorRampRendererClass();
IRasterRenderer pRasterRenderer = (IRasterRenderer)pClassifyRenderer;
IRaster pRaster = pRasterLayer.Raster;
pRasterRenderer.Raster = pRaster;
pClassifyRenderer.ClassCount = 9;
pRasterRenderer.Update();
IRgbColor pFromColor = new RgbColorClass();
pFromColor.Red = 255;
pFromColor.Green = 0;
pFromColor.Blue = 0;
IRgbColor pToColor = new RgbColorClass();
pToColor.Red = 0;
pToColor.Green = 255;
pToColor.Blue = 255;
IAlgorithmicColorRamp pRamp = new AlgorithmicColorRampClass();
pRamp.Size = 9;
pRamp.FromColor = pFromColor;
pRamp.ToColor = pToColor;
bool pBoolColorRamp;
pRamp.CreateRamp(out pBoolColorRamp);
IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
for (int i = 0; i < pClassifyRenderer.ClassCount; i++)
{
pFillSymbol.Color = pRamp.get_Color(i);
pClassifyRenderer.set_Symbol(i, (ISymbol)pFillSymbol);
pClassifyRenderer.set_Label(i, Convert.ToString(i));
}
return pRasterRenderer;
}
分级渲染的结果为:
4、拉伸渲染
拉伸渲染主要由 IRasterStretchColorRampRenderer接口和IRasterStretch接口实现,IRasterStretchColorRampRenderer接口设置渲染的波段和颜色带,IRasterStretch接口设置拉伸的类型。拉伸渲染的实现如下:
/// <summary>
/// 拉伸渲染
/// </summary>
/// <param name="pRasterLayer">栅格图层</param>
/// <returns>栅格渲染</returns>
public IRasterRenderer StretchRenderer(IRasterLayer pRasterLayer)
{
IRgbColor pFromColor = new RgbColorClass();
pFromColor.Red = 255;
pFromColor.Green = 0;
pFromColor.Blue = 0;
IRgbColor pToColor = new RgbColorClass();
pToColor.Red = 0;
pToColor.Green = 255;
pToColor.Blue = 0;
IAlgorithmicColorRamp pRamp = new AlgorithmicColorRampClass();
pRamp.Size = 255;
pRamp.FromColor = pFromColor;
pRamp.ToColor = pToColor;
bool createColorRamp;
pRamp.CreateRamp(out createColorRamp);
IRasterStretchColorRampRenderer pStretchRenderer = new RasterStretchColorRampRendererClass();
IRasterRenderer pRasterRenderer = (IRasterRenderer)pStretchRenderer;
pRasterRenderer.Raster = pRasterLayer.Raster;
pRasterRenderer.Update();
pStretchRenderer.BandIndex = 0;
pStretchRenderer.ColorRamp = pRamp;
IRasterStretch pStretchType = (IRasterStretch)pRasterRenderer;
pStretchType.StretchType = esriRasterStretchTypesEnum.esriRasterStretch_StandardDeviations;
pStretchType.StandardDeviationsParam = 2;
return pRasterRenderer;
}
拉伸渲染结果为: