SuperMap Objects 5.3中对栅格数据进行简单统计

有一个需求是在SO中对栅格数据进行简单的统计,主要是获得一个格网数据(栅格数据的一种,SuperMap中称为GRID数据集)的最大值,最小值,平均值,方差,标准差和中位数,如下图所示

 

最大值和最小值:

栅格数据的最大值和最小值是可用通过soDatasetRaster 对象的MaxZ和MinZ直接获得

 

平均值:栅格图是由一个个小格子组成的,其中每个格子都含有一个属性值,为了获得整个栅格图的均值,必须知道格子的个数,和所有格子所包含属性的总值,通过

总值/格子个数 的方式计算

格子的总数可以通过获得soDatasetRaster.PixelHeight(行数)*soDatasetRaster.PixelWidth(列数)的方式得出

总值可以通过循环的方式获得每一个格子的值,再相加的方法获得,使用的接口为soDatasetRaster.Value(nCol As Long,nRow As Long)

这样均值就可以求得了

 

方差:有了格子总数和均值,方差可以通过公式 方便的求出,参看代码

 

标准差:标准差为方差的算术平方根

 

中位数:同理,参看公式得出

 

 

  1        private void btnGetGridInfo_Click(object sender, EventArgs e)
  2        {
  3            soDatasetRaster objDtr = null;
  4            soDataset objDt = null;
  5            soLayers objLys = null;
  6            soLayer objLy = null;
  7            int iPixelHeight = 0;//返回栅格的行数
  8            int iPixelWidth = 0//返回栅格的列数
  9            double dPixelNum;//栅格个数
 10            double dTotal;//栅格的值的总和
 11            double dAverage;//返回平均值
 12            double dStandarddeviation;//返回标准差
 13            int  dMedian;//返回中位数
 14            try
 15            {
 16                objLys = axSuperMap1.Layers;
 17                objLy = objLys[1];
 18                objDt = objLy.Dataset;
 19                objDtr = (soDatasetRaster)objDt;
 20                //获得最大最小值
 21                txtMaxZ.Text = objDtr.MaxZ.ToString();
 22                txtMinZ.Text = objDtr.MinZ.ToString();
 23                iPixelHeight = objDtr.PixelHeight;
 24                iPixelWidth = objDtr.PixelWidth;
 25                //获得栅格个数
 26                dPixelNum = iPixelWidth * iPixelHeight;
 27                //获得所有栅格的值的总和
 28                dTotal = GetTotal(objDtr,iPixelHeight, iPixelWidth);
 29                //获得平均值
 30                dAverage = dTotal / dPixelNum;
 31                txtAverage.Text = dAverage.ToString();
 32                //获得标准差
 33                dStandarddeviation = GetStandarddeviation(objDtr, dAverage, dPixelNum, iPixelHeigh  t, iPixelWidth);
 34                txtStandarddeviation.Text = dStandarddeviation.ToString();
 35                //获得中位数
 36                dMedian = Convert.ToInt32((1 + dPixelNum) / 2);
 37                double x = objDtr.get_value(dMedian / iPixelHeight, Convert.ToInt32(dMedian % iPixelHeight));
 38                txtMedian.Text = x.ToString();
 39
 40
 41            }

 42            catch (Exception Flag)
 43            {
 44                MessageBox.Show(Flag.Message, "发生异常");
 45            }

 46            finally
 47            {
 48                Marshal.ReleaseComObject(objDt);
 49                objDt = null;
 50                Marshal.ReleaseComObject(objDtr);
 51                objDtr = null;
 52                Marshal.ReleaseComObject(objLys);
 53                objLys = null;
 54                Marshal.ReleaseComObject(objLy);
 55                objLy = null;
 56
 57            }

 58        }

 59
 60        private double GetStandarddeviation(soDatasetRaster objDtr, double dAverage, 
 61             double dPixelNum, int iPixelHeight, int iPixelWidth)//获得标准差
 62        {
 63            double dX = 0.0;
 64            try
 65            {
 66                for (int i = 1; i <= iPixelWidth; i++)
 67                {
 68                    for (int j = 1; j <= iPixelHeight; j++)
 69                    {
 70                        dX += Math.Pow ((objDtr.get_value(i, j)-dAverage),2);
 71                    }

 72                }

 73                dX = Math.Sqrt( 1 / dX * dPixelNum);
 74                return dX;
 75            }

 76            catch (Exception Flag)
 77            {
 78                MessageBox.Show(Flag.Message,"引发异常");
 79                return 0.0;
 80            }

 81        }

 82
 83        private double GetTotal(soDatasetRaster objDtr, int iPixelHeight, int iPixelWidth)//获得所有栅格的值的总和
 84        {
 85            double dTotal = 0.0;
 86            try
 87            {
 88                for (int i = 1; i <= iPixelWidth; i++)
 89                {
 90                    for (int j = 1; j <= iPixelHeight; j++)
 91                    {
 92                        dTotal += objDtr.get_value(i, j);
 93                    }

 94                }

 95                return dTotal;
 96            }

 97            catch (Exception Flag)
 98            {
 99                MessageBox.Show(Flag.Message, "引发异常");
100                return 0.0;
101            }

102        }

posted on 2008-08-16 14:31  _张超  阅读(865)  评论(0)    收藏  举报

导航