static void 读取当前行及值fitting(Dataset inds, int line) { double[] values = new double[inds.RasterXSize]; inds.GetRasterBand(1).ReadRaster(0, line, inds.RasterXSize, 1, values, inds.RasterXSize, 1, 0, 0); if (Array.IndexOf(values, 9999) < 0) { return; } int a = Array.IndexOf(values, 9999) - 5 < 0 ? 0 : Array.IndexOf(values, 9999) - 5; int b = Array.LastIndexOf(values, 9999) + 5 > inds.RasterXSize ? inds.RasterXSize : Array.LastIndexOf(values, 9999) + 5; List <double> xArray = new List <double>(); List <double> valArry = new List <double>(); for (int i = a; i < b; i++) { if (values[i] != 9999) { xArray.Add(i); valArry.Add(values[i]); } } double[] fitting = StaticTools.MultiLine(xArray.ToArray(), valArry.ToArray(), xArray.Count, 3); for (int i = 0; i < values.Length; i++) { if (values[i] == 9999) { values[i] = fitting[0] + fitting[1] * i + fitting[2] * i * i + fitting[3] * i * i * i; } } inds.GetRasterBand(1).WriteRaster(0, line, inds.RasterXSize, 1, values, inds.RasterXSize, 1, 0, 0); }
public static Geometry _提取断平拟合直线(Feature aFeature, List <int> cutIDS, List <int> straightIDS) { //临时坐标集 List <double> xArray = new List <double>(); List <double> yArray = new List <double>(); //Feature起点两则点的坐标集 List <double> xArray1 = new List <double>(); List <double> yArray1 = new List <double>(); //原数据 Geometry subGeom = aFeature.GetGeometryRef().GetGeometryRef(0); //通过线段拟合出的直线参数,返回用 List <double[]> _直线集 = new List <double[]>(); //平角点的个数 int pjPoint = straightIDS.Count; //断点计数器 int k = 1; for (int i = 0; i < pjPoint; i++) { //当平角点在第一个断点之前或在最后一个断点之后时,把点坐标值添加到指定数组中 if (straightIDS[i] <= cutIDS[0] || straightIDS[i] >= cutIDS[cutIDS.Count - 1])//85 82 会直接跳到else 使增加空值!!!!! { xArray1.Add(subGeom.GetX(straightIDS[i])); yArray1.Add(subGeom.GetY(straightIDS[i])); } //当平角点小于当前(不是第一个)断点时,添加到数组中 else if (straightIDS[i] < cutIDS[k]) { xArray.Add(subGeom.GetX(straightIDS[i])); yArray.Add(subGeom.GetY(straightIDS[i])); } //当平角点ID超过当前断点ID时,把点集中的点拟合直线。清空数据。断点ID+1 else { if (xArray.Count > 5) { _直线集.Add(StaticTools.MultiLine(xArray.ToArray(), yArray.ToArray(), xArray.Count, 1)); } xArray.Clear(); yArray.Clear(); xArray.Add(subGeom.GetX(straightIDS[i])); yArray.Add(subGeom.GetY(straightIDS[i])); k++; } } if (xArray.Count > 5) { _直线集.Add(StaticTools.MultiLine(xArray.ToArray(), yArray.ToArray(), xArray.Count, 1)); } if (xArray1.Count > 5) { _直线集.Add(StaticTools.MultiLine(xArray1.ToArray(), yArray1.ToArray(), xArray1.Count, 1)); } /****** 完成拆分、拟合 ↓↓↓求交↓↓↓ ******/ Geometry res = new Geometry(wkbGeometryType.wkbLinearRing); int LC = _直线集.Count; for (int i = 0; i < LC; i++) { int b = i == (LC - 1) ? 0 : (i + 1); double X = StaticTools.jiaodian(_直线集[i], _直线集[b]).Item1; double Y = StaticTools.jiaodian(_直线集[i], _直线集[b]).Item2; res.AddPoint(X, Y, 0); } return(res); }