• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    Visual Basic語言在地震數(shù)據(jù)讀取與格式轉(zhuǎn)換中的應(yīng)用研究

    2022-03-05 06:42:22陳新黨
    資源信息與工程 2022年1期
    關(guān)鍵詞:數(shù)據(jù)文件字節(jié)間隔

    付 波, 陳新黨

    (江西省地質(zhì)調(diào)查勘查院,江西 南昌 330001)

    0 引言

    地震勘探作為一種地球物理方法,原始數(shù)據(jù)的重要性不言而喻。每個(gè)行業(yè)或多或少都有自己的行業(yè)標(biāo)準(zhǔn)和數(shù)據(jù)存儲標(biāo)準(zhǔn),現(xiàn)在一般的地震儀器野外數(shù)據(jù)采集大多數(shù)采用的數(shù)據(jù)存儲格式為行業(yè)中的標(biāo)準(zhǔn)格式,較為通用的是野外采集原始地震數(shù)據(jù)格式為SEG委員會提出的SEG-Y和SEG-D[1-4]。而在實(shí)際生產(chǎn)中,部分野外采集的原始地震數(shù)據(jù)與 SEG 協(xié)會相關(guān)標(biāo)準(zhǔn)存在著偏差,和標(biāo)準(zhǔn)原始地震數(shù)據(jù)有一定的差別。對于此類數(shù)據(jù),現(xiàn)有處理系統(tǒng)和解編專業(yè)軟件無法識別和讀取,給地震資料處理生產(chǎn)工作造成了極大的困難。

    對于每一種地球物理方法,原始數(shù)據(jù)是至關(guān)重要的,地震勘探也不例外。對原始數(shù)據(jù)進(jìn)行解編和轉(zhuǎn)儲是數(shù)據(jù)處理的前提,但是由于標(biāo)準(zhǔn)格式還沒有全面推廣,導(dǎo)致某些儀器所采集到的數(shù)據(jù)不是標(biāo)準(zhǔn)格式,使得解編存儲無法進(jìn)行,地震資料處理工作無法進(jìn)行。還有地震數(shù)據(jù)格式的行業(yè)標(biāo)準(zhǔn)大多是由國外的相關(guān)機(jī)構(gòu)和行業(yè)協(xié)會提出的,國內(nèi)使用的大部分地震資料處理軟件也是由國外軟件公司開發(fā)的。這種現(xiàn)狀導(dǎo)致國內(nèi)自主創(chuàng)新的方法和技術(shù)難于在實(shí)際數(shù)據(jù)處理方面運(yùn)用。因此,對于不是標(biāo)準(zhǔn)格式的數(shù)據(jù)文件的轉(zhuǎn)儲處理問題的研究很必要,本文主要研究關(guān)于非標(biāo)準(zhǔn)格式的數(shù)據(jù)文件轉(zhuǎn)為SEG委員會提取的標(biāo)準(zhǔn)格式SEGY的過程,通過Visual Basic語言來實(shí)現(xiàn)文件數(shù)據(jù)的讀入和寫出,在程序中加入了成圖程序,將每炮的數(shù)據(jù)成圖,用于驗(yàn)證數(shù)據(jù)讀入的正確性。

    1 SEGY標(biāo)準(zhǔn)格式說明

    最早的SEGY數(shù)據(jù)交換格式是在1975年出版的,在2002年修訂了一些條目。現(xiàn)在標(biāo)準(zhǔn)的SEGY格式主要由兩部分構(gòu)成,分別是文件頭和道記錄塊[1-4](圖1)。

    文件頭道頭1數(shù)據(jù)1道頭2數(shù)據(jù)2……

    其中,文件頭包含兩部分:前3 200個(gè)字節(jié)為ASCII 區(qū)域,包含40行原文信息,提供SEGY文件中地震數(shù)據(jù)的可讀性描述;后400個(gè)字節(jié)為二進(jìn)制數(shù)區(qū)域,在二進(jìn)制文件頭中的值定義為2字節(jié)或4字節(jié),兩者是等效的整數(shù),這些中包含了采樣間隔、道長和編碼格式的重要信息[4]。

    3 217~3 218字節(jié)-采樣間隔(μs)

    3 221~3 222字節(jié)-樣點(diǎn)數(shù)/每道(道長)

    3 225~3 226字節(jié)-數(shù)據(jù)采樣格式編碼。

    1=4字節(jié)IBM浮點(diǎn)數(shù)

    2=4字節(jié),兩互補(bǔ)整數(shù)

    3=2字節(jié),兩互補(bǔ)整數(shù)

    4=4字節(jié)帶增益定點(diǎn)數(shù)(過時(shí),不再使用)

    5=4字節(jié)IEEE浮點(diǎn)數(shù)

    6=現(xiàn)在沒有使用

    7=現(xiàn)在沒有使用

    8=1字節(jié),兩互補(bǔ)整數(shù)

    道記錄塊包含了道頭和數(shù)據(jù)塊,其擺列方式為一炮接著一炮,其中道頭有240個(gè)字節(jié)組成,緊接著是此道的數(shù)據(jù),每一道都有占240個(gè)字節(jié)的道頭。其中道頭包含的值有限并用來提供可能道間變化信息和處理、道識別的基本信息,在240個(gè)字節(jié)中采樣點(diǎn)、采樣間隔和炮號的記錄很重要。數(shù)據(jù)塊中每個(gè)樣點(diǎn)值為浮點(diǎn)型數(shù)據(jù),以二進(jìn)制方式存儲。

    9-12 原始的野外記錄號(炮號)

    115-116 本道的采樣點(diǎn)數(shù)

    117-118 本道的采樣間隔,以μs表示。

    2 VB實(shí)現(xiàn)

    2.1 格式轉(zhuǎn)換流程

    在有道頭和數(shù)據(jù)的文件下,通過Visual Basic程序,選取SEGY標(biāo)準(zhǔn)數(shù)據(jù)格式文件的文件頭和標(biāo)準(zhǔn)道頭,改變其中的道頭的炮號,文件頭中采樣間隔、采樣點(diǎn)和采樣長度等參數(shù);再讀取24道含有數(shù)據(jù)的文件,通過加載標(biāo)準(zhǔn)文件頭,每道數(shù)據(jù)加上道頭,這樣就成了標(biāo)準(zhǔn)的SEGY格式了。

    步驟:1.打開模型數(shù)據(jù)取卷頭道頭;2.dat文件轉(zhuǎn)為sgy;3.sgy文件改變炮號[5-6]。

    圖2 Visual Basic可視化界面

    2.2 文件頭和道頭的提取

    在Visual Basic界面運(yùn)行下先輸入樣點(diǎn)個(gè)數(shù),采樣間隔→再按打開模型數(shù)據(jù)取卷頭道頭。在模型數(shù)據(jù)文件目錄下就會生成卷頭文件juan和道頭文件dat。先定義一個(gè)動(dòng)態(tài)字節(jié)數(shù)組變量,在提取文件頭時(shí),就定為3 600個(gè)字節(jié)長度;在提取道頭時(shí)定為240個(gè)字節(jié)長度。改變其中的采樣間隔和道長參數(shù),分別放在兩個(gè)文件下,為后面數(shù)據(jù)轉(zhuǎn)換做準(zhǔn)備。程序如下:

    Private Sub juandaoClick()

    Dim char() As Byte ‘定義一維動(dòng)態(tài)字節(jié)數(shù)組用于存儲文件頭和道頭

    Dim yuan As String ‘標(biāo)準(zhǔn)的SEGY格式文件名變量

    Dim fen1 As String

    Dim fen2 As String

    Dim a As Integer

    Dim b As Integer

    ‘需要打開一個(gè)sgy的文件,在它的目錄下會生成卷頭文件juan和道頭文件dao,在用于轉(zhuǎn)換時(shí),需要將兩文件放入要特定的文件下

    CommonDialog1.Filter="所有文件 (*.*)|*.*|"& _

    "道號數(shù)據(jù)文件(*.sgy)|*.sgy"

    CommonDialog1.FilterIndex = 2

    CommonDialog1.ShowOpen

    yuan = CommonDialog1.FileName

    On Error Resume Next

    fen1 = Replace(yuan, "MdlReel", "juan")

    fen2 = Replace(yuan, "MdlReel", "dao")

    Open yuan For Binary As #1

    Open fen1 For Binary As #2

    Open fen2 For Binary As #3

    a = Text2.Text

    b = Text3.Text

    ‘從標(biāo)準(zhǔn)的SEGY文件中提取文件頭并更改其中的采樣間隔和道長

    ReDimchar(3 600 -1)

    For i = 0 To 3 599

    Get #1, i + 1, char(i)

    Next

    Put #2, , char()

    Put #2, 3217, b

    Put #2, 3221, a

    ‘從標(biāo)準(zhǔn)的SEGY文件中提取道頭并更改其中的采樣間隔和道長

    ReDimchar(240 -1)

    Get #1, 3601, char()

    Put #3, , char()

    End Sub

    2.3 文件頭、道頭和數(shù)據(jù)的合并與成圖

    在Visual Basic運(yùn)行下,輸入采樣點(diǎn)數(shù),再按dat-sgy,在原數(shù)據(jù)文件下就會生成后綴為sgy的文件,同時(shí)在Visual Basic窗口下會生成地震記錄的圖形。通過一個(gè)文件對話框,打開你想轉(zhuǎn)換格式的數(shù)據(jù)(dat后綴)。原數(shù)據(jù)可能占兩個(gè)字節(jié)或者四節(jié)。再通過讀入原先有的文件頭和道頭就可以變?yōu)闃?biāo)準(zhǔn)的SEGY格式了。程序如下:

    Private Sub dat_Click()

    Dim sh(1 To 3600) As Byte

    Dim ch(1 To 240) As Byte

    Dim char() As Byte

    Dim dao As String

    Dim zhong As String

    Dim juan As String

    Dim jian As String ‘作為存儲數(shù)據(jù)的文件變量

    Dim chong As String ‘作為存儲道頭和數(shù)據(jù)的文件變量

    CommonDialog1.Filter="所有文件(*.*)|*.*|"&_

    "道號數(shù)據(jù)文件(*.dat)|*.dat"

    CommonDialog1.FilterIndex = 2

    CommonDialog1.ShowOpen

    filena = CommonDialog1.FileName

    On Error Resume Next

    zhong = Replace(filena, "dat", "sgy")

    Label1 = zhong

    chong = "d:sychong.sgy"‘必須保證你你的卷頭道頭在d:sy的目錄之下(也可以將其改為其他路徑)

    dao = "d:sydao.sgy"

    jian = "d:syjian.sgy"

    juan = "d:syjuan.sgy"

    Open chong For Binary As #101

    Open dao For Binary As #42

    Open zhong For Binary As #40

    Open juan For Binary As #41

    Open jian For Binary As #100

    Open filena For Binary As #1

    Dim singl() As Single

    Dim inte() As Integer ‘(當(dāng)你的每個(gè)數(shù)據(jù)只占兩個(gè)字節(jié)使用)

    Dim a As Single

    Dim aa As Single

    a = Val(Text2.Text)

    ReDimsingl(1 To 24, 1 To a) As Single

    ReDiminte(1 To 24, 1 To a) As Integer ‘(當(dāng)你的每個(gè)數(shù)據(jù)只占兩個(gè)字節(jié)使用)

    ReDimchar(1 To 24, 1 To a * 4) As Byte

    Dim t As Byte

    If Val(Text4.Text) <> 4 Then

    ‘一個(gè)數(shù)據(jù)占二個(gè)字節(jié)使用

    For j = 1 To 24

    Seek #1, 241 + (a * 2 + 240) * (j - 1)

    For k = 1 To a

    Get #1, ,inte(j, k)

    singl(j, k) = inte(j, k)

    Put #100, (j - 1) * a * 4 + (k - 1) * 4 + 1, singl(j, k)

    For m = 1 To 4

    Get #100, (j - 1) * a * 4 + (k - 1) * 4 + m, char(j, (k - 1) * 4 + m)

    Next m

    Next k

    Next j

    Else

    ‘一個(gè)數(shù)據(jù)占四個(gè)字節(jié)使用

    For j = 1 To 24

    Seek #1, 241 + (a * 4 + 240) * (j - 1)

    For k = 1 To a

    Get #1, ,singl(j, k)

    Put #100, (j - 1) * a * 4 + (k - 1) * 4 + 1, singl(j, k)

    For m = 1 To 4

    Get #100, (j - 1) * a * 4 + (k - 1) * 4 + m, char(j, (k - 1) * 4 + m)

    Next m

    Next k

    Next j

    End If

    Dim g(1 To 24) As Single

    Dim w As Integer

    Dim h As Integer

    Dim aal As Integer

    Dim mm As Integer

    Dim delt As Integer

    mm = 1 * 2 ‘在vb中圖形的放大倍數(shù)

    delt = Text3.Text ‘采樣間隔

    Picture1.Cls

    Picture1.ScaleMode = 1

    Picture1.ScaleLeft = 0

    Picture1.ScaleTop = 0

    Picture1.ScaleWidth = Picture1.Width

    Picture1.ScaleHeight = Picture1.Height

    ‘ (數(shù)據(jù)均衡

    For il = 1 To 24

    aa1 = 1

    For ill = 1 To a

    If (Abs(singl(il, ill)) > aa1) Then

    aa1 = Abs(singl(il, ill))

    End If

    Next ill

    g(il) = ((Picture1.ScaleHeight - 10) / 24) / aa1

    Next il

    ‘?dāng)?shù)據(jù)均衡)

    h = (Picture1.ScaleWidth - 10) / 25

    w = (Picture1.ScaleHeight - 10) / a

    For ii = 1 To 24

    For ii1 = 1 To a

    If ((singl(ii, ii1)) > 0) Then

    Picture1.Line (10+ii*h,10+ii1*w)-(10+ii*h+singl(ii, ii1)*g(ii)*mm, 10+(ii1+1)*w),,BF

    Else

    Picture1.Line (10 + ii * h + singl(ii, ii1) * g(ii) * mm, 10 + ii1 * w)-(10 + ii * h + singl(ii, ii1 + 1) * g(ii) * mm, 10 + (ii1 + 1) * w), vbBlack

    End If

    Next ii1

    Next ii

    For j1 = 1 To 24

    Picture1.CurrentX = 5 + j1 * h

    Picture1.CurrentY = 5

    Picture1.Print j1

    Picture1.Line (10 + j1 * h, 10)-(10 + j1 * h, Picture1.ScaleHeight)

    Next j1

    For i = 1 To 11

    Picture1.Line (10, 10 + (i - 1) * w * 50)-(Picture1.ScaleWidth, 10 + (i - 1) * w * 50), vbGreen

    Picture1.CurrentX = 0

    Picture1.CurrentY = 10 + (i - 1) * w * 50

    Picture1.Print (i - 1) * delt * 50

    Next i

    ‘讀入道頭,循環(huán)分別放在101編號代表的文件中的特定位置并將以上的二維字節(jié)數(shù)組數(shù)據(jù)放入其特定位置,使之按道頭→第一道數(shù)據(jù)→道頭→第二道數(shù)據(jù)…順序存儲

    Get #42, ,ch()

    For ii = 1 To 24

    Seek #101, (4 * a + 240) * (ii - 1) + 1

    Put #101, ,ch()

    Next ii

    For m = 1 To 24

    For n = 1 To 4 * a

    Put #101, (4 * a + 240) * (m - 1) + n + 240, char(m, n)

    Next n

    Next m

    ‘讀入文件頭并將其放入zhong變量代表的文件中

    For m = 1 To 3600

    Get #41, m, sh(m)

    Next m

    Put #40, 1, sh()

    aa = 24 * (a * 4 + 240)

    ReDimchar(1 To aa)

    For i = 1 Toaa

    Get #101, i, char(i)

    Next i

    ‘將一維字節(jié)數(shù)組中的字節(jié)放入zhong變量代表的文件中

    Seek #40, 3601

    Put #40, , char()

    Close

    End Sub

    2.4 SGY改變炮號

    按要求輸入野外炮號標(biāo)記,在按sgy改變炮號。由于合并的sgy文件炮號沒有按實(shí)際給出,使得在后續(xù)處理時(shí)存在困難,所以通過改變sgy文件中特定字節(jié)代表炮號的值來達(dá)到目的。

    3 成果驗(yàn)證

    使用某地區(qū)的地震數(shù)據(jù),其源格式中樣點(diǎn)值占兩個(gè)字節(jié),文件結(jié)構(gòu)為以上程序所需的源格式。主要用于反射波地震勘探,圖3(a)是第一炮在vista軟件中所成的圖形,圖3(b)是使用Visual Basic界面識別讀取的數(shù)據(jù),可以看出vista和Visual Basic界面所成的圖形一樣,驗(yàn)證了程序轉(zhuǎn)換的正確性。

    4 結(jié)論

    通過對比某地區(qū)的某炮原始數(shù)據(jù)Visual Basic界面讀取成圖與vista軟件中所成的圖形,表明可以使用Visual Basic的可視化界面實(shí)現(xiàn)文件數(shù)據(jù)的讀入和寫出,并在程序中加入了成圖程序,將每炮的數(shù)據(jù)成圖,用于驗(yàn)證數(shù)據(jù)讀入的正確性,對于地震數(shù)據(jù)格式不匹配而需要轉(zhuǎn)換具有一定的參考意義。

    猜你喜歡
    數(shù)據(jù)文件字節(jié)間隔
    No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
    間隔問題
    No.10 “字節(jié)跳動(dòng)手機(jī)”要來了?
    間隔之謎
    數(shù)據(jù)文件恢復(fù)專題問答
    數(shù)據(jù)文件安全管控技術(shù)的研究與實(shí)現(xiàn)
    SQL數(shù)據(jù)文件恢復(fù)工具
    簡談MC7字節(jié)碼
    上樓梯的學(xué)問
    Tekla Structure數(shù)據(jù)文件交互格式分析
    汝州市| 北川| 松江区| 商都县| 东莞市| 紫金县| 鹤庆县| 南丰县| 桂平市| 阿瓦提县| 清河县| 新乐市| 苏尼特左旗| 子长县| 济源市| 水富县| 德昌县| 岐山县| 志丹县| 正安县| 石门县| 开江县| 汉川市| 武隆县| 仁化县| 恩施市| 揭西县| 青铜峡市| 罗江县| 大丰市| 米泉市| 梅州市| 莱西市| 沧源| 兴山县| 奉新县| 咸阳市| 临夏市| 绥宁县| 滨海县| 佛山市|