Beispiel #1
0
        public GridToStation(string sta_File, string mic_File)
        {
            this.linear = true;
            stations    = GetStations(sta_File);
            M4 m4 = M4.ReadMicaps4(mic_File);

            Interpolation(m4);
        }
Beispiel #2
0
        public GridToStation(bool linear, M4 m4)
        {
            this.linear = linear;
            string filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"zdzstation.txt");

            stations = GetStations(filename);
            Interpolation(m4);
        }
Beispiel #3
0
        public GridToStation(string mic_File)
        {
            this.linear = true;
            string filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"zdzstation.txt");

            stations = GetStations(filename);
            M4 m4 = M4.ReadMicaps4(mic_File);

            Interpolation(m4);
        }
Beispiel #4
0
        private void Interpolation(M4 m4)
        {
            double xi, yi, a, b, c, d, sum, x1val, x2val;
            int    xidx, yidx, i1, j1, i2, j2, n;

            double[] xarray = new double[m4.XSum];
            double[] yarray = new double[m4.YSum];

            double[] conc = new double[Stations.Count];

            for (int i = 0; i < m4.XSum; i++)
            {
                xarray[i] = m4.FJd + i * m4.XDelt;
            }
            for (int i = 0; i < m4.YSum; i++)
            {
                yarray[i] = (m4.YDelt > 0 ? m4.FWd : m4.EWd) + Math.Abs(i * m4.YDelt);
            }

            for (int i = 0; i < Stations.Count; i++)
            {
                conc[i] = mvalue;
                xi      = (Stations[i].jd - xarray[0]) / m4.XDelt + 1.0;
                yi      = (Stations[i].wd - yarray[0]) / Math.Abs(m4.YDelt) + 1.0;
                xidx    = fix(xi);
                yidx    = fix(yi);

                if (xidx >= 1 && xidx < m4.XSum && yidx >= 1 && yidx < m4.YSum)
                {
                    if (linear)
                    {
                        i1 = fix(yi);
                        j1 = fix(xi);
                        i2 = i1 + 1;
                        j2 = j1 + 1;
                        a  = m4.RDataValue[i1 - 1, j1 - 1];
                        b  = m4.RDataValue[i1 - 1, j2 - 1];
                        c  = m4.RDataValue[i2 - 1, j1 - 1];
                        d  = m4.RDataValue[i2 - 1, j2 - 1];

                        n   = 0;
                        sum = 0.0;
                        if (!DoubleEquals(a, mvalue))
                        {
                            sum = sum + a;
                            n   = n + 1;
                        }

                        if (!DoubleEquals(b, mvalue))
                        {
                            sum = sum + b;
                            n   = n + 1;
                        }

                        if (!DoubleEquals(c, mvalue))
                        {
                            sum = sum + c;
                            n   = n + 1;
                        }

                        if (!DoubleEquals(d, mvalue))
                        {
                            sum = sum + d;
                            n   = n + 1;
                        }

                        if (n == 0)
                        {
                            continue;// cycle
                        }
                        else if (n <= 3)
                        {
                            conc[i] = sum / n;
                        }
                        else
                        {
                            x1val   = a + (c - a) * (Stations[i].wd - yarray[i1 - 1]) / Math.Abs(m4.YDelt);
                            x2val   = b + (d - b) * (Stations[i].wd - yarray[i1 - 1]) / Math.Abs(m4.YDelt);
                            conc[i] = x1val + (x2val - x1val) * (Stations[i].jd - xarray[j1 - 1]) / m4.XDelt;
                        }
                    }
                    else
                    {
                        i1      = Convert.ToInt32(Math.Round(yi));
                        j1      = Convert.ToInt32(Math.Round(xi));
                        conc[i] = m4.RDataValue[i1 - 1, j1 - 1];
                    }
                }
                stations[i].svalue = conc[i];
            }
        }
Beispiel #5
0
        public static M4 ReadMicaps4(string filename)
        {
            M4 m4 = new M4();

            using (StreamReader sr = new StreamReader(filename, Encoding.Default))
            {
                string s = sr.ReadToEnd();

                string[] ss = s.Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                if (ss == null || ss.Length < 2 || (ss[0] != "micaps" && ss[1] != M4.style))
                {
                    return(m4);
                }
                if (ss.Length < 22)
                {
                    return(m4);
                }

                m4.Title    = ss[2];
                m4.Y        = ss[3];
                m4.M        = ss[4];
                m4.D        = ss[5];
                m4.H        = ss[6];
                m4.Fore     = ss[7];
                m4.Ceng     = ss[8];
                m4.XDelt    = double.Parse(ss[9]);
                m4.YDelt    = double.Parse(ss[10]);
                m4.FJd      = double.Parse(ss[11]);
                m4.EJd      = double.Parse(ss[12]);
                m4.FWd      = double.Parse(ss[13]);
                m4.EWd      = double.Parse(ss[14]);
                m4.XSum     = int.Parse(ss[15]);
                m4.YSum     = int.Parse(ss[16]);
                m4.Distance = double.Parse(ss[17]);
                m4.MinValue = double.Parse(ss[18]);
                m4.MaxValue = double.Parse(ss[19]);


                //m4.Def1 = int.Parse(ss[20]);
                //m4.Def1 = int.Parse(ss[21]);


                //double XDelt = 0;
                //double YDelt = 0;

                //---- Generate X and Y coordinates
                //_X = new double[m4.XSum];
                //_Y = new double[m4.YSum];

                //for (int i = 0; i < m4.XSum; i++)
                //{
                //    _X[i] = i * m4.XDelt;
                //}
                //for (int i = 0; i < m4.YSum; i++)
                //{
                //    _Y[i] = i * m4.YDelt;
                //}
                m4.RDataValue = new double[m4.YSum, m4.XSum];

                for (int i = 0; i < m4.YSum; i++)
                {
                    for (int j = 0; j < m4.XSum; j++)
                    {
                        m4.RDataValue[i, j] = m4.YDelt > 0 ? double.Parse(ss[22 + i * m4.XSum + j]) : double.Parse(ss[22 + (m4.YSum - 1 - i) * m4.XSum + j]);
                    }
                }
                m4.DataValue = new double[m4.YSum, m4.XSum];

                for (int i = 0; i < m4.YSum; i++)
                {
                    for (int j = 0; j < m4.XSum; j++)
                    {
                        m4.DataValue[i, j] = double.Parse(ss[22 + i * m4.XSum + j]);
                    }
                }
            }
            return(m4);
        }