- 积分
- 2455
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-8-5
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
王老师、各位好:
现在使用MeteoInfo做降雨量点的插值,目前有几个问题。
1、使用IDW_Radius做插值的时候,我们大概有50个点,如果有几个相邻的点降雨量为0,而其他离得较远的点降雨量在10-100,使用IDW_Radius插值,将Radius设为2,生成的grid中,几个降雨量为0的点之间的像素值还是会大于0。这个我用arcgis中的IDW工具生成对比了一下。arcgis中是可以将几个都是0的点之间插值成0的。不知道其他插值方式能不能做到。如下图:
与arcgis中IDW插值比较
2、插值半径设置为1,在插值边缘出现插值混乱的问题。由于我这边的点都在插值范围的左边,如果想使点的影响范围没有那么高,将插值半径Radius设置小一点,这样在半径的边缘就会出现插值混乱。本来没有点的地方,插值的时候在半径之外应该是UndefData值-9999,但是在半径和可以插值的交界处出现了离最近点越远插值越高的问题。如下图:
3、还有看到这个帖子说Cressman插值,http://bbs.06climate.com/forum.p ... page%3D1&page=1
我插值出来效果是这样的,是不是自己设置有问题啊?只有点上有插值。其他地方没有,而且没有平滑。
附自己插值代码:Cressman插值方法:如果有需要,可以上传一下雨量点的数据
double unDef = 0.001;
#region//Interpolate插值相关的
GridDataSetting aGDP = new GridDataSetting();
aGDP.DataExtent = GetExtent(clipLayer);//clipLayer是行政区图层
aGDP.XNum = 100;//格点点数80
aGDP.YNum = 100;//格点点数50
InterpolationSetting gridInterp = new InterpolationSetting();
gridInterp.GridDataSet = aGDP;
gridInterp.InterpolationMethod = InterpolationMethods.Cressman;
//插值半径
gridInterp.Radius = 2;
gridInterp.MinPointNum = 1;
List<double> radlist = new List<double>();
radlist.Add(30);
double[] X = new double[1];
double[] Y = new double[1];
ContourDraw.CreateGridXY(gridInterp.GridDataSet, ref X, ref Y);
double[,] S = stationData.Data;
S = ContourDraw.FilterDiscreteData_Radius(S, gridInterp.Radius,
gridInterp.GridDataSet.DataExtent, unDef);
GridData gridData = ContourDraw.InterpolateDiscreteData_Cressman(S,
X, Y, unDef, gridInterp.RadList);
#region//设置颜色
int totalcolor = 6;
List<Color> legendColor = new List<System.Drawing.Color>();
legendColor.Add(Color.FromArgb(100, 0, 0, 255));
legendColor.Add(Color.FromArgb(100, 201, 255, 177));
legendColor.Add(Color.FromArgb(100, 132, 251, 99));
legendColor.Add(Color.FromArgb(100, 206, 231, 253));
legendColor.Add(Color.FromArgb(100, 124, 188, 250));
legendColor.Add(Color.FromArgb(100, 244, 161, 203));
List<PointF> colorbreaks = new List<PointF>();
colorbreaks.Add(new PointF(0, 1));
colorbreaks.Add(new PointF(1, 10));
colorbreaks.Add(new PointF(10, 25));
colorbreaks.Add(new PointF(25, 50));
colorbreaks.Add(new PointF(50, 100));
colorbreaks.Add(new PointF(100, 9999));
#endregion
VectorLayer aLayer = new VectorLayer(ShapeTypes.Polygon);
aLayer = DrawMeteoData.CreateShadedLayer(gridData, aLS, "Rain", "Rain");
IDW_Radius插值方法:
double unDef = 0.001;
#region//Interpolate插值相关的
GridDataSetting aGDP = new GridDataSetting();
aGDP.DataExtent = GetExtent(clipLayer);
aGDP.XNum = 100;
aGDP.YNum = 100;
InterpolationSetting gridInterp = new InterpolationSetting();
gridInterp.GridDataSet = aGDP;
gridInterp.InterpolationMethod = InterpolationMethods.IDW_Radius;
//插值半径
gridInterp.Radius = 2;
gridInterp.MinPointNum = 1;
double[] X = new double[1];
double[] Y = new double[1];
ContourDraw.CreateGridXY(gridInterp.GridDataSet, ref X, ref Y);
double[,] S = stationData.Data;
S = ContourDraw.FilterDiscreteData_Radius(S, gridInterp.Radius,
gridInterp.GridDataSet.DataExtent, unDef);
GridData gridData = ContourDraw.InterpolateDiscreteData_Radius(S,
X, Y, gridInterp.MinPointNum, gridInterp.Radius, unDef);
|
|