1 算法
算法来自于GEMLink 5.2的帮助文档,这个文档基本解决了算法问题。
GemLink日变改正模块界面
1.1 概述
日变改正模块旨在执行磁力日变数据计算,而不用在仪器上进行日变(仪器是未经过校正的原始数据)。这个模块要求已经保存了Base和Rover文件,结果将另存为另外的文件,其中包含Rover文件的所有信息,以及附加在该行末尾的校正磁场值。
1.2 文件格式:
文件必须是ASCII文本文件。每行文本的末尾必须有一个CR(回车)或CRLF(回车/换行)。仅以LF终止的行不能使用,因为它们被视为一行。
字段或列之间的默认分隔符是SPACE。可以从“文件菜单”下的“字段分隔符”菜单中选择不同的分隔符。这个设置是临时的,每次GEMLinkW打开时,空格都是默认的分隔符。
注意,Base和Rover文件必须具有相同的分隔符。如果选择了不正确的分隔符,系统可能会产生意想不到的结果或错误。
1.3 时间戳:
自从GEMlinkW 2.4发布以来,日变改正模块在时间戳格式方面提供了更大的灵活性。Base和Rover文件接受以下24小时的时间戳格式:
- HHMMSS;
- HHMMSS.s;
- HHMMSS.ss;
- HHMMSS.sss;
- HH: MM: SS;
- HH: MM: SS.s;
- HH: MM: SS;
- HH:MM: ss.sss
不符合这些格式的条目将被拒绝。
此外,如果发现240000.0是表示午夜的时间戳,则将其视为000000.0。分和秒不能超过59。匹配这些格式,但hour、Minutes或Seconds值非法的条目也会被拒绝。
1.4 时间转换
为了便于比较时间值,所有时间都通过简单的小时、分钟、秒和秒的分数加权相加转换为十分之一秒(1/10秒)。
虽然小数点后三位的时间戳也被接受,但时间只与十分之一秒进行比较。小数点后第2位和第3位将被丢弃,不进行舍入。
时间戳0 =< |日变站时间-移动站时间|<= 0.099秒被认为是相等的。
1.5 同步问题
当然,为了进行日改,日变站和移动站必须在测量前进行时间同步。如果两个设备都配备了GPS,它们会自动同步到UTC,因此它们的读取周期由GPS定时控制。如果只有一台设备配备了GPS,您可能希望将该设备同步到UTC,然后使用同步电缆将UTC时间传输到另一台设备。如果没有一台设备配备GPS,在其中一台设备上手动设置时间,并使用同步电缆将时间传输到另一台设备上。
事实上,野外都是手动进行同步的,而且同步引起的误差很小。
1.6 日期
本程序不检查文件的日期。用户自己确保两个文件都是同一天就行。
文件时间不能超过午夜,因为程序并没有识别这种情况的功能。
1.7 未修正行的包含
如果在“日变改正”工具对话框中选中“包括未修正的行”(默认),系统将存储无法修正的数据行而不作任何更改。结果是一个包含移动站所有读数的文件,然而,只有经过校正的行才会显示在行末附加的日改校正的磁场值。
如果选中“舍弃未更正的行”选项,则结果文件只包含已成功更正的行。
1.8 使用说明
打开Base或Rover的文件后,会弹出“设置”对话框。对话框里会显示文件的前50行,以验证是否为正确的文件。
然后,程序会检查所打开的文件,确定首行和尾行。首行定义为长度相同的3行中的第一行。尾行被定义为与首行具有相同长度和数量的字段分隔符的最接近文件末尾的行。
第一行数据将根据当前字段分隔符设置进行解析,并将值传递给Time和Magnetic field下拉菜单。下拉框的值用于确定行中每个字段的位置及其格式。
除了作为选项(来自首行数据)显示的值之外,不可能选择其他值。如果遇到其他值,您将看到一条错误消息。如果未使用选定的字段分隔符分隔行字段,则日变改正计算可能发生错误。
可以任意在Rover或Base设置窗口中输入基准值datum。
当准备好开始计算时(即当两个文件都打开时),在“日变改正”对话框中按下“correct”按钮。
程序首先检查文件以确定它们是否有相同的读数。如果两个文件从开始到结束的时间间隔不重叠,则无法进行更正,进程将停止。
同样,请记住,文件只根据时间进行比较,日期不被考虑在内。确保两个文件都是同一天。
从Rover文件的第一行数据中提取的时间与Base文件的时间进行比较。
如果移动站的时间不是一个共同的读数(即它的时间不在重叠的时间间隔内),则根据'Include' 'Discard'选项的设置,数据线要么不受影响地传递,要么被丢弃。
如果时间经检验后没问题,则通过以下两种方式之一进行修正:
(1)如果在Base文件中找到了完全相同的时间,那么磁场修正的计算方式为:
改正值Corrected Value = 移动站值Rover Field - 日变站值Base Field + 基准值Datum
修正后的值被附加在移动站的数据行的末尾,这条线将被标记为“i——”
(2)如果时间不完全匹配,则从Base文件的最近时间读数线性插值Base值。修正后的值被计算为:
改正值Corrected Value = 移动站值Rover Field - 插值后的日变站值Interpolated Base Field + 基准值Datum
为衡量计算结果准确度,用于插值的基线的时间间隔(以秒为单位)也添加在该行的末尾。例如,从间隔5秒的基本读数插入的校正字段将被标记为“i005”。
如果时间间隔超过999秒,该行将被标记为“i+++”。
对移动站的所有行都执行相同的计算,直到所有行都被校正完。
Rover文件中的无效数据行(例如位置标签、注释、不包含有效时间格式或数值分隔符的行)将不做任何改动的传递给新文件。如果该行包含有效的时间,但其中一些值不能提取,则会发出警告,显示无效的行,并且该行将传递给标记为“Error”的最终文件。
GEMLinkW的以前版本对日变文件中的无效数据行容忍度较低。但是,从GEMLnkW 2.4开始,您现在会收到一条显示无效行消息的警告,该过程将继续使用下一个有效行。为了避免看到这些消息,我们建议您不要手动编辑这些文件(意思就是说,从仪器导出来的文件不要编辑,否则可能会编辑错而导致出现错误的改正信息)。
在文件被改正完后,一个摘要消息显示了以下几项内容的改正量:
- 直接纠正个数
- 使用插值修正的个数
- 不纠正的个数。
还会显示格式正确但数字不合法的时间戳的数量,例如Hours、Minutes或Seconds(如果有的话)。
您可以通过这些信息来检查和修改文件。但是,您必须首先确定非法条目位于哪个文件中,以及它们在文件中的位置。如果错误时间来自Rover文件,那么它将在结果文件中标记为“****”。结果文件末尾也插入了相同的摘要信息。
在日变改正计算期间,改正值存储在一个名为dummy的,后缀为.dmy的临时文件中。即使发生严重错误,也会保存此文件。
要恢复到目前为止已更正的数据,您应该打开位于安装GEMLinkW的文件夹中的dummy文件。当开始新的计算时,Dmy文件将被覆盖,且不会发出警告(这样你就没法恢复之前的校正数据了)。
1.9 保存数据:
退出程序时,会要求您保存最终文件。这个过程只是将dummy文件重命名为您选择的路径和文件名。在保存时发生错误时(例如,当路径或驱动器不可用时),程序将显示一条消息,指示您合并的数据在dummy文件中仍然可用,并显示其位置。如果您决定取消并退出而不保存/重命名文件,虚拟文件将保持完整。
注意,其他一些GEMLinkW工具,如合并实用程序(GPSmerge),使用相同的dummy.dmy文件。你应该保存或重命名文件,以避免丢失数据。
2 实现
(1)输入日变站数据,由于格式固定,跳过分列操作,base_data
(2)输入移动站数据,由于格式固定,跳过分列操作,rover_data
(3)输入基准值datum
(4)选择是否包含未改正行non_cor_included,默认为true
(5)选择插入列号insert_col,默认为1
(6)指定输出文件名
(7)比较移动站和日变站的日期,如果不一致则报错退出。
(8)循环读取移动站的每1行,先从第1行开始;
(9)查找第1个大于移动t的日变t的前1位;
(10)若该位小于1,则不改正,根据non_cor_included值决定是否原样输出,且未修改计数+1;
(11)比较此时日变站时刻和移动站时刻,若相差小于0.099,则用第1公式计算,计数+1;
(12)根据non_cor_included值决定是否原样输出;
(13)若大于0.099,则用第2公式计算,计数+1;
(14)根据non_cor_included值决定是否原样输出;
(15)循环往复,把移动站每一行都计算完毕,最后输出3行改正信息。
3 效果分析
用该程序计算,所得结果与Gemlink相比,大部分数据一致,只有少部分数据在小数点第2位相差1,估计为截断误差造成,此误差不会对结果造成不良影响,程序可用。
测试数据展示。