RMT的公開資料,是從自由場(加速度感測器)取得,主要是用來計算地震當下的參數。從好幾次的觀察經驗得知,出震前1天到幾個小時,會有一些特殊的特徵波型,尤其是越大的地震會越明顯。目前中研院只用瞬間或很短的時間資料來計算,沒有用到震前幾小時的資料,因此可以研究一下如何利用這些資料來計算震前的現象。
這個簡單的java程式,從RMT網站抓取圖檔,以每日/每小時分目錄置放,估計一天約有4.7GB的資料量。這些圖檔未來可進行OCR辨識,將數值還原成文字資料,或是以其他圖訊辨識技術,計算震前的特徵。使用本程式前,須先安裝 Java SDK,使用javac編譯後,再用java來執行。程式會呼叫外部wget程式,因此亦須安裝 wget,Linux系統直接安裝即可,Windows系統可用GnuWin32的http://gnuwin32.sourceforge.net/packages/wget.htm,安裝後一樣要設定系統PATH才能被呼叫。為了準確地2秒抓一次圖,每2秒產生一個執行緒,每個抓圖執行緒應會在0.1秒內完成,如果失敗的話,圖檔的內容會不正常,便於瞭解錯誤狀況,若不需要可另加程式自動刪除。
import java.text.*; import java.util.*; import java.io.*;
public class RMT { public static void main(String[] args) { while (true) { try { downloadThread thread = new downloadThread(); thread.start(); Thread.sleep(2000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } } } }
class downloadThread extends Thread{ public void run(){ downloadRMT(); }
void downloadRMT() { Date now = new java.util.Date(); String dirTodayName = new SimpleDateFormat("yyyyMMdd").format(now); String dirHourName = new SimpleDateFormat("HH").format(now); String filename = new SimpleDateFormat("yyyyMMdd-HHmmss").format(now) + ".png"; String filepath = dirTodayName + "/" + dirHourName + "/" + filename;
File dirToday = new File(dirTodayName); if (!dirToday.exists()) { boolean success = dirToday.mkdir(); if (success) { System.out.printf("Successfully created new directory : %s%n", dirTodayName); } else { System.out.printf("Failed to create new directory: %s%n", dirTodayName); } }
File dirHour = new File(dirTodayName + "/" + dirHourName); if (!dirHour.exists()) { boolean success = dirHour.mkdir(); if (success) { System.out.printf("Successfully created new directory : %s%n", dirHourName); } else { System.out.printf("Failed to create new directory: %s%n", dirHourName); } }
try { Runtime rt = Runtime.getRuntime (); String command = "wget http://rmt.earth.sinica.edu.tw/rmt.png -O " + filepath; System.out.println (command); Process proc = rt.exec (command); int exitCode = proc.waitFor (); if (exitCode==0) { //System.out.println ("OK"); } else { System.out.println ("Fail : Code = " + exitCode); }
} catch (Exception e) { e.printStackTrace(); } } } |