public bool Execute(IFeatureSet input, string zField, double cellSize, double power, int neighborType, int pointCount, double distance, IRaster output) { if (input == null || output == null) { return(false); } if (cellSize == 0) { cellSize = input.Extent.Width / 255; } int numColumns = Convert.ToInt32(Math.Round(input.Extent.Width / cellSize)); int numRows = Convert.ToInt32(Math.Round(input.Extent.Height / cellSize)); output = Raster.CreateRaster(output.Filename, string.Empty, numColumns, numRows, 1, typeof(double), new[] { string.Empty });//error output.CellHeight = cellSize; output.CellWidth = cellSize; output.Xllcenter = input.Extent.MinX + (cellSize / 2); output.Yllcenter = input.Extent.MinY + (cellSize / 2); progress.Maximum = numColumns * numRows; progress.Value = 0; #region 构建KD树 List <KD_Point> lists = new List <KD_Point>();//构建KD-Tree的点集列表 foreach (var p in input.Features) { KD_Point kd = new KD_Point(p.BasicGeometry.Coordinates[0].X, p.BasicGeometry.Coordinates[0].Y, Convert.ToDouble(p.DataRow[zField])); lists.Add(kd); } KDTree kDTree = new KDTree(); kDTree.CreateByPointList(lists); /* * double gdistance = input.Features[0].BasicGeometry.Coordinates[0].Distance(input.Features[1].BasicGeometry.Coordinates[0]); * double tdistance = Math.Sqrt(Math.Pow(input.Features[0].BasicGeometry.Coordinates[0].X- input.Features[1].BasicGeometry.Coordinates[0].X, 2) + Math.Pow(input.Features[0].BasicGeometry.Coordinates[0].Y- input.Features[1].BasicGeometry.Coordinates[0].Y, 2)); * Console.WriteLine("gdistance: " + gdistance + " , tdistance: " + tdistance); */ #endregion if (neighborType == 0)//固定数目 { for (int x = 0; x < numColumns; x++) { for (int y = 0; y < numRows; y++) { //IDW算法的分子和分母 double top = 0; double bottom = 0; if (pointCount > 0) { Coordinate coord = output.CellToProj(y, x); KD_Point kD_Point = new KD_Point(coord.X, coord.Y); List <KD_Point> points = kDTree.K_Nearest(kD_Point, pointCount); //Console.WriteLine("KDTree points count: " + points.Count); for (int i = 0; i < points.Count; i++) { if (points[i] != null) { Coordinate kd = new Coordinate(points[i].X, points[i].Y); double distanceToCell = kd.Distance(coord); if (distanceToCell <= distance || distance == 0) { //Console.WriteLine(points[i].Z); if (power == 2) { top += (1 / (distanceToCell * distanceToCell)) * points[i].Z; bottom += 1 / (distanceToCell * distanceToCell); } else { top += (1 / Math.Pow(distanceToCell, power)) * points[i].Z; bottom += 1 / Math.Pow(distanceToCell, power); } } } } } else { for (int i = 0; i < input.Features.Count; i++) { Coordinate cellCenter = output.CellToProj(y, x); //Coordinate coord = output.CellToProj(y, x); var featurePt = input.Features[i]; if (featurePt != null) { double distanceToCell = cellCenter.Distance(featurePt.BasicGeometry.Coordinates[0]); if (distanceToCell <= distance || distance == 0) { try { Convert.ToDouble(featurePt.DataRow[zField]); } catch { continue; } if (power == 2) { top += (1 / (distanceToCell * distanceToCell)) * Convert.ToDouble(featurePt.DataRow[zField]); bottom += 1 / (distanceToCell * distanceToCell); } else { top += (1 / Math.Pow(distanceToCell, power)) * Convert.ToDouble(featurePt.DataRow[zField]); bottom += 1 / Math.Pow(distanceToCell, power); } } } } } //Console.WriteLine("top: " + top + " , bottom: " +bottom); output.Value[y, x] = top / bottom; //Console.WriteLine(y + " , " + x + " : " + output.Value[y, x]); //richText.Text += output.Value[y, x] + "\n"; progress.Value++; } } } output.Save(); return(true); }
public bool ExecuteByParam(IFeatureSet input, string zField, double cellSize, string model, int neighborType, int pointCount, double distance, IRaster output, double c, double r) { if (input == null || output == null) { return(false); } if (cellSize == 0) { cellSize = input.Extent.Width / 255; } int numColumns = Convert.ToInt32(Math.Round(input.Extent.Width / cellSize)); int numRows = Convert.ToInt32(Math.Round(input.Extent.Height / cellSize)); progress.Maximum = numColumns * numRows; progress.Value = 0; output = Raster.CreateRaster(output.Filename, string.Empty, numColumns, numRows, 1, typeof(double), new[] { string.Empty });//error output.CellHeight = cellSize; output.CellWidth = cellSize; output.Xllcenter = input.Extent.MinX + (cellSize / 2); output.Yllcenter = input.Extent.MinY + (cellSize / 2); List <AltitudePoint> points = new List <AltitudePoint>(); if (neighborType == 0) { #region 构建KD树 List <KD_Point> lists = new List <KD_Point>();//构建KD-Tree的点集列表 foreach (var p in input.Features) { KD_Point kd = new KD_Point(p.BasicGeometry.Coordinates[0].X, p.BasicGeometry.Coordinates[0].Y, Convert.ToDouble(p.DataRow[zField])); lists.Add(kd); } KDTree kDTree = new KDTree(); kDTree.CreateByPointList(lists); #endregion if (pointCount > 0) { for (int i = 0; i < input.Features.Count; i++) { var featurePt = input.Features[i]; points.Add(new AltitudePoint(featurePt.BasicGeometry.Coordinates[0].X, featurePt.BasicGeometry.Coordinates[0].Y, Convert.ToDouble(featurePt.DataRow[zField]))); } ForRasterData forRasterData = new ForRasterData(points, model); for (int x = 0; x < numColumns; x++) { for (int y = 0; y < numRows; y++) { points.Clear(); Coordinate coord = output.CellToProj(y, x); KD_Point kD_Point = new KD_Point(coord.X, coord.Y); List <KD_Point> kdpoints = kDTree.K_Nearest(kD_Point, pointCount); foreach (var p in kdpoints) { points.Add(new AltitudePoint(p.X, p.Y, p.Z)); } forRasterData.ReSetPointList(points); if (!forRasterData.IsPointsOK()) { return(false); } output.Value[y, x] = forRasterData.GetValue(coord.X, coord.Y); progress.Value++; } } } else { for (int i = 0; i < input.Features.Count; i++) { var featurePt = input.Features[i]; points.Add(new AltitudePoint(featurePt.BasicGeometry.Coordinates[0].X, featurePt.BasicGeometry.Coordinates[0].Y, Convert.ToDouble(featurePt.DataRow[zField]))); } ForRasterData forRasterData = new ForRasterData(points, model, c, r); if (!forRasterData.IsPointsOK()) { return(false); } for (int x = 0; x < numColumns; x++) { for (int y = 0; y < numRows; y++) { Coordinate coordinate = output.CellToProj(y, x); output.Value[y, x] = forRasterData.GetValue(coordinate.X, coordinate.Y); progress.Value++; } } } } output.Save(); return(true); }