#データをダウンロード、解凍 date<-"h2014" temp <- tempfile() download.file(paste0("http://www.data.jma.go.jp/svd/eqev/data/bulletin/data/hypo/",date,".zip"),temp) x<- readLines(unz(temp,date)) unlink(temp) #必要な項目を取り出し整形 #オリジンタイム #02-05 I4 西暦 オリジンタイムの西暦 #06-07 I2 月 オリジンタイムの月 #08-09 l2 日 オリジンタイムの日 #10-11 I2 時 オリジンタイムの時 #12-13 I2 分 オリジンタイムの分 #14-17 F4.2 秒 オリジンタイムの秒 time<-paste0(substr(x,2,5),"-",substr(x,6,7),"-",substr(x,8,9)," ",substr(x,10,11),":",substr(x,12,13),":",substr(x,14,15),".",substr(x,16,17)) #震央の緯度、震央の経度、震源の深さ(km) #震央の緯度 #22-24 I3 緯度(度) 震央の緯度(度) #25-28 F4.2 緯度(分) 震央の緯度(分) #震央の経度 #33-36 I4 経度(度) 震央の経度(度) #37-40 F4.2 経度(分) 震央の経度(分) #震源の深さ(km) #45-49 F5.2 深さ(km) 深さフリーの条件で計算した時の震源の深さ(km) #南緯、西経の場合も考慮に入れると latitude = as.numeric(paste0(substr(x,22,22),as.character(as.numeric(substr(x,23,24))+as.numeric(substr(x,25,26))/60+as.numeric(substr(x,27,28))/6000))) longitude = as.numeric(paste0(substr(x,33,33),as.character(as.numeric(substr(x,34,36))+as.numeric(substr(x,37,38))/60+as.numeric(substr(x,39,40))/6000))) depth<-as.numeric(substr(x,45,49))/100 #マグニチュード #53-54 F2.1 マグニチュード1 #気象庁マグニチュード、気象庁CMTのモーメントマグニチュードまたはUSGS等が計算した実体波マグニチュード #0未満の場合は以下のように表記する #-0.1: -1 -0.9: -9 -1.0: A0 #-1.9: A9 -2.0: B0 -3.0: C0 #最初に作成したコード・・遅い #mag<-NULL #system.time( #for (i in 1:length(x)){ #if (substr(x[i],53,53)=="-"){ #mag[i]=as.numeric(paste0("-0.",substr(x[i],54,54))) #}else if (substr(x[i],53,53)=="A"){ #mag[i]=as.numeric(paste0("-1.",substr(x[i],54,54))) #}else if (substr(x[i],53,53)=="B"){ #mag[i]=as.numeric(paste0("-2.",substr(x[i],54,54))) #}else if (substr(x[i],53,53)=="C"){ #mag[i]=as.numeric(paste0("-3.",substr(x[i],54,54))) #}else if (substr(x[i],53,53)==" "){ #mag[i]=NA #}else { #mag[i]=as.numeric(paste0(substr(x[i],53,53),".",substr(x[i],54,54))) #} #} #) #上のようにfor文を使うと遅いので以下のコードにした。 #system.time( mag<-as.numeric(gsub(" . ","NA", paste0(gsub("C", "-3", gsub("B", "-2", gsub("A", "-1", gsub("-", "-0",substr(x,53,53))))), ".",substr(x,54,54)))) #) #96 A1 震源決定フラグ #K: 気象庁震源 #S: 参考震源 #Kは決定精度が良いもので、防災機関へは原則としてこれのみを表示した分布図のみを提供しており、 #Sは決定精度が悪いもので、必要に応じて参考にするためのもの flag<-substr(x,96,96) #データフレーム作成 eq<-data.frame(time,longitude,latitude,depth,mag,flag) #データの確認 summary(eq) #マグニチュードのデータがあり、かつ日本周辺のデータのみ抽出 eqdata<-subset(eq,longitude>=119 & longitude<=155 & latitude>=19 & latitude<=51 & mag>=-4) #データの確認 head(eqdata) ; tail(eqdata) #保存する場合はコメントアウトを外す。 #save("eqdata", file=paste0("eqdata",date,".RData"))
|