気象庁 潮位データを取込、表示する関数。

http://www.data.jma.go.jp/kaiyou/db/tide/suisan/suisan.php?stn=NH 気象庁HPより南西諸島 那覇のデータ  ※各地域のデータがダウンロードできます。

テキストデータ版(50KB)をダウンロードします。

◎ テキストファイルの改行コードは「LF」です。
◎ テキストファイルのフォーマットは以下のようになっています。

毎時潮位 年月日 地点記号 (満潮時刻・潮位)×4 (干潮時刻・潮位)×4
毎時潮位データ 時分 潮位 … 時分 潮位 時分 潮位 … 時分 潮位
91 71 …134123 16 1 1 TK 913 167 … 9999 999 241 56 … 9999 999

 毎時潮位データ :  1~ 72カラム  3桁×24時間(0時から23時)
 年月日 : 73~ 78カラム  2桁×3
 地点記号 : 79~ 80カラム  2桁英数字記号
 満潮時刻・潮位 : 81~108カラム  時刻4桁(時分)、潮位3桁(cm)
 干潮時刻・潮位 : 109~136カラム  時刻4桁(時分)、潮位3桁(cm)
 ※ 満(干)潮が予測されない場合、満(干)潮時刻を「9999」、潮位を「999」としています。

 地点記号については「潮位表掲載地点一覧表(2018年)」をご覧下さい。

 なお、上記の例から読み取ると、

 東京の2018年1月1日
 毎時潮位 0時 41cm、1時 81cm … 22時 -8cm、23時 -13cm
 満潮時刻  4時48分、潮位 187cm …
 干潮時刻 10時16分、潮位  99cm …

 東京の2016年1月1日
 毎時潮位 0時 91cm、1時 71cm … 22時 134cm、23時 123cm
 満潮時刻 9時13分、潮位 167cm …
 干潮時刻 2時41分、潮位  56cm …

 

データのフォーマットは上記のようになっています。

 

 

これをC#で作成したプログラムに取込、表示してみましょう。

 

使用されているVBStrings関数は下記のHPを参考にしています。

http://jeanne.wankuma.com/tips/csharp/string/leftb.html

 

※有用なのはTextRead()だけかもしれませんね。

 

/***************ソース C#*************/

 

//毎時潮位データ :  1~ 72カラム  3桁×24時間(0時から23時)

string[,] tyoi = new string[400, 25];//24時間データ×1年分

private void  TimedataRead(string data, int idx)
{
         int k = 1;
         for (int i = 0; i < 24; i++)
        {
                tyoi[idx, i] = VBStrings.Mid(data, k, 3);
                k = k + 3;
        }
}

 

 

潮汐情報として配列の潮汐情報に取り込みます。

string Mes = “”;
int 日数;
string[,]  潮汐情報 = new string[400, 18];

