Example #1
0
        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);
        }
Example #2
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);
        }