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
}
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
try15
{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
finally47
{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
try65
{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
try87
{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
}

浙公网安备 33010602011771号