private void TextRead()
{
        string line;
        string buf;

        // Read the file and display it line by line.

        System.IO.StreamReader file = new System.IO.StreamReader(@”.\NH.txt”);
        int i = 0;

        while ((line = file.ReadLine()) != null)
        {

                //年月日 : 73~ 78カラム  2桁×3
                 buf = VBStrings.Mid(line, 73, 6);
                 string yy = buf;// DateTime.Today.ToString(“yyMMdd”);
                 char[] dd = { yy[0], yy[1], ‘/’, yy[2], yy[3], ‘/’, yy[4], yy[5] };
                 string dt = new string(dd);

                 dt = “20” + dt; // 2099年まで有効 2100年以降は”21”とする
                 潮汐情報[i, 0] = dt;//西暦yyyy表示
                 TimedataRead(line, i);
                  tyoi[i, 24] = dt;//西暦yyyy表示

                  if (DateTime.Parse(dt) >= DateTime.Today)
                  {
                              string man = VBStrings.Mid(line, 81, 4);//満潮時刻・潮位データ 81~108カラム  時刻4桁(時分)、潮位3桁(cm)
                              string bb = VBStrings.Left(man, 2);
                              string cc = VBStrings.Right(man, 2);
                              潮汐情報[i, 1] = man = bb + “:” + cc;
                              潮汐情報[i, 2] = VBStrings.Mid(line, 85, 3);
                              string man1 = VBStrings.Mid(line, 88, 4);
                              bb = VBStrings.Left(man1, 2);
                              cc = VBStrings.Right(man1, 2);
                              潮汐情報[i, 3] = man1 = bb + “:” + cc;//時刻 hh:mm 4桁(時:分)
                              潮汐情報[i, 4] = VBStrings.Mid(line, 92, 3);//潮位3桁(cm)
                              string man2 = VBStrings.Mid(line, 95, 4);
                              bb = VBStrings.Left(man2, 2);
                              cc = VBStrings.Right(man2, 2);
                              潮汐情報[i, 5] = man2 = bb + “:” + cc;
                              潮汐情報[i, 6] = VBStrings.Mid(line, 99, 3);
                              string man3 = VBStrings.Mid(line, 102, 4);
                              bb = VBStrings.Left(man3, 2);
                              cc = VBStrings.Right(man3, 2);
                              潮汐情報[i, 7] = man3 = bb + “:” + cc;
                              潮汐情報[i, 8] = VBStrings.Mid(line, 106, 3);
                              string kan = VBStrings.Mid(line, 109, 4);//干潮時刻・潮位データ 109~136カラム  時刻4桁(時分)、潮位3桁(cm)
                              bb = VBStrings.Left(kan, 2);
                              cc = VBStrings.Right(kan, 2);
                              潮汐情報[i, 9] = kan = bb + “:” + cc;
                              潮汐情報[i, 10] = VBStrings.Mid(line, 113, 3);
                              string kan1 = VBStrings.Mid(line, 116, 4);
                              bb = VBStrings.Left(kan1, 2);
                              cc = VBStrings.Right(kan1, 2);
                              潮汐情報[i, 11] = kan1 = bb + “:” + cc;
                              潮汐情報[i, 12] = VBStrings.Mid(line, 120, 3);
                              string kan2 = VBStrings.Mid(line, 123, 4);
                              bb = VBStrings.Left(kan2, 2);
                              cc = VBStrings.Right(kan2, 2);
                              潮汐情報[i, 13] = kan2 = bb + “:” + cc;
                              潮汐情報[i, 14] = VBStrings.Mid(line, 127, 3);
                              string kan3 = VBStrings.Mid(line, 130, 4);
                              bb = VBStrings.Left(kan3, 2);
                              cc = VBStrings.Right(kan3, 2);
                              潮汐情報[i, 15] = kan3 = bb + “:” + cc;
                              潮汐情報[i, 16] = VBStrings.Mid(line, 134, 3);

                              i++;
                   }
        }
       日数 = i;
       file.Close();

}

 

// 潮位を表示する
private void 潮汐dsp(string dd)
{

 m_dt2.Rows.Clear();
 int s = 0;
 int cnt = 0;
 for (int i = 0; i < 400; i++)
{
  string dd1 = DateTime.Parse(dd).ToString(“yyyy/”) + DateTime.Parse(dd).ToString(“MM/dd”).Replace(“0″, ” “);
  string dd2 = tyoi[i, 24];
  if (dd1 == dd2)
  {
     cnt++;
     Set潮位表(i);
     s = i;
     break;
  }

 }
 if (cnt == 0) return;
 int y = 0;
 for (int t = 0; t < 船数; t++)
{
  if (船No.Text == 船情報[t, 0])//.IndexOf(検索名.Text))
  {
    if (船情報[t, 16] == “”) 船情報[t, 16] = “0”;
    y = int.Parse(船情報[t, 16]);//return 船情報[i, 2];
    shellH.Text = 船情報[t, 15];
    潮位.Text = 船情報[t, 16];
    break;
  }
}
for (int r = 0; r < 24; r++)
{
  int x = int.Parse(tyoi[s, r]);
  if (x < y) 潮位表[r + 1, 0].Style.BackColor = Color.Pink;
}

}
// 潮位表というdataGridViewコントロールをFormにあらかじめ配置しておく名称は任意です。
private void Set潮位表(int i)
{
  int t = 0;
  int ans = 0;
  for (t = 0; t < 船数; t++)
  {
     if (船No.Text == 船情報[t, 0])//.IndexOf(検索名.Text))
     {
        if (船情報[t, 16] == “”) 船情報[t, 16] = “0”;
        ans = int.Parse(船情報[t, 16]);
        break;
     }
  }
  潮位表DataSet.Tables[“潮位表DataTable”].Rows.Add(
  tyoi[i, 24],
  tyoi[i, 0],//0 
  tyoi[i, 1],//1 
  tyoi[i, 2],//3  
  tyoi[i, 3],//3  
  tyoi[i, 4],//5 
  tyoi[i, 5],//7  
  tyoi[i, 6],//7  
  tyoi[i, 7],//9 
  tyoi[i, 8],//10 
  tyoi[i, 9],//11  
  tyoi[i, 10],//12 
  tyoi[i, 11],//13 
  tyoi[i, 12],//14 
  tyoi[i, 13],//15 
  tyoi[i, 14],//16 
  tyoi[i, 15],//17 
  tyoi[i, 16],//18 
  tyoi[i, 17],//19 
  tyoi[i, 18],//20
  tyoi[i, 19],//21
  tyoi[i, 20],//22
  tyoi[i, 21],//20
  tyoi[i, 22],//21
  tyoi[i, 23]//22
  );//
  for (int r = 1; r < 25; r++)
  {
    潮位表.Columns[r].HeaderCell.Style.BackColor = Color.White;
  }

  潮位表.EnableHeadersVisualStyles = false;

  string s = VBStrings.Left(潮汐情報[i, 1], 2);
  int s1 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 3], 2);
  int s2 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 5], 2);
  int s3 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 7], 2);
  int s4 = int.Parse(s);

  if (s1 != 99) 潮位表.Columns[s1 + 1].HeaderCell.Style.BackColor = Color.Cyan;
  if (s2 != 99) 潮位表.Columns[s2 + 1].HeaderCell.Style.BackColor = Color.Cyan;
  if (s3 != 99) 潮位表.Columns[s3 + 1].HeaderCell.Style.BackColor = Color.Cyan;
  if (s4 != 99) 潮位表.Columns[s4 + 1].HeaderCell.Style.BackColor = Color.Cyan;

  s = VBStrings.Left(潮汐情報[i, 9], 2);
  int s5 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 11], 2);
  int s6 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 13], 2);
  int s7 = int.Parse(s);
  s = VBStrings.Left(潮汐情報[i, 15], 2);
  int s8 = int.Parse(s);

  if (s5 != 99) 潮位表.Columns[s5 + 1].HeaderCell.Style.BackColor = Color.GreenYellow;
  if (s6 != 99) 潮位表.Columns[s6 + 1].HeaderCell.Style.BackColor = Color.GreenYellow;
  if (s7 != 99) 潮位表.Columns[s7 + 1].HeaderCell.Style.BackColor = Color.GreenYellow;
  if (s8 != 99) 潮位表.Columns[s8 + 1].HeaderCell.Style.BackColor = Color.GreenYellow;
}
DataTable m_dt2;
private DataSet 潮位表DataSet;

