
簡介針對徠卡DNA03電子水準(zhǔn)儀在沉降觀測中的數(shù)據(jù)處理需求這份資源提供了一套完整的GSI源文件自動處理方案適合測量工程師、沉降監(jiān)測技術(shù)人員及工程測量學(xué)習(xí)者使用。壓縮包內(nèi)含3個文件以GSI數(shù)據(jù)文件、配套說明網(wǎng)頁和Excel手簿模板為主GSI文件用于存放水準(zhǔn)儀原始觀測數(shù)據(jù)htm文件提供操作說明xls文件則對應(yīng)一二等水準(zhǔn)觀測記錄格式便于直接套用。包體僅114KB輕量實(shí)用。目前已有1044人學(xué)習(xí)下載使用價值獲得一定認(rèn)可。通過該程序用戶可快速讀取并解析GSI數(shù)據(jù)自動計(jì)算沉降量并生成圖表報(bào)告大幅減少手動整理工作量同時支持?jǐn)?shù)據(jù)清洗、時間序列與空間分析等擴(kuò)展功能幫助提升沉降觀測的準(zhǔn)確性與效率。資源麻雀雖小卻覆蓋了從原始數(shù)據(jù)導(dǎo)入到報(bào)告輸出的關(guān)鍵環(huán)節(jié)對規(guī)范沉降觀測流程、開展長期變形監(jiān)測有直接幫助。 干精密水準(zhǔn)這行的多半見過徠卡DNA03導(dǎo)出的GSI源文件。一行的數(shù)據(jù)串里混著點(diǎn)名、尺讀數(shù)、距離和儀器信息乍看像亂碼但內(nèi)業(yè)處理全靠它。我最早動“GSI源文件自動處理”的念頭是因?yàn)橐惶硕人疁?zhǔn)外業(yè)只花了兩天回來整理高差和測段卻拖了三天實(shí)在熬不住才下定決心把所有重復(fù)勞動寫成腳本。這篇東西不教怎么架儀器而是聊怎么把DNA03導(dǎo)出的GSI文件包括常見的GSI-8和GSI-16兩種格式批量變成可以直接拿去平差或復(fù)核的成果表。適合三類人看經(jīng)常跑水準(zhǔn)的測量組長、負(fù)責(zé)內(nèi)業(yè)數(shù)據(jù)整理的助理工程師以及被一堆源文件搞到懷疑人生的學(xué)生。核心思想其實(shí)一句話GSI源文件不是設(shè)計(jì)給人肉眼看的是給程序交換數(shù)據(jù)用的所以我們也用程序把它讀回來順序不能反。很多人習(xí)慣先把儀器數(shù)據(jù)導(dǎo)成Excel或TXT再到表格里手工拆。這思路沒錯可一旦文件數(shù)量上了兩位數(shù)手工拆就會成為整個項(xiàng)目里最沒技術(shù)含量又最容易出錯的一環(huán)。后面我會把格式規(guī)則、腳本邏輯、踩坑經(jīng)驗(yàn)都寫出來腳本部分可以直接抄只需要根據(jù)你手上的數(shù)據(jù)特征改兩三個字段編號。1. 為什么我要跟GSI源文件較勁野外半小時內(nèi)業(yè)一整天1.1 兩種典型處理方式的分水嶺我見過不少作業(yè)隊(duì)的處理方式基本分成兩類。第一類是“儀器導(dǎo)出Excel輔助版”。外業(yè)跑完把DNA03里的數(shù)據(jù)用廠商軟件或自帶功能導(dǎo)成文本再進(jìn)Excel手工處理。單文件、幾十條記錄時這套流程完全夠用現(xiàn)場幾分鐘就能把高差和距離整理清楚。第二類就是直接跟GSI源文件死磕。等外業(yè)積累到幾十個文件、上千條觀測記錄或者碰到變形監(jiān)測這種需要反復(fù)對比測回?cái)?shù)據(jù)的情況手工處理就開始失控。兩類方式的真正分水嶺不在單條數(shù)據(jù)能不能看懂而在可復(fù)現(xiàn)性和效率。手工點(diǎn)Excel同一個文件換個同事整理結(jié)果經(jīng)常對不上腳本處理則保證同一條記錄在任何時候跑輸出都一樣。1.2 手工處理慢在哪、錯在哪手工處理GSI數(shù)據(jù)最常見的坑有三個。第一個是測站行錯位。一個測站通常包含后視和前視兩組讀數(shù)復(fù)制粘貼時只要漏掉一行后面整段數(shù)據(jù)全錯位而且這種錯位在Excel里不太容易被發(fā)現(xiàn)。第二個是尺讀數(shù)位數(shù)對錯。GSI數(shù)值常帶好幾位小數(shù)肉眼掃過很容易把0.00001米級別的尾數(shù)看漏。第三個是高差符號搞反。后視減前視還是前視減后視不同習(xí)慣的人處理同一份數(shù)據(jù)會得出完全相反的結(jié)果。我自己的實(shí)測數(shù)據(jù)里手工整理一個大約80個測站的文件通常要40分鐘到1小時期間還得反復(fù)對照原始記錄。腳本化以后同一個文件從讀取到生成CSV成果表基本1秒內(nèi)完成而且每一條高差都能追溯到原始行的行號復(fù)核時心里踏實(shí)很多。1.3 自動化帶來的不只是快真正有價值的不只是省時間而是可追溯。手工處理的成果表很難說清哪一行對應(yīng)儀器里的哪條原始記錄腳本處理則可以在輸出表里保留源文件路徑、原始行號、字段編號出問題隨時回去查。所以我建議所有經(jīng)常處理水準(zhǔn)數(shù)據(jù)的人都把這套流程沉淀成自己手邊的工具。哪怕腳本寫得粗糙也比每次都在Excel里重復(fù)勞動強(qiáng)。2. GSI格式的底層結(jié)構(gòu)讀懂塊號、字段與測量代碼2.1 先把GSI-8和GSI-16的區(qū)別搞清楚GSI是徠卡測量儀器常用的文本交換格式全稱是Geo Serial Interface。實(shí)際項(xiàng)目里最多見的是兩種子格式GSI-8和GSI-16。GSI-8的每個字段寬度是8個字符比較緊湊多見于老設(shè)備。GSI-16的每個字段寬度是16個字符精度更高DNA03導(dǎo)出時經(jīng)常使用。兩者在解析邏輯上沒有本質(zhì)區(qū)別都是“按空格切分詞條再按固定規(guī)則解讀每個詞條”只是數(shù)值的位數(shù)不同。一個典型的GSI-16數(shù)據(jù)行長這樣41000200000023 51100100000014行內(nèi)用空格分隔多個“詞條”每個詞條前半部分是兩位編碼后半部分是帶符號的數(shù)值。看著像亂碼其實(shí)規(guī)則非常機(jī)械。2.2 塊號與字段GSI的“數(shù)據(jù)字典”GSI文件的結(jié)構(gòu)可以拆成兩層塊號和字段編碼。塊號一般指一行的起始編碼用來標(biāo)識這條記錄屬于什么類型。常見的有11、21、31、41、51等分別對應(yīng)點(diǎn)名信息、測站信息、后視觀測、前視觀測、高差信息等。不同項(xiàng)目、不同儀器配置下這些編碼的含義可能有差異所以不要盲目照搬網(wǎng)上的字典拿到文件后先手工對照幾行確認(rèn)哪個塊號代表后視、哪個代表前視。字段編碼則是行內(nèi)每個詞條的含義標(biāo)識比如01代表點(diǎn)名、02代表距離、03代表尺讀數(shù)之類。這些編碼同樣需要以儀器手冊和實(shí)際數(shù)據(jù)為準(zhǔn)。我寫腳本時會把字段編號單獨(dú)做成一個配置字典不寫死在代碼里因?yàn)閾Q一個項(xiàng)目很可能就要調(diào)整。2.3 高差為什么常常需要自己算DNA03導(dǎo)出的GSI文件如果記錄的是原始尺讀數(shù)高差并不會直接給你需要后視讀數(shù)減前視讀數(shù)。有時候儀器配置會記錄“已計(jì)算高差”字段但高差的符號規(guī)則和作業(yè)習(xí)慣有關(guān)不統(tǒng)一。我遇到過不止一次同一份數(shù)據(jù)有人算出來的高差是正的有人是負(fù)的最后發(fā)現(xiàn)是后視和前視取反了。所以腳本里我一般固定用“后視讀數(shù)減前視讀數(shù)”的規(guī)則并把后視點(diǎn)號、前視點(diǎn)號一起輸出人工復(fù)核時一眼就能看出順序有沒有反。3. 自動處理方案怎么設(shè)計(jì)讀文件只是第一步3.1 工具選型Python為主VBA備用GSI文件自動處理的方案選擇基本繞不開這三個Python、Excel VBA、Power Query。我的建議很直接優(yōu)先用Python。它有成熟的正則、文本處理、CSV輸出能力批量掃描文件夾只需要幾行代碼而且結(jié)果可復(fù)現(xiàn)方便和同事共享。Excel VBA的優(yōu)點(diǎn)是不用裝額外環(huán)境但大批量文件處理時很慢代碼維護(hù)起來也容易混亂。對比項(xiàng)PythonExcel VBA手工Excel解析效率高中極低批量文件處理很好一般差上手門檻中等較低無門檻結(jié)果可追溯性高中低長期維護(hù)成本低高最高如果你手頭只有Excel環(huán)境那用VBA也能做但建議把“按行解析”和“生成成果”分開寫別把處理邏輯全塞進(jìn)一個宏里否則后面改格式會非常痛苦。3.2 解析流程串講不管用什么工具解析流程都是同一條鏈路按行讀取GSI文件去掉空行。從每行頭部截取塊號判斷這條記錄屬于哪一類。將行內(nèi)剩余部分按空格切分為多個詞條。根據(jù)字段編碼提取點(diǎn)名、后視讀數(shù)、前視讀數(shù)、距離等。按照“后視減前視”計(jì)算高差組織成一條觀測記錄。輸出CSV或直接生成平差軟件可用的數(shù)據(jù)格式。這個流程看起來簡單真正決定成敗的是第2步和第4步里的字段編號映射。我第一次寫解析腳本時想當(dāng)然地把所有行都當(dāng)成觀測行結(jié)果把儀器信息行也當(dāng)成高差記錄輸出結(jié)果慘不忍睹。后來改成先統(tǒng)計(jì)文件里所有出現(xiàn)的塊號和字段編號人工確認(rèn)后再映射就沒有再出過這種問題。3.3 多測段連續(xù)文件的切分策略一個GSI文件里經(jīng)常包含多個測段或者多條路線不能簡單地“一個文件 一個測段”。我常用的切分策略有三種按點(diǎn)名重新編號點(diǎn)名從某個起點(diǎn)重新開始增加說明進(jìn)入了新的測段。按測站信息行遇到新的測站信息記錄開啟新的測站上下文。按時間或測回標(biāo)識儀器配置里如果記錄了時間串或測回號直接作為分組字段。最可靠的是組合判斷比如“點(diǎn)名發(fā)生回退且出現(xiàn)新測站信息”時才認(rèn)為開啟新測段避免因?yàn)閭€別孤立點(diǎn)而誤切。腳本里把切分邏輯獨(dú)立成函數(shù)后邊接任何格式的輸出都方便。4. 可以直接抄的解析腳本Python批量處理GSI4.1 最小的解析函數(shù)下面這個函數(shù)是整套腳本的地基。它把GSI-16的一行文本解析成“塊號 字段字典”所有后續(xù)處理都基于這個結(jié)構(gòu)。import re from pathlib import Path import csv def parse_gsi_line(line: str): 解析單行GSI文本返回(塊號, 字段字典)。 line line.strip() if not line: return None parts line.split() block_code parts[0][:2] # 取行首兩位作為塊號 fields {} for part in parts: m re.match(r^(\d{2})([-])(\d)$, part) if m: field_id m.group(1) sign -1 if m.group(2) - else 1 value int(m.group(3)) * sign fields[field_id] value return block_code, fields這里有個細(xì)節(jié)GSI-16里數(shù)值的小數(shù)位是固定由儀器設(shè)置決定的解析出來是整數(shù)。你需要在配置里確認(rèn)“這個字段除以100000還是10000”才能還原成米。不同儀器的比例尺設(shè)置可能不同不能直接砍掉幾位小數(shù)。4.2 從行集合生成測段成果表拿到所有解析后的行接下來按塊號組織測站記錄。def parse_gsi_file(file_path: Path): 遍歷GSI文件所有行生成觀測記錄列表。 records [] with open(file_path, r, encodingutf-8, errorsignore) as f: for line_no, line in enumerate(f, start1): parsed parse_gsi_line(line) if not parsed: continue block_code, fields parsed # 假設(shè)31為后視行、41為前視行具體以儀器手冊為準(zhǔn) if block_code in (31, 41): record { line_no: line_no, type: bs if block_code 31 else fs, point: fields.get(01, ), dist: fields.get(02, 0), reading: fields.get(03, 0), } records.append(record) return records這只是中間結(jié)構(gòu)真正算高差需要把后視和前視按測站配對。配對策略取決于數(shù)據(jù)里后視、前視是否連續(xù)成對出現(xiàn)。我建議按“遇到后視開啟新測站遇到前視歸屬當(dāng)前測站”的方式處理比按行號硬配對更穩(wěn)健。4.3 批量處理與CSV匯總跑批量時我會用Path.glob掃描目錄下所有以.GSI結(jié)尾的文件逐個解析然后統(tǒng)一匯總。def batch_process(input_dir: Path, output_dir: Path): output_dir.mkdir(exist_okTrue) summary_rows [] for gsi_file in sorted(input_dir.glob(*.GSI)): recs parse_gsi_file(gsi_file) # 進(jìn)一步將recs按測站配對、計(jì)算高差寫成本文件對應(yīng)的_parsed.csv # ... summary_rows.append([gsi_file.name, len(recs)]) with open(output_dir / summary.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([file, record_count]) writer.writerows(summary_rows)注意CSV輸出用utf-8-sig編碼這樣Excel直接打開不會中文亂碼。還有一個很容易踩的坑寫CSV時如果不指定newlineWindows下會在每行后面多出一個空行平差軟件讀進(jìn)去會報(bào)錯。5. “GSI源文件打不開”的幾種真相先分清是工具問題還是格式問題5.1 從“無法打開源文件”這個熱搜說起最近老看到有人搜“c語言無法打開源文件怎么解決”。如果是寫C語言時編譯器報(bào)“No such file or directory”那通常是頭文件搜索路徑、源碼路徑或者工作目錄配置的問題和我們的測繪數(shù)據(jù)沒關(guān)系。但類似的說法在測繪圈里也有——“GSI源文件打不開”。我接過好幾個同事的求助最后發(fā)現(xiàn)文件本身沒壞只是他們用Excel直接雙擊打開看到一串串?dāng)?shù)字?jǐn)D在一列里就以為數(shù)據(jù)有問題。GSI源文件是純文本記事本、VS Code、Notepad都能打開。所謂“打不開”往往不是文件損壞而是“沒有用對工具去看它”。5.2 編碼、擴(kuò)展名和隱形字符GSI文件常見的編碼是ANSI或UTF-8。如果你用Excel打開后中文備注亂碼優(yōu)先做兩件事一是換用支持編碼切換的編輯器查看二是把文件改為UTF-8編碼后再用Excel導(dǎo)入。菜單里的“數(shù)據(jù)-從文本/CSV導(dǎo)入”也能指定編碼沒必要手動改文件。還有一個非常隱蔽的問題儀器導(dǎo)出的文件可能沒有.GSI擴(kuò)展名。很多同事拿到一個無擴(kuò)展名文件雙擊系統(tǒng)不知道用什么程序打開就以為文件廢了。實(shí)際上用文本編輯器打開看到里面是結(jié)構(gòu)化文本那它就是GSI格式腳本掃描時可以直接匹配文件名前綴或者用Path.rglob(*)遍歷所有文件再嘗試解析。隱形字符也值得留意。不同儀器導(dǎo)出的換行符可能是LF也可能是CRLF。解析腳本如果按嚴(yán)格的行尾匹配跨設(shè)備處理時會莫名丟行。我習(xí)慣在調(diào)試階段用repr(line)打印原始內(nèi)容先把可見空格和換行符看清再寫正式解析邏輯。6. 現(xiàn)場數(shù)據(jù)里踩過的坑測量代碼、高差閉合與重復(fù)觀測6.1 測量代碼不一致導(dǎo)致的“錯行”GSI文件的字段編號不是永恒不變的。不同作業(yè)員在儀器里自定義測量代碼后導(dǎo)出文件里部分字段的編碼會變特別是備注、屬性碼、點(diǎn)名這些跟測量代碼強(qiáng)相關(guān)的字段。我踩過一次很深的坑同一個項(xiàng)目里兩個作業(yè)員分別用默認(rèn)配置和自定義配置導(dǎo)數(shù)據(jù)結(jié)果腳本按固定編號提取后半段文件高差全錯了。后來我改了策略解析前先跑一個“字段普查”步驟統(tǒng)計(jì)當(dāng)前文件里出現(xiàn)過的所有塊號和字段編號輸出成清單人工確認(rèn)后再進(jìn)入正式解析。字段編號做成配置字典每次項(xiàng)目開始前確認(rèn)一次后面就不會再被“錯行”坑到。6.2 高差不閉合問題是儀器還是腳本腳本處理完數(shù)據(jù)后如果平差發(fā)現(xiàn)高差不閉合不要第一時間懷疑儀器。先用一個已知閉合差的測段做校驗(yàn)?zāi)肈NA03機(jī)內(nèi)計(jì)算的高差結(jié)果和腳本算出來的高差逐點(diǎn)對比。一旦出現(xiàn)系統(tǒng)性偏差大概率是兩種原因。第一種是后視和前視字段順序取反導(dǎo)致高差符號反了第二種是尺讀數(shù)的小數(shù)位處理錯誤導(dǎo)致數(shù)值整體差一個比例。判斷方法很簡單選一個高差已知為零的測站看腳本輸出是不是零如果差了一個倍數(shù)就是比例問題如果符號相反就是順序問題。6.3 多測回重復(fù)觀測去重與批次的取舍水準(zhǔn)測量常有往返測、多測回。GSI文件里同一個點(diǎn)可能會重復(fù)出現(xiàn)好幾次。有些人處理時喜歡在腳本里直接去重只保留第一次觀測但我不建議這么做。去重會丟失信息特別是一等、二等水準(zhǔn)需要按測回檢核的場合。我的做法是保留全部觀測記錄并在成果表里增加“批次號”和“測回號”字段。批次的劃分可以按點(diǎn)名回退、時間變化或文件分組來實(shí)現(xiàn)具體由平差軟件決定是否取均值而不是在源頭把數(shù)據(jù)刪掉。這樣既保留了原始觀測信息又不會因?yàn)橹貜?fù)計(jì)數(shù)導(dǎo)致平差出錯。另外一個小建議腳本跑完別急著刪中間文件。我會把每個GSI文件對應(yīng)的解析結(jié)果單獨(dú)存一份命名為“原文件名_parsed.csv”同時把當(dāng)次使用的字段編號配置也保存到項(xiàng)目目錄。半年后再回頭補(bǔ)數(shù)據(jù)你大概率已經(jīng)忘了當(dāng)時的字段對應(yīng)關(guān)系有配置文件和中間結(jié)果整個流程隨時可以復(fù)現(xiàn)不用重新摸索一遍。本文還有配套的精品資源點(diǎn)擊獲取