周藍(lán)捷+方韓+李文惠
摘 要:文章是關(guān)于Python在地震監(jiān)測服務(wù)器環(huán)境中的應(yīng)用,使用Python及擴(kuò)展包進(jìn)行簡易烈度計地震監(jiān)測服務(wù)器運(yùn)維監(jiān)控、信息分析和發(fā)布。以常見的微信信息推送、延時統(tǒng)計、數(shù)據(jù)有效率統(tǒng)計、格式轉(zhuǎn)換及簡單數(shù)據(jù)分析過程提供了例程。
關(guān)鍵詞:Python;簡易烈度計;運(yùn)維監(jiān)控
中圖分類號:P315.73 文獻(xiàn)標(biāo)志碼:A 文章編號:2095-2945(2017)26-0151-02
1 概況
在福建省簡易烈度計地震預(yù)警項目實施中,廈門地震勘測研究中心承擔(dān)項目中簡易烈度計站點的勘選、安裝、組網(wǎng)建設(shè)等工作。在實施過程中,中心在Linux操作系統(tǒng)上,采用Earthworm技術(shù)系統(tǒng)搭建了簡易烈度計數(shù)據(jù)處理平臺。為了更好的監(jiān)控系統(tǒng)運(yùn)行狀態(tài),減輕值班人員工作量,采用Python語言編寫了系統(tǒng)運(yùn)行狀態(tài)監(jiān)控與信息發(fā)布程序。
Python是一門簡單易學(xué)且功能強(qiáng)大的編程語言。它由荷蘭人Guido van Rossum于1989年發(fā)明,第一個公開發(fā)行版發(fā)行于1991年。Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協(xié)議。它擁有高效的高級數(shù)據(jù)結(jié)構(gòu),并且能夠用簡單而又高效的方式進(jìn)行面向?qū)ο缶幊?。Python簡單易學(xué),并具有跨平臺特性,雖然運(yùn)行效率不高,但并不成為瓶頸,不影響系統(tǒng)表現(xiàn),但開發(fā)效率極高,能夠幫助運(yùn)維人員快速達(dá)成開發(fā)目標(biāo)。
在開發(fā)的過程中,主要使用了Python中的Numpy、Matplotlib、Bsemap和Obspy等擴(kuò)展包。
2 在烈度計系統(tǒng)運(yùn)維中的應(yīng)用
2.1 運(yùn)維信息使用微信企業(yè)號推送
#定制并獲取用戶關(guān)心的內(nèi)容content,通過企業(yè)號發(fā)送出去
#gettoken和senddata兩個函數(shù)內(nèi)容略,可直接復(fù)用
corpid = 'qiyehaoID'
corpsecret = 'qiyehaoMIYAO'
#獲取token
accesstoken = gettoken(corpid,corpsecret)
#系統(tǒng)通知相關(guān)變量
user = '1|2|21|zlj|35|36|37|62|63|64|zsp'
#給user發(fā)送
contents=getcontent()
senddata(accesstoken,user,contents)
2.2 烈度計數(shù)據(jù)處理
2.2.1 OBSPY.EARTHWORM.CLIENT應(yīng)用
#實時獲取Earthworm服務(wù)器中臺站數(shù)據(jù)當(dāng)前的延時
from obspy.clients.earthworm import Client
from obspy import UTCDateTime
clientZ = Client("10.35.176.14", 16022, timeout=5)
t = UTCDateTime()
print("Process started at:", t)
responses =clientZ.get_availability(network="FJ")
delays=()
for response in responses:
delays += (response[1],response[5],t-response[5])
print('site:',response[1],'last received:',response[5],'delay is:',float(t-response[5]))
delayinseconds=delays[2::3]
delaymax=max(delayinseconds)
delaymin=min(delayinseconds)
print('current time is',t,'.processed',len(delays)/3,'sites.')
print('max delay of above is:',delaymax,'and min is:',delaymin)
2.2.2 OBSPY-SCAN應(yīng)用
我們經(jīng)常會有一堆數(shù)據(jù),但是要處理的事件只是其中幾分鐘,我們想看看其中有哪些臺站是可以用的,或者,我們想知道這段時間整個臺網(wǎng)運(yùn)行的情況。ObsPy提供了obspy-scan腳本可供使用。它在文件頭中檢數(shù)據(jù)文件格式(支持MiniSEED、SAC、SACXY、GSE2、SH-ASC、SH-Q、SEISAN等等),通過計算,以紅色豎線繪制出斷記,以小叉表示數(shù)據(jù)起始點,將整個數(shù)據(jù)文件的有效性直觀的展現(xiàn)出來。這個腳本工具可以一次性掃描超過1000個文件(實際上已經(jīng)在超過30000個文件的序列中運(yùn)用過,計算持續(xù)時間45分鐘)。它能夠自動的將數(shù)據(jù)文件對應(yīng)的年份月份繪制出來。對于繪制結(jié)果,我們還可以對關(guān)心的片段進(jìn)行放大。
如下簡單的一個指令即可進(jìn)行數(shù)據(jù)文件掃描:
$obspy-scan /home/xmzk/357/*HLZ.mseed -o 357report.png
圖1 obspy-scan的結(jié)果
2.2.3 波形按震中距排序分布圖的繪制
以2016年10月31日16:26分廣東梅州3.6級地震事件中,福建省漳州市境內(nèi)128個簡易烈度計的數(shù)據(jù)記錄,做簡單的震中距排序分布圖為例:endprint
#在列表中查詢臺站經(jīng)緯度,計算震中距,0.1-10Hz帶通濾波,做震中距排序分布圖
#關(guān)鍵部分代碼
for sta in stas:
y,x=os.popen("grep "+sta+" /root/allstation | awk '{print $2,$3}'").read().split()
stZs.select(station=sta)[0].stats.stla=float(x)
stZs.select(station=sta)[0].stats.stlo=float(y)
for sts in stZs:
sts.stats.distance=gps2dist_azimuth(sts.stats.stla,sts.stats.stlo,eq_lat,eq_lon)[0]
Zstf=stZs.filter('bandpass',freqmin=0.1,freqmax=10)
Zstf.plot(type='section')
plt.savefig('/root/imgs/Z-section-'+et+'.png')
2.2.4 數(shù)據(jù)文件的抽取和格式的轉(zhuǎn)換
#對給定的miniseed文件,抽取指定時間的數(shù)據(jù)片段,并轉(zhuǎn)換為SAC格式
from obspy import read,Stream,UTCDateTime
import numpy as np
import os,datetime
pa=input("請輸入數(shù)據(jù)文件完整路徑,以'/'結(jié)束( eg. /home/xmzk/mseed/FJ/2016/305/,當(dāng)前目錄 ./ ):")
et=input("請輸入有效起始UTC時刻,格式Y(jié)YYYMMDD-HHMM( eg. 20161030-0826 ):")
drt=input("請輸入需要取出的時間長度,單位整數(shù)秒( eg. 300 ):")
dt=UTCDateTime(datetime.datetime.strptime(et,'%Y%m%d-%H%M'))
stZs=read(pa+"*HLZ*.mseed",starttime=dt,endtime=dt+int(drt)).merge().sort()
for sts in stZs:
if hasattr(sts.data,'mask'):
sts.data=sts.data.filled(0)
for sts in stZs:
sts.write('./'+sts.id+'.SAC',format='SAC')
3 小結(jié)與展望
采用Python語言及相應(yīng)的擴(kuò)展包能夠提高地震學(xué)項目的開發(fā)效率,能夠減少在計算機(jī)編程語言方面的學(xué)習(xí)時間,成倍的提升數(shù)據(jù)處理工作效率,能夠提供豐富的圖形可視化結(jié)果,具有光明的前景,是值得學(xué)習(xí)并使用的高級計算機(jī)語言之一。
參考文獻(xiàn):
[1]Python Tutorial.http://www.pythondoc.com/pythontutorial3/index.html.
[2]TIOBE.http://www.tiobe.com/.
[3]Numpy.http://www.numpy.org/.
[4]Matplotlib.http://matplotlib.org/.
[5]Basemap.http://matplotlib.org/basemap/.
[6]ObsPy Tutorial.http://docs.obspy.org/tutorial/.endprint