- 积分
- 13989
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-6-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为了步浪费您的金钱直接附上源码.注意本源码用C#编写.
static int NS = 554, MX = 30, MY = 24, ND = 1;
//NS离散点数目,观测站总数,MX精度格点数,MY纬度格点数
float[] lt = new float[NS];
float[] ln = new float[NS];
float[] lat = new float[MY];
float[] lon = new float[MX];
float[,] p1x1 = new float[MX,MY];
float[,] t1x1 = new float[MX, MY];
float[,] ipr = new float[NS, ND];
float[,] t = new float[NS, ND];
int nlev, nlfag;
float tim=Convert.ToSingle(0.25);//插值半径0.25度
lon[0] = Convert.ToSingle(99.8);//经度开始值99.8-107.5
lat[0] = Convert.ToSingle(26.5);//纬度开始值26.5-32.65
for (int i = 1; i < MX; i++)
lon[i] = lon[i - 1] + Convert.ToSingle(1.0);//给格点上的经度负值
for (int i = 1; i < MY; i++)
lat[i] = lat[i - 1] + Convert.ToSingle(1.0);//给格点上的纬度赋值
//初始化p1x1
for (int j = 0; j < MY; j++)
for (int i = 0; i < MX; i++)
p1x1[i, j] = Convert.ToSingle(-999.9);
//开始计算了
for (int it = 0; it < ND; it++)
{
#region 格点插值
float wt = Convert.ToSingle(0.0), r1x1 = Convert.ToSingle(0.0), w = Convert.ToSingle(0.0);
for (int j = 1; j < MY - 1; j++)
{
for (int i = 1; i < MX - 1; i++)
{
float x0 = lon[i];
float y0 = lat[j];
wt = Convert.ToSingle(0.0); r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for (int ii = 0; ii < nlev; ii++)
{
if (ipr[ii, it] != -999.9)
{
float x = ln[ii];
float y = lt[ii];
float d = Convert.ToSingle(Math.Sqrt((x - x0) * (x - x0) + (y - y0) * (y - y0)));
if (d <1.25* tim)
{
if (d < 0.1*tim)
w = Convert.ToSingle(100.0);//避免间隔太近的点贡献过大
else
w = Convert.ToSingle(1.0) / (d * d);
r1x1 = r1x1 + ipr[ii, it] * w;
wt += w;
}
}
}
if (wt < 0.2)
p1x1[i, j] = Convert.ToSingle(-999.9);
else
p1x1[i, j] = r1x1 / wt;
}
}
#endregion
//离散格点插值就完成了,但在一些站点稀疏的地方可能有的格点还没有附上值
//下面开始用格点插值格点
#region 跨一个格点补充缺数点
for (int j = 1; j < MY - 1; j++)
{
for (int i = 1; i < MX - 1; i++)
{
if(p1x1[i,j]==-999.99 &&
(p1x1[i+1,j]!=-999.9 || p1x1[i+1,j+1]!=-999.9 || p1x1[i+1,j-1]!=-999.9) &&
(p1x1[i-1,j]!=-999.9 || p1x1[i-1,j+1]!=-999.9 || p1x1[i-1,j-1]!=-999.9) &&
(p1x1[i,j+1]!=-999.9 || p1x1[i+1,j+1]!=-999.9 || p1x1[i-1,j+1]!=-999.9) &&
(p1x1[i,j-1]!=-999.9 || p1x1[i+1,j-1]!=-999.9 || p1x1[i-1,j-1]!=-999.9) &&
(p1x1[i+1,j+1]!=-999.9 || p1x1[i+1,j]!=-999.9 || p1x1[i,j+1]!=-999.9) &&
(p1x1[i-1,j-1]!=-999.9 || p1x1[i-1,j]!=-999.9 || p1x1[i,j-1]!=-999.9) &&
(p1x1[i+1,j-1]!=-999.9 || p1x1[i+1,j]!=-999.9 || p1x1[i,j-1]!=-999.9) &&
(p1x1[i-1,j+1]!=-999.9 || p1x1[i-1,j]!=-999.9 || p1x1[i,j+1]!=-999.9))
{
wt = Convert.ToSingle(0.0);r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for(int n=j-1;n<j+2;n++)
{
for(int m=i-1;m<i+2;n++)
{
if(p1x1[m,n]!=-999.9)
{
w=Convert.ToSingle(1.0/Convert.ToSingle((i-m)*(i-m)+(j-n)*(j-n)));
wt=wt+w;
r1x1=r1x1 +p1x1[m,n]*w;
}
}
}
p1x1[i,j]=r1x1/wt;
}
}
}
#endregion
#region 跨二个格点补充缺数点
for (int j = 2; j < MY - 2; j++)
{
for (int i = 2; i < MX - 2; i++)
{
if(p1x1[i,j]==-999.99 &&
(p1x1[i+2,j]!=-999.9 || p1x1[i+2,j+2]!=-999.9 || p1x1[i+2,j-2]!=-999.9) &&
(p1x1[i-2,j]!=-999.9 || p1x1[i-2,j+2]!=-999.9 || p1x1[i-2,j-2]!=-999.9) &&
(p1x1[i,j+2]!=-999.9 || p1x1[i+2,j+2]!=-999.9 || p1x1[i-2,j+2]!=-999.9) &&
(p1x1[i,j-2]!=-999.9 || p1x1[i+2,j-2]!=-999.9 || p1x1[i-2,j-2]!=-999.9) &&
(p1x1[i+2,j+2]!=-999.9 || p1x1[i+2,j]!=-999.9 || p1x1[i,j+2]!=-999.9) &&
(p1x1[i-2,j-2]!=-999.9 || p1x1[i-2,j]!=-999.9 || p1x1[i,j-2]!=-999.9) &&
(p1x1[i+2,j-2]!=-999.9 || p1x1[i+2,j]!=-999.9 || p1x1[i,j-2]!=-999.9) &&
(p1x1[i-2,j+2]!=-999.9 || p1x1[i-2,j]!=-999.9 || p1x1[i,j+2]!=-999.9))
{
wt = Convert.ToSingle(0.0); r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for(int n=j-2;n<j+3;n++)
{
for(int m=i-2;m<i+3;n++)
{
if(p1x1[m,n]!=-999.9)
{
w = Convert.ToSingle(1.0 / Convert.ToSingle((i - m) * (i - m) + (j - n) * (j - n)));
wt=wt+w;
r1x1=r1x1 +p1x1[m,n]*w;
}
}
}
p1x1[i,j]=r1x1/wt;
}
}
}
#endregion
#region 跨三个格点补充缺数点
for (int j =3; j < MY -3; j++)
{
for (int i =3; i < MX -3; i++)
{
if (p1x1[i, j] == -999.99 &&
(p1x1[i +3, j] != -999.9 || p1x1[i +3, j +3] != -999.9 || p1x1[i +3, j -3] != -999.9) &&
(p1x1[i -3, j] != -999.9 || p1x1[i -3, j +3] != -999.9 || p1x1[i -3, j -3] != -999.9) &&
(p1x1[i, j +3] != -999.9 || p1x1[i +3, j +3] != -999.9 || p1x1[i -3, j +3] != -999.9) &&
(p1x1[i, j -3] != -999.9 || p1x1[i +3, j -3] != -999.9 || p1x1[i -3, j -3] != -999.9) &&
(p1x1[i +3, j +3] != -999.9 || p1x1[i +3, j] != -999.9 || p1x1[i, j +3] != -999.9) &&
(p1x1[i -3, j -3] != -999.9 || p1x1[i -3, j] != -999.9 || p1x1[i, j -3] != -999.9) &&
(p1x1[i +3, j -3] != -999.9 || p1x1[i +3, j] != -999.9 || p1x1[i, j -3] != -999.9) &&
(p1x1[i -3, j +3] != -999.9 || p1x1[i -3, j] != -999.9 || p1x1[i, j +3] != -999.9))
{
wt = Convert.ToSingle(0.0); r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for (int n = j -3; n < j + 4; n++)
{
for (int m = i -3; m < i + 4; n++)
{
if (p1x1[m, n] != -999.9)
{
w = Convert.ToSingle(1.0 / Convert.ToSingle((i - m) * (i - m) + (j - n) * (j - n)));
wt = wt + w;
r1x1 = r1x1 + p1x1[m, n] * w;
}
}
}
p1x1[i, j] = r1x1 / wt;
}
}
}
#endregion
//再做一遍跨两个和一个格点补充
#region 跨二个格点补充缺数点
for (int j = 2; j < MY - 2; j++)
{
for (int i = 2; i < MX - 2; i++)
{
if (p1x1[i, j] == -999.99 &&
(p1x1[i + 2, j] != -999.9 || p1x1[i + 2, j + 2] != -999.9 || p1x1[i + 2, j - 2] != -999.9) &&
(p1x1[i - 2, j] != -999.9 || p1x1[i - 2, j + 2] != -999.9 || p1x1[i - 2, j - 2] != -999.9) &&
(p1x1[i, j + 2] != -999.9 || p1x1[i + 2, j + 2] != -999.9 || p1x1[i - 2, j + 2] != -999.9) &&
(p1x1[i, j - 2] != -999.9 || p1x1[i + 2, j - 2] != -999.9 || p1x1[i - 2, j - 2] != -999.9) &&
(p1x1[i + 2, j + 2] != -999.9 || p1x1[i + 2, j] != -999.9 || p1x1[i, j + 2] != -999.9) &&
(p1x1[i - 2, j - 2] != -999.9 || p1x1[i - 2, j] != -999.9 || p1x1[i, j - 2] != -999.9) &&
(p1x1[i + 2, j - 2] != -999.9 || p1x1[i + 2, j] != -999.9 || p1x1[i, j - 2] != -999.9) &&
(p1x1[i - 2, j + 2] != -999.9 || p1x1[i - 2, j] != -999.9 || p1x1[i, j + 2] != -999.9))
{
wt = Convert.ToSingle(0.0); r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for (int n = j - 2; n < j + 3; n++)
{
for (int m = i - 2; m < i + 3; n++)
{
if (p1x1[m, n] != -999.9)
{
w = Convert.ToSingle(1.0 / Convert.ToSingle((i - m) * (i - m) + (j - n) * (j - n)));
wt = wt + w;
r1x1 = r1x1 + p1x1[m, n] * w;
}
}
}
p1x1[i, j] = r1x1 / wt;
}
}
}
#endregion
#region 跨一个格点补充缺数点
for (int j = 1; j < MY - 1; j++)
{
for (int i = 1; i < MX - 1; i++)
{
if (p1x1[i, j] == -999.99 &&
(p1x1[i + 1, j] != -999.9 || p1x1[i + 1, j + 1] != -999.9 || p1x1[i + 1, j - 1] != -999.9) &&
(p1x1[i - 1, j] != -999.9 || p1x1[i - 1, j + 1] != -999.9 || p1x1[i - 1, j - 1] != -999.9) &&
(p1x1[i, j + 1] != -999.9 || p1x1[i + 1, j + 1] != -999.9 || p1x1[i - 1, j + 1] != -999.9) &&
(p1x1[i, j - 1] != -999.9 || p1x1[i + 1, j - 1] != -999.9 || p1x1[i - 1, j - 1] != -999.9) &&
(p1x1[i + 1, j + 1] != -999.9 || p1x1[i + 1, j] != -999.9 || p1x1[i, j + 1] != -999.9) &&
(p1x1[i - 1, j - 1] != -999.9 || p1x1[i - 1, j] != -999.9 || p1x1[i, j - 1] != -999.9) &&
(p1x1[i + 1, j - 1] != -999.9 || p1x1[i + 1, j] != -999.9 || p1x1[i, j - 1] != -999.9) &&
(p1x1[i - 1, j + 1] != -999.9 || p1x1[i - 1, j] != -999.9 || p1x1[i, j + 1] != -999.9))
{
wt = Convert.ToSingle(0.0); r1x1 = Convert.ToSingle(0.0); w = Convert.ToSingle(0.0);
for (int n = j - 1; n < j + 2; n++)
{
for (int m = i - 1; m < i + 2; n++)
{
if (p1x1[m, n] != -999.9)
{
w = Convert.ToSingle(1.0 / Convert.ToSingle((i - m) * (i - m) + (j - n) * (j - n)));
wt = wt + w;
r1x1 = r1x1 + p1x1[m, n] * w;
}
}
}
p1x1[i, j] = r1x1 / wt;
}
}
}
#endregion
//程序到这里就结束了,这样一方面可以避免格点缺值,也消除过于平滑看不到峰值和谷值得现象.
|
评分
-
查看全部评分
|