NASA SDO Data

NASAは太陽の画像データを公開している。SDO(Solar Dynamics Observatory)というサイトで、膨大なデータを公開している。これらのデータはこの辺のパスを降りていくと見ることが出来る。

例えばこんな磁力線がバンバンな写真とか、ゾクゾクしてくるものがある。

この画像データを使って動画として見たくなる…という気持ちが働いて、対象のデータを指定するとある一定日時の分だけクロールしてくるのをgolangで作った。

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"regexp"
	"strings"
	"time"
)

const baseurl string = "https://sdo.gsfc.nasa.gov/assets/img/browse/"
// 保存先
const filepath string = "/tmp/img/"

// 取ってくるファイルサイズとデータ型
const targetimg string = "512_HMI171pfss.jpg"

// 何日分とってくるか
const daycount int = 100

// 開始日時
const startday string = "2018/02/01"

func saveImg(url string, filename string) {
	response, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()

	file, err := os.Create(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	io.Copy(file, response.Body)
}

func crawlurl(url string) {
	var client = http.Client{}
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}

	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

    // 対象のファイルがあるかチェック
	re := regexp.MustCompile("<a href=\"(.*?)_" + targetimg + "\".*?>")
	group := re.FindAllStringSubmatch(string(body), -1)
	for _, c := range group {
		// get target url
		fmt.Println(url + c[1] + "_" + targetimg)
		
		// save img to local
		go saveImg(url+c[1]+"_"+targetimg, filepath+"/"+strings.Replace(c[1], "_", "", 1)+".jpg")
		
		// 5 second delay
		time.Sleep(5 * time.Second)
	}
}

func main() {
	for i := 0; i < daycount; i++ {
		t, _ := time.Parse("2006/01/02", startday)
		t = t.AddDate(0, 0, i)
		crawlurl(baseurl + t.Format("2006/01/02/"))
	}
}

あまりバンバンcrawlすると迷惑になっちゃうと思うから、ちょっぴりdelayを入れておく。対象のファイルは毎日存在する訳でも決まった時間に出来るわけでも無さそうだから(ただ、ほぼ毎日8時間おき位で作られている)、directory indexから取ってくるのを見て、存在したら取ってくる感じで。画像の権利的なところはこちら。2048のサイズまで使える。ただ、大きいサイズはそれだけ容量を消費するのと動画に変換するときの負荷が高くなるから、とりあえず最小の512サイズで。golangでサラッとした処理を作るときの便利さはハンパない。

これでファイルを取得してきたら、avconvで動画に変換する。

# ファイルを連番に変更して
ls *.jpg | awk '{ printf "mv %s %03d.jpg\n", $0, NR }' | sh 
# 動画に変換
avconv  -r 10 -start_number 1 -i "%03d.jpg" solar.mp4

これで完了。mp4のファイルが出来上がる。こちらは2018年2月〜9月頭まで、約半年分のものを動画にした感じ。

Solar AIA 094/335/193

Solar AIA&HMIB


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください