public GridToStation(string sta_File, string mic_File) { this.linear = true; stations = GetStations(sta_File); M4 m4 = M4.ReadMicaps4(mic_File); Interpolation(m4); }
public GridToStation(bool linear, M4 m4) { this.linear = linear; string filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"zdzstation.txt"); stations = GetStations(filename); Interpolation(m4); }
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); }
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]; } }
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); }