private void Set潮位表()
{
潮位表DataSet = new DataSet();
潮位表DataSet.Tables.Add(“潮位表DataTable”);
DataTable dt = 潮位表DataSet.Tables[“潮位表DataTable”];

潮位表.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

dt.Columns.Add(“日付”, Type.GetType(“System.String”));//0
dt.Columns.Add(“0時”, Type.GetType(“System.String”));//1
dt.Columns.Add(“1時”, Type.GetType(“System.String”));//2
dt.Columns.Add(“2時”, Type.GetType(“System.String”));//3
dt.Columns.Add(“3時”, Type.GetType(“System.String”));//4
dt.Columns.Add(“4時”, Type.GetType(“System.String”));//5
dt.Columns.Add(“5時”, Type.GetType(“System.String”));//6
dt.Columns.Add(“6時”, Type.GetType(“System.String”));//7
dt.Columns.Add(“7時”, Type.GetType(“System.String”));//8
dt.Columns.Add(“8時”, Type.GetType(“System.String”));//9
dt.Columns.Add(“9時”, Type.GetType(“System.String”));//10
dt.Columns.Add(“10時”, Type.GetType(“System.String”));//11
dt.Columns.Add(“11時”, Type.GetType(“System.String”));//12
dt.Columns.Add(“12時”, Type.GetType(“System.String”));//13
dt.Columns.Add(“13時”, Type.GetType(“System.String”));//14
dt.Columns.Add(“14時”, Type.GetType(“System.String”));//15
dt.Columns.Add(“15時”, Type.GetType(“System.String”));//16
dt.Columns.Add(“16時”, Type.GetType(“System.String”));//17
dt.Columns.Add(“17時”, Type.GetType(“System.String”));//18
dt.Columns.Add(“18時”, Type.GetType(“System.String”));//19
dt.Columns.Add(“19時”, Type.GetType(“System.String”));//20
dt.Columns.Add(“20時”, Type.GetType(“System.String”));//21
dt.Columns.Add(“21時”, Type.GetType(“System.String”));//22
dt.Columns.Add(“22時”, Type.GetType(“System.String”));//21
dt.Columns.Add(“23時”, Type.GetType(“System.String”));//22

潮位表.AllowUserToAddRows = false;//新規行非表示
潮位表.AlternatingRowsDefaultCellStyle.BackColor = Color.Azure;
潮位表.DataSource = 潮位表DataSet.Tables[“潮位表DataTable”];
潮位表.RowHeadersVisible = false;
m_dt2 = dt;

for (int i = 0; i < 25; i++)
{
潮位表.Columns[i].Width = 42;//班id

}

潮位表.Columns[0].Width = 100;
潮位表.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

}

 

 

 

 

C#, 全般 / by

投稿者: jj