GIS

Raster

"GIS"

Posted by PandaL33 on January 21, 2017

前言

  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方法用于控制栅格数据的重采样,该接口的方法和数据成员如下:

alt

IRasterDataset

  该接口用来描述栅格数据集,栅格数据集可以认为是对栅格数据的抽象,用于代表磁盘上的栅格数据。该接口的方法和数据成员如下:

alt

IRasterBandCollection

  栅格数据是由一个或多个波段组成,这些波段的集合就是被IRasterBandCollection 接口控制,如果要获取某一个具体的波段,应该考虑使用该接口。该接口的方法和数据成员如下:

alt

IRasterGeometryProc

  IRasterGeometryProc 接口被RasterGeometryProc对象实现,而RasterGeometryProc对象只能操作Raster对象,因为Raster对象是内存对象,那么也就意味着对Raster的对象的操作是临时的。

  该接口是用来对Raster进行处理的,该接口包含众多的对Raster进行处理的方法。该接口的方法和数据成员如下:

alt

IRasterLayer

用来承载Raster对象的重要接口,该接口也可以用来控制栅格数据的渲染。

栅格分析

原始图像:

alt

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;
}

裁剪结果为:

alt

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);
    }
}

通视分析结果为:

alt

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;
}

分级渲染的结果为:

alt

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;
}

拉伸渲染结果为:

alt