简单且高效的水域物探轨迹坐标转换程序
前言
水上测线的高精度定位是水域物探的难题,水域磁法、水域地震实施时常采用船舶拖拽传感器进行走航式观测,GPS仪器放在船舶上测量,造成船舶位置与传感器位置存在偏差,后期资料整理需要校正。每次水域物探采集几万至几十万个平面坐标数据,采用手工校正费时费力,且较易出错。因此,本人开发了一套简单且高效的水域物探轨迹坐标校正程序。
文章目录
- 简单且高效的水域物探轨迹坐标转换程序
- 前言
- 1、问题提出
- 2、程序设计
- 3、计算结果
- 3.1、测网计算
- 3.2、直线计算
- 3.3、曲线计算
1、问题提出
水域磁法、水域地震是一种传统的水域物探方法,对水域勘探具有较好的效果。
如上图所示,水域磁法/水域地震勘探均需要在船舶尾部用拖绳牵引对应传感器,进行走航式勘探,将GPS固定在船舶上进行位置测量。GPS与物探传感器间存在一定的距离。
当船舶在水面上行驶时,船舶的轨迹与传感器的轨迹不一致,GPS只能测量船舶的轨迹,但是我们物探需要得到精确的传感器轨迹。尤其是在船舶拐弯时,传感器轨迹存在较大的偏移。
即使船舶想要沿着测线直线行驶,由于水流与风浪作用,船舶也会在测线左右摆动,传感器轨迹与船舶轨迹不一致。
因此,准确校正传感器轨迹坐标十分重要。
2、程序设计
需要分类讨论多种情况,以下为一种情况:当船舶沿直线行驶时,假设A点为当前船舶所在位置,B点为船舶行驶的下一个位置,O点为传感器位置。
根据A、B两点的位置,即可较简单的计算出O点的位置,计算代码如下:
close all
clear all
clc% 读取原始数据
data = xlsread("D:水域磁法勘探数据\轨迹转换程序\text.xlsx");% plot(data(:,1),data(:,2));n = length(data);x1 = data(1,1);
y1 = data(1,2);
x2 = data(2,1);
y2 = data(2,2);theta = atan((y2-y1)/(x2-x1));
if x1 < x2
xx1 = x1 + 12 * cos(pi + theta);
yy1 = y1 + 12 * sin(pi + theta);
else
xx1 = x1 + 12 * cos(theta);
yy1 = y1 + 12 * sin(theta);
end
figure(2),plot(x1,y1,'bo',x2,y2,'ks',xx1,yy1,'R-*');
当有十万个数据时,在上述程序上加一个for循环即可计算,代码如下:
close all
clear all
clc% 读取原始数据
% data = xlsread("D:水域磁法勘探数据\轨迹转换程序\text.xlsx");
% data = [ ];plot(data(:,1),data(:,2),'bo');hold onn = length(data);
data_new = zeros(n-1,2);
for i = 1:n-1clear x1 y1 x2 y2 xx1 yy1x1 = data(i,1);y1 = data(i,2);x2 = data(i+1,1);y2 = data(i+1,2);theta = atan((y2-y1)/(x2-x1));if x1 < x2xx1 = x1 + 13 * cos(pi + theta);yy1 = y1 + 13 * sin(pi + theta);elsexx1 = x1 + 13 * cos(theta);yy1 = y1 + 13 * sin(theta);enddata_new(i,:) = [xx1,yy1];
end
data_new = smoothdata(data_new,"sgolay",9);
plot(data_new(:,1),data_new(:,2),'r-');
% xlswrite("D:\水域磁法勘探数据\轨迹转换程序\text.xlsx",data_new,'sheet2');
经测试,在本人计算机情况下,计算十万个数据,计算仅需53.8273秒,计算精度为0.00000001米(小数点后八位)。