精华内容
下载资源
问答
  • 栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。...

    栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。这里使用的是最原始的遍历栅格的方式。

            public static void StrechDN(IRasterLayer pRasterLayer, int OTSU,int minValue, int maxValue)//修改二值化后的像素值
        {
            //获取栅格像素块
            IRaster pRaster = pRasterLayer.Raster;
            IRasterProps pRasterProps = (IRasterProps)pRaster; //rasterband;
    
            //设置像素块的大小
            IPnt pBlockSize1 = new PntClass();      
            pBlockSize1.SetCoords(pRasterProps.Width, pRasterProps.Height);
    
            IPixelBlock pixelBlock = pRaster.CreatePixelBlock(pBlockSize1);// raster2.CreateCursorEx(pBlockSize1).PixelBlock;
            int w = pixelBlock.Width;
            int h = pixelBlock.Height;
            //read the first pixel block,左上点坐标  
            IPnt topleftCorner = new PntClass();
            topleftCorner.SetCoords(0, 0);//左上角第一个像素点
            pRaster.Read(topleftCorner, pixelBlock);//从第一个点开始读pixelBlock大小的像素块
            //modify one pixel value at location (assume the raster has a pixel type of uchar)
            IPixelBlock3 pixelBlock3 = (IPixelBlock3)pixelBlock;
            object pValue;
            System.Array pixels = (System.Array)pixelBlock3.get_PixelData(0);
            for (int finalX = 0; finalX < pRasterProps.Width; finalX++)
            {
                for (int finalY = 0; finalY < pRasterProps.Height; finalY++)
                {
                    pValue = pixels.GetValue(finalX, finalY);
                    if (Convert.ToDouble(pValue) < OTSU)
                    {
                        pixels.SetValue(minValue, finalX, finalY);
                    }
                    else
                    {
                        pixels.SetValue(maxValue, finalX, finalY);
                    }
                }
            }         
    
            pixelBlock3.set_PixelData(0, (System.Object)pixels);
            //write the modified pixel block to the raster dataset
            IRasterEdit rasterEdit = (IRasterEdit)pRaster;
            rasterEdit.Write(topleftCorner, pixelBlock);
            rasterEdit.Refresh();//刷新资源
            System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);//停止编辑 
    
        }
    

    将IRasterLayer存储起来的方法

    public static void SaveRasterLayerTofile(IRasterLayer pRasterLayer, string fileName, string strFileExtension="TIFF")
     {
    
    
            IRaster pRaster = pRasterLayer.Raster;
            IRaster2 pRaster2 = pRaster as IRaster2;
    
            ISaveAs pSaveAs = pRaster2 as ISaveAs;
            pSaveAs.SaveAs(fileName, null, strFileExtension);
    }
    
    展开全文
  • GP工具栅格重分类

    2018-09-29 16:44:29
    GP工具可以较为简单的实现栅格数据重分类,要注意参数设置准确。 重分类时要用到获取栅格数据最大最小值, 等间距重分类 步骤: 获取栅格数据最大最小值 定义与初始化GP工具 定义重分类工具 重分类工具初始化...

    GP工具可以较为简单的实现栅格数据重分类,要注意参数设置准确。

    重分类时要用到获取栅格数据最大最小值,

    等间距重分类

    步骤:

    • 获取栅格数据最大最小值
    • 定义与初始化GP工具
    • 定义重分类工具
    • 重分类工具初始化
    • 执行重分类
    • 加载执行结果

    获取栅格数据最大最小值

    //获取取值范围
    IRaster pRaster = pRasterLayer.Raster;
    IRasterBandCollection pRBC = (IRasterBandCollection)pRaster;
    IRasterBand pRasterband = pRBC.Item(0);  //第一坡道
    IRasterStatistics pRS = pRasterband.Statistics;
    double max = pRS.Maximum;
    double min = pRS.Minimum;

    定义与初始化GP工具

    Geoprocessor GP = new Geoprocessor();
    GP.OverwriteOutput = true;

    定义重分类工具

    Reclassify pRec = new Reclassify();

    重分类工具初始化

    pRec.in_raster = pRasterLayer;
    pRec.reclass_field = "Value";
    string remap = "";
    double dis = (max + min) / 10;
    for(double i = 0; i < 10; i++)   //此处注意,一定要为double类型
        {
            //注意数字和数字一起算
            //注意字符跟字符一起算
            double from = min + dis * i/10;
            double to = min + dis * (i + 1)/10;
            remap += from + " " + to + " " + i + ";";
        }
    pRec.remap = remap;

    执行重分类、加载执行结果

                try
                {
                    GP.Execute(pRec, null);
    
                    IRasterLayer resRasterLayer = new RasterLayer();
                    resRasterLayer.CreateFromFilePath(Application.StartupPath + "\\reclass.tif");
                    axMapControl1.AddLayer(resRasterLayer);
                    object sev = null;
                    MessageBox.Show(GP.GetMessages(ref sev));
                }
                catch
                {
                    object sev = null;
                    MessageBox.Show(GP.GetMessages(ref sev));
    
                }

    注意:

    int型数据运算后会被取整,涉及小数运算时们一定要将数据定义为double或float

    数据加减运算与字符串加减要分开,防止混淆,无法执行。

    全部代码(函数):

            private void 重分类ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //获取输入数据
                ILayer pLayer = axMapControl1.get_Layer(3);
                IRasterLayer pRasterLayer = pLayer as IRasterLayer;
    
                //获取取值范围
                IRaster pRaster = pRasterLayer.Raster;
                IRasterBandCollection pRBC = (IRasterBandCollection)pRaster;
                IRasterBand pRasterband = pRBC.Item(0);  //第一坡道
                IRasterStatistics pRS = pRasterband.Statistics;
                double max = pRS.Maximum;
                double min = pRS.Minimum;
    
                Geoprocessor GP = new Geoprocessor();
                GP.OverwriteOutput = true;
    
                //定义重分类工具
                Reclassify pRec = new Reclassify();
                pRec.in_raster = pRasterLayer;
                pRec.reclass_field = "Value";
    
                string remap = "";
                double dis = (max + min) / 10;
                for(double i = 0; i < 10; i++)   //此处注意,一定要为double类型
                {
                    //注意数字和数字一起算
                    //注意字符跟字符一起算
                    double from = min + dis * i/10;
                    double to = min + dis * (i + 1)/10;
                    remap += from + " " + to + " " + i + ";";
                }
                pRec.remap = remap;
                MessageBox.Show(remap);
                pRec.out_raster = Application.StartupPath + "\\reclass.tif";
    
                try
                {
                    GP.Execute(pRec, null);
    
                    IRasterLayer resRasterLayer = new RasterLayer();
                    resRasterLayer.CreateFromFilePath(Application.StartupPath + "\\reclass.tif");
                    axMapControl1.AddLayer(resRasterLayer);
                    object sev = null;
                    MessageBox.Show(GP.GetMessages(ref sev));
                }
                catch
                {
                    object sev = null;
                    MessageBox.Show(GP.GetMessages(ref sev));
    
                }
            }

     

    展开全文
  • 最近做项目需要实现栅格重分类功能,纠结了许久,转遍了CSDN、PUDN,下载了N多源码,终于实现了简单的栅格重分类,泪目。首先是需要时刻提醒自己注意的几个地方: 复制别人代码的时候,一定要把按钮、尤其是事件的...

    最近做项目需要实现栅格重分类功能,纠结了许久,转遍了CSDN、PUDN,下载了N多源码,终于实现了简单的栅格重分类,泪目。

    首先是需要时刻提醒自己注意的几个地方:

    • 复制别人代码的时候,一定要把按钮、尤其是事件的功能重写!!!
    • 重分类结果的保存路径必须是数据库,不能是文件夹。这个在ArcMap可以自行体会。
    • 代码的实现主要参考了牟乃夏老师的课件,果然运气也是实力的一部分

    简单地说,重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。
    在ArcGIS Engine中,通过RasterReclassOpClass实现栅格数据的重分类,该类继承了两个主要的接口,分别是IRasterAnalysisEnvironment接口和IReclassOp接口,IReclassOp接口中包含了以下几种提取分析方法,分别为:
    (1)Reclass(使用表重分类)
    (2)ReclassByASCIIFile(使用ASCII文件重分类)
    (3)Slice(分割)
    (4)Lookup(查找表)
    (5)ReclassByRemap(定义重映射进行重分类)


    使用表重分类
    使用表重分类需要调用IReclassOp接口的ReClass方法,该方法的原型为:
    public IGeoDataset Reclass ( IGeoDatasetgeo Dataset, ITableremap Table, string fromField, string toField, string OutField,bool retainMissingValues);
    该方法有六个参数,分别是:
    (1)IGeoDataset geoDataset 输入栅格。
    (2)ITable remapTable输入重映射表。
    (3)string fromField 来自值字段。
    (4)string toField 到值字段。
    (5)string OutField 输出值字段。
    (6)bool retainMissingValues 是否将缺失值改为NoData。


    进行使用表重分类时需要用到IWorkSpace、ITable和IFields接口,通过这些接口获取重分类信息表和表中所有的字段。
    使用表重分类的实现思路如下:
    (1)获取输入栅格IGeoDataset;
    (2)调用IWorkSpace、ITable等接口得到重映射表;
    (3)选择表中的来自值字段(fromField)、到值字段(toField)和 输出值字段(OutField);
    (4)调用IReclassOp接口的Reclass方法,返回重分类结果;
    (5)显示重分类后的结果。


    使用ASCII文件重分类
    使用ASCII文件进行重分类前,需要先编辑ASCII文件,而ASCII文件必须满足特定的格式:
    (1)注释行以“#”符号为起始字符,输入的注释不受限制。
    (2)每个分配行都可将输入栅格内的某一个值或一定范围内的值映射为输出值。分配行只接受数值。
    (3)ASCII 重映射文件中所有分配行的格式都必须相同。


    使用ASCII文件重分类需要调用IReclassOp接口的ReclassByASCIIFile方法,该方法的原型为:
    public IGeoDataset ReclassByASCIIFile (IGeoDatase tinRaster,strings RemapFile,bool retainMissingValues);
    该方法有三个参数,分别是:
    (1)IGeoDataset GeoDataset 输入栅格数据集。
    (2)strings RemapFile ASCII文件路径,ASCII文件允许使用的扩展名有.rmp、.txt 和 *.asc。
    (3)bool retainMissingValues 是否将缺失值改为NoData。


    使用ASCII文件重分类的实现思路如下:
    (1)获取输入栅格IGeoDataset;
    (2)得到具有重分类信息的ASCII文件;
    (3)调用IReclassOp接口的ReclassByASCIIFile方法,返回重分类结果;
    (4)显示重分类后的结果。


    分割
    分割是按一系列相等的间隔来划分值的整个范围,或者将各个像元数量划分到一定数量的组中,且每组分到的像元数量相等来进行划分。

    分割需要调用IReclassOp接口的Slice方法,该方法的原型为:
    public IGeoDataset Slice (IGeoDatasetgeo Dataset,esriGeoAnalysisSliceEnum sliceType, int zoneCount,ref object baseZone);
    该方法有四个参数,分别是:
    (1)IGeoDataset GeoDataset 输入栅格数据集。
    (2)esriGeoAnalysisSliceEnum sliceType 分割方法。
    (3)int zoneCount 输出区域的个数。
    (4)ref object baseZone 起始区域值。

    分割重分类的实现思路如下:
    (1)获取输入栅格IGeoDataset;
    (2)调用esriGeoAnalysisSliceEnum选择分割方法(sliceType);
    (3)设置输出区域的个数(zoneCount);
    (4)调用IReclassOp接口的Slice方法,返回分割结果;
    (5)显示分割后的结果。


    分割方法使用的代码。窗体界面如图
    这里写图片描述

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using ESRI.ArcGIS.DataSourcesRaster;
    using ESRI.ArcGIS.GeoAnalyst;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.DataSourcesGDB;
    using System.IO; 
    
    namespace WuZhongGeoHazard
    {
        public partial class ReclassRasterForm : Form
        {
            private IReclassOp reclassOp;//提取分析对象
            private IGeoDataset inGeodataset;//输入数据集
            private IGeoDataset result;//结果数据集
            private bool retainMissingValues = false;
    
            private IWorkspace workspace;
            private ITable remapTable;//重分类映射表
            private string fromField;//来自值字段
            private string toField;//到值字段
            private string outField;//输出值字段
    
            private string ASCIIPath;//ASCII文件路径
    
            private int zoneCount;//分割区域个数
            private esriGeoAnalysisSliceEnum sliceEnum;//分割方法
            private MainForm pMainForm = null;
    
            public ReclassRasterForm(MainForm _pMainForm)
            {
                InitializeComponent();
                pMainForm = _pMainForm;
            }
    
            private void btnSlice_Click(object sender, EventArgs e)
            {
                try
                {
                    object Missing = Type.Missing;
                    reclassOp = new RasterReclassOpClass();
                    result = reclassOp.Slice(inGeodataset, sliceEnum, zoneCount, Missing);//分割方法
                    ShowRasterResult(result, "分割");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "错误提示");
                }
            }
    
            #region 分割        
            private void txtCount_TextChanged_1(object sender, EventArgs e)
            {
                zoneCount = Convert.ToInt32(txtCount.Text);
            }
    
            //设置分析方法
            private void cmbSliceType_TextChanged(object sender, EventArgs e)
            {
                int index = cmbSliceType.SelectedIndex;
                switch (index)
                {
                    case 0://EQUAL_INTERVAL
                        sliceEnum = esriGeoAnalysisSliceEnum.esriGeoAnalysisSliceEqualInterval;
                        break;
                    case 1://EQUAL_AREA
                        sliceEnum = esriGeoAnalysisSliceEnum.esriGeoAnalysisSliceEqualArea;
                        break;
                    case 2://NATURAL_BREAKS
                        sliceEnum = esriGeoAnalysisSliceEnum.esriGeoAnalysisSliceNatualBreaks;
                        break;
                }
            }
            #endregion
    
            #region 辅助运算方法
            //显示栅格结果
            private void ShowRasterResult(IGeoDataset geoDataset, string interType)
            {
                IRasterLayer rasterLayer = new RasterLayerClass();
                IRaster raster = new Raster();
                //IRasterDescriptor des = geoDataset as IRasterDescriptor;
                //raster = des.Raster;
                raster = geoDataset as IRaster;
                rasterLayer.CreateFromRaster(raster);
                rasterLayer.Name = interType;
    
                pMainForm.axMapControl1.AddLayer((ILayer)rasterLayer, 0);
                pMainForm.axMapControl1.ActiveView.Refresh();
            }
    
            //通过图层名得到图层
            private ILayer getLayerFromName(string layerName)
            {
                ILayer layer;
                IMap map = pMainForm.axMapControl1.Map;
                for (int i = 0; i < map.LayerCount; i++)
                {
                    layer = map.get_Layer(i);
                    if (layerName == layer.Name)
                        return layer;
                }
                return null;
            }
    
            //设置栅格数据
            private void cmbLayers_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    ILayer layer = getLayerFromName(cmbLayers.SelectedItem.ToString());
                    IRasterLayer rasterLayer = layer as IRasterLayer;
    
                    IRaster raster = rasterLayer.Raster;
                    inGeodataset = raster as IGeoDataset;
                }
                catch
                {
                    MessageBox.Show("请输入栅格图层!");
                };
            }
            #endregion
    
            #region 参数实例化
            //实例化重分类对象
            private void ReclassRasterForm_Load(object sender, EventArgs e)
            {
                reclassOp = new RasterReclassOpClass();
            }
    
            private void cmbLayers_MouseClick(object sender, MouseEventArgs e)
            {
                ComboBox c = sender as ComboBox;
                c.Items.Clear();
    
                IMap map = pMainForm.axMapControl1.Map;
                if (map != null)
                {
                    for (int i = 0; i < map.LayerCount; i++)
                    {
                        c.Items.Add(map.get_Layer(i).Name);
                    }
                }
            }
            #endregion
        }
    }
    
    展开全文
  • 栅格重分类方法

    2008-08-10 18:46:00
    栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。...

    栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。

    这里使用的是最原始的遍历栅格的方式。

     

     

     Public Function reclass(ByVal pRaster As IRaster, ByVal extent As ArrayList, ByVal value As ArrayList, ByVal NoData As Single) As IRaster


            '得倒栅格的IRasterProps和IRawPixels
            Dim pRasterBands As IRasterBandCollection
            pRasterBands = pRaster

            Dim pRasterBand As IRasterBand
            pRasterBand = pRasterBands.Item(0)

            Dim pRawRixels As IRawPixels
            pRawRixels = pRasterBands.Item(0)

            Dim pRasterPro As IRasterProps
            pRasterPro = pRasterBand

            '设置栅格数据起始点
            Dim pBlockSize As IPnt
            pBlockSize = New Pnt()

            pBlockSize.SetCoords(pRasterPro.Width, pRasterPro.Height)

            '在栅格上创建pPixBlock,用来存放栅格数据
            Dim pPixelBlock As IPixelBlock
            pPixelBlock = pRaster.CreatePixelBlock(pBlockSize)

            '左上点坐标
            Dim tlp As IPnt = New Pnt()
            tlp.SetCoords(0, 0)

            '读入栅格
            pRawRixels.Read(tlp, pPixelBlock)

            '将PixBlock的值组成数组
            Dim pSafeArray As System.Array
            pSafeArray = pPixelBlock.SafeArray(0)


            '遍历每一个栅格,进行分类设置
            For y As Long = 0 To pRasterPro.Height - 1
                For x As Long = 0 To pRasterPro.Width - 1

                    '判断每个栅格的所属类,确定其属于哪一类,然后进行赋值,即重分类
                    For i As Integer = 0 To extent.Count - 1

                        '如果值< 0,说明该处为空值(Nodata),赋给这个栅格相应的值
                        If CType(pSafeArray.GetValue(x, y), Single) < 0 Then
                            pSafeArray.SetValue(NoData, x, y)
                            Exit For
                        End If

                        '判断栅格属于哪一类,进行赋值
                        If CType(pSafeArray.GetValue(x, y), Single) <= CType(extent(i), Single) Then
                            pSafeArray.SetValue(value(i), x, y)
                            Exit For
                        End If
                    Next
                Next
            Next


            '将数组赋给PixBlock
            pPixelBlock.SafeArray(0) = CType(pSafeArray, System.Array)

            '编辑raster,将更新的值写入raster中
            Dim rasterEdit As IRasterEdit

            rasterEdit = pRaster
            rasterEdit.Write(tlp, pPixelBlock)
            rasterEdit.Refresh()

            Return pRaster

        End Function


     

     

    转载于:https://www.cnblogs.com/luspa/archive/2008/08/10/1264729.html

    展开全文
  • 栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。...
  • 重分类工具可通过多种方法将像元值重分类或更改为替代值。一次对一个值或成组的值进行重分类方法是:使用替代字段;基于某条件,如指定的间隔(如按照 10 个间隔将值分组);按区域重分类(例如,将值分成 10 个所含...
  • 利用arcengine对栅格进行重分类
  • GIS操作——栅格重分类value值

    千次阅读 2020-03-18 20:57:38
    目前这个图层参与计算的只有VALUE值,想让VALUE1参加计算,使用工具Reclassify,输入栅格重分类选VALUE1,将Old values赋值到New values,设置输出路径并命名即可。 此时新栅格的value就是想要参与计算的属性了...
  • GDAL 栅格重分类(python)

    千次阅读 2018-05-17 10:27:27
    case:将具有多个栅格属性值的影像进行重编码或重分类,这其中涉及到影像的属性值的读取和更新,影响的创建等方法。以下将分三个步骤开始实现。1.加载影像# 为了支持中文路径,请添加下面这句代码 gdal....
  • string Remap1 = "";//重分类区间字符串 Remap1 = -1000 + " " + 40 + " " + 1 + ";"; // [-1000 - 40] 重分类为1 Remap1 = Remap1 + 40 + " " + 45 + " " + 3 + ";";// [40 - 45] 重分类为3 ...
  • } } /// /// 执行重分类 /// /// 输入的栅格 /// 保存的工作空间 /// private IRasterDataset ExecuteReClass(IRaster pInRaster, IWorkspace pWorkspace) { IReclassOp pReclassOp = new RasterReclassOpClass();...
  • Geoprocessor gp = new Geoprocessor(); gp.OverwriteOutput = true; Reclassify Rec = new Reclassify(); string Remap = ""; IWorkspaceFactory2 workspac...
  • ArcGIS栅格图像重分类C#代码实现

    千次阅读 2014-01-08 10:30:39
    最近在做热点商圈分析,在分析出来的结果要对其进行重分类,通过不断尝试,终于实现了以不同方式(NaturalBreaks、EqualInterval、GeometricalInterval、Quantile)进行重分类的功能,现在将其整理分享: ...
  • ENVI栅格重采样

    千次阅读 2020-11-28 22:17:14
    1.ENVI栅格重采样 Toolbox Raster Management / Resize Data 像元原大小:463.31271653 像元大小:231.656358重来 x、y改完后,变为: 生成MCD12Q1.A2001001.LC_Type1_resize.dat 2.ENVI中显示MCD12Q1 Type1 17个...
  • 一,下载工具 在 http://www.sdmtoolbox.org/downloads下载版本对应的toolbox 二、加载toolbox 三、实现批量剪裁
  • 栅格计算面积

    2021-02-23 08:44:32
    1.进行栅格重分类 2.重分类 3.打开属性,查看像元大小 4.打开属性表 5.添加字段 6.打开字段计算器 7.计算结果如下(单位一般为平方米)
  • its area calculation 要素的属性,tool里面 raster & its area calculation 栅格的面积计算,计算属性,个数乘以面积 datum 是基准信息(从哪个位置投射光),projection是投影方式 四维物体 s
  • 栅格重分类、栅格计算器的使用、栅格和矢量转换、水文分析
  • 除了标题说的这些功能,还有很多的关于arcmap功能,都已实现,哈哈。 图就不传了,以后都不传图了。想偷学界面设计是不可能的,坏得很。
  • 重采样 和 重分类

    2019-09-24 16:00:01
    重采样是指更改栅格数据集的空间分辨率并针对所有新像素大小的聚合值或插值设置规则,可以改变像元的大小,但栅格数据集的范围将保持不变。重采样之后栅格数据的每个像元将具有唯一属性...重分类是指对栅格值重新进...
  • ArcEngine重分类

    2019-05-06 10:29:00
    重分类”工具可更改栅格中的各个值。按单个值进行重分类工具将以一对一的方式将一个值更改为另一个值。例如,执行鹿栖息地分析时,土地利用栅格中的各个值表示土地利用的不同类型,需要将其更改为一个优先级范围(如...
  • 按值的范围进行重分类时,重分类工具需要设定输入栅格中现有值的各个下限和上限以及它们各自对应的替代值,这样便可指定值的范围。原始栅格中落入指定值范围内的所有值均将被赋予为该范围指定的替代值。各种工具对...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

栅格重分类