代码分享:面波数据快速成图

news2024/9/22 11:40:46

代码分享:面波数据快速成图

前言

目前,物探数据主要用surfer软件成图,surfer软件具有强大的插值和绘图功能,成图比较美观。但是,生产过程中大量的物探数据,依靠excel和surfer来成图耗费人力时间成本。本博文在MATLAB平台上开发了一套用于面波数据快速成图的小程序,仅供大家借鉴。

文章目录

  • 代码分享:面波数据快速成图
          • 前言
    • 1、成图效果展示
        • 1.1 原始图像
        • 1.2 高程转换
        • 1.3 里程换算
        • 1.4 图像加工
    • 2、数据读取与图像保存
        • 2.1 读取面波视横波速度数据
        • 2.2 数据与图像保存
    • 3、自编函数
        • 3.1 dealMBdata函数
        • 3.2 cellcell2mat函数
        • 3.3 sInterp函数
        • 3.4 sLcLabel函数
    • 4、完整代码
        • 代码运行过程中如果出现bug,请依据实际工程修改。

1、成图效果展示

1.1 原始图像

对面波数据采用geogiga软件反演,导出视横波数据,在matlab中编辑克里金插值算法的代码,输出图像。
在这里插入图片描述

1.2 高程转换

将地表GPS测量的高程,与面波探测的深度进行转换,得到真实的高程。
在这里插入图片描述

1.3 里程换算

将地表GPS测量的里程与高程,与面波探测的深度和水平距离进行换算,由于面波测点在地表不等距分布,因此里程也是不等间距分布,换算之后得到真实的高程与里程。
在这里插入图片描述

1.4 图像加工

为了得到比较美观的图像,在MATLAB中对图像进行加工。
在这里插入图片描述

2、数据读取与图像保存

2.1 读取面波视横波速度数据

选择数据文件夹。

% 读取面波数据
[FileName,PathName] = uigetfile('*.txt','请选择视横波速度文件',...
    'MultiSelect','on');
filename = strcat(PathName,FileName);
data = importdata(filename);
fprintf('\n读取视横波速度完成!\n请按任意键继续...\n');

提取数据,自编函数dealMBdata。

% 初始参数设置
% 最大深度
depth_max = 80;
% 插值点数
num_points = 40;

% 面波数据预处理
[points,vs_value,xlocation] = dealMBdata(data);

2.2 数据与图像保存

% 保存数据
clear xx yy zz
xx = X1(:);
yy = Y1_new(:);
zz = YX(:);
C = [xx,yy,zz];
dlmwrite(strcat(PathName,'mianbo.dat'),C);
clear yy
yy = Y1_new(1,:);
high = [xa',yy'];
dlmwrite(strcat(PathName,'gaocheng.dat'),high);

3、自编函数

3.1 dealMBdata函数

function [points,vs_value,xlocation] = dealMBdata(data)
% 此程序为整理面波数据,为克里金插值做准备;
% 输入为读取的面波数据;
% 输出为面波数据点坐标和视横波速度值。
data_sh = data.textdata;  
k = strfind(data_sh,'Location:');
nlie = length(cell2mat(k));
data_sh_length = length(data_sh);

% 数据解译,读出每个频散曲线的起点与长度
%  初始化矩阵
list_begin = ones(1,nlie);
xlocation = ones(1,nlie);
n = 1;
for i = 1:data_sh_length
    if k{i}
        begin = i+1;
        while k{begin}
            begin = begin+1;
        end
        list_begin(n) = begin;
        xlocation(n) = str2double(data_sh{i,2});
        n = n+1;
    end
end

% 创建克里金插值矩阵
points_length = data_sh_length - nlie - 1;
points = zeros(points_length,2);
vs_value = zeros(points_length,1);
nn = 1;
for i = 1:nlie-1
    A = data_sh(list_begin(i):...
        list_begin(i+1)-2,:);
    A = cellcell2mat(A);
    for j = 1:length(A)
        points(nn,1) = xlocation(i);
        points(nn,2) = A(j,1);
        vs_value(nn) = A(j,2);
        nn = nn + 1;
    end
end
clear A
A = data_sh(list_begin(nlie):...
    end,:);
A = cellcell2mat(A);
points(nn:end,1) = xlocation(nlie);
points(nn:end,2) = A(:,1);
vs_value(nn:end) = A(:,2);

3.2 cellcell2mat函数

function C = cellcell2mat(A)
% 此程序为将嵌套元胞数据转为矩阵
[row,col] = size(A);
C = ones(row,col);
for i = 1:col
    for j = 1:row
        a = cell2mat(A(j,i));
        b = str2double(a);
        C(j,i) = b;
    end
end

3.3 sInterp函数

function [xa,ya] = sInterp(xlocation,data_gc,interp_num,num_points)
a = polyfit(xlocation,data_gc,interp_num);
warning('off');
xa = linspace(min(xlocation),max(xlocation),num_points);
ya = polyval(a,xa);

3.4 sLcLabel函数

function data_lclabel = sLcLabel(data_lc)
n = length(data_lc);
data_lclab = num2str(data_lc);
data_lclabel = cell(n,1);
ak1 = data_lclab(1,:);
data_lclabel{1} = strcat(ak1(1:end-3),'+',ak1(end-2:end));
clear ak1 ak2
for i = 2:n
    ak1 = data_lclab(i-1,:);
    ak2 = data_lclab(i,:);
    if strcmp(ak1(1:end-3),ak2(1:end-3))
        data_lclabel{i} = ak2(end-2:end);
    else
        data_lclabel{i} = strcat(ak2(1:end-3),...
        '+',ak2(end-2:end));
    end
end

4、完整代码

close all
clear 
clc

% 此程序功能是面波数据快速出图
% 作者:shangxiang
% 时间:2023年2月23日

% 读取面波数据
[FileName,PathName] = uigetfile('*.txt','请选择视横波速度文件',...
    'MultiSelect','on');
filename = strcat(PathName,FileName);
data = importdata(filename);
fprintf('\n读取视横波速度完成!\n请按任意键继续...\n');

% pause;
% 读取GPS测量高程数据
clear FileName PathName
[FileName,PathName] = uigetfile('*.txt','请选择GPS高程文件',...
    'MultiSelect','on');
filename_gc = strcat(PathName,FileName);
data_gc = load(filename_gc);
fprintf('\n读取高程数据完成!\n请按任意键继续...\n');

% 读取GPS测量里程数据
clear FileName PathName
[FileName,PathName] = uigetfile('*.txt','请选择GPS里程文件',...
    'MultiSelect','on');
filename_lc = strcat(PathName,FileName);
data_lc = load(filename_lc);
fprintf('\n读取里程数据完成!\n');

% 初始参数设置
% 最大深度
depth_max = 80;
% 插值点数
num_points = 40;

% 面波数据预处理
[points,vs_value,xlocation] = dealMBdata(data);

% 开始克里金插值
% 克里金插值预设参数
theta = [1 1];
lob = [0.1 0.1];
upb = [2 2];
[points_new,vs_value_new] = dsmerge(points,vs_value);
[dmodel,perf] = dacefit(points_new,vs_value_new,@regpoly0,...
    @correxp,theta,lob,upb);
% [dmodel,perf] = dacefit(points,vs_value,@regpoly0,@correxp,theta,lob,upb);
xmin = min(points(:,1));
xmax = max(points(:,1));
XX = gridsamp([xmin 0;xmax depth_max],num_points);
[YX,MSE] = predictor(XX,dmodel);
X1 = reshape(XX(:,1),num_points,num_points);
Y1 = reshape(XX(:,2),num_points,num_points);
YX = reshape(YX,size(X1));

% 对地形数据进行插值,默认插值点数为9,可更改;
interp_num = 9;
[xa,ya] = sInterp(xlocation,data_gc,interp_num,num_points);
Y1_new = -Y1 + ya;

% 对图形进行处理,补充图像下部
% ynew = max(Y1_new(end,:));
% Y1_new = Y1_new(Y1_new > ynew);
% X1 = X1(Y1_new > ynew);
% YX = YX(Y1_new > ynew);
% 处理里程数据
% 获取横坐标位置
data_lcx = data_lc - min(data_lc);
% 获取横坐标刻度
data_lclabel = sLcLabel(data_lc);

% 画图
figure(1);
clear k
k = (depth_max+max(ya))/max(X1(1,:));
set(gcf,'position',[50 150 1200 1500*k]);
% pcolor(X1,Y1_new,YX);
contourf(X1,Y1_new,YX,50,'linecolor','none');
set(gca,'xtick',data_lcx,'xticklabel',...
    data_lclabel,'xticklabelrotation',45);
caxis([100 500]);
colormap(jet);
h = colorbar;
set(get(h,'title'),'string','\fontname{宋体}视横波速度(米/秒)',...
    'FontSize',10);
clear a b
axis equal;
box off;
% axis off
shading flat
set(gca,'fontname','times new roman','fontsize',...
    10,'fontweight','normal');
xlabel('\fontname{宋体}里程(m)');
ylabel('\fontname{宋体}高程(m)');


% 保存数据
clear xx yy zz
xx = X1(:);
yy = Y1_new(:);
zz = YX(:);
C = [xx,yy,zz];
dlmwrite(strcat(PathName,'mianbo.dat'),C);
clear yy
yy = Y1_new(1,:);
high = [xa',yy'];
dlmwrite(strcat(PathName,'gaocheng.dat'),high);

代码运行过程中如果出现bug,请依据实际工程修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/392942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML视图—用例图、顺序图、状态图、类图、包图、协作图

大家好,欢迎来到Doker,这是一篇架构设计的基础文章。面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目…

Linux25 -- 监听队列链接上限测试、命令uname、ulimit

一、监听队列链接上限测试 1、res listen(sockfd,5); //创建监听队列res listen(sockfd,5);不懂版本有不同的限制,2.6早期版本有限制为128,超过默认为128,可使用uname -a 查看版本 2、测试将链接数到达上限, 方法&#xff1…

【安卓开发】探究服务

10.2 Android多线程编程 定义一个线程只需要新建一个类继承自Thread,然后重写父类的run方法,在里面编写耗时逻辑即可 class MyThread extends Thread{Overridepublic void run(){// 处理具体的逻辑} }那么如何启动呢 new Mythread().start() 这样继承的…

Hive拉链表

概述 拉链表:维护历史状态以及最新状态数据的表 作用场景 1. 数据量比较大。 2. 表中的部分字段会被更新,比如用户的地址,银行利率,订单的状态等。 3. 需要查看某一个时间点或者时间段的历史快照信息,比如,…

Linux GCC 编译详解

文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介 首先,什么是编译器呢? 我们可以使用编辑器(如 linux 下的 vi、windows 下…

Tomcat安装步骤及详细配置教程

Tomcat安装及配置教程主要分为四步: 步骤一:首先确认自己是否已经安装JDK 步骤二:下载安装Tomcat 步骤三:Tomcat配置环境变量 步骤四:验证Tomcat配置是否成功 一、首先确认自己是否已经安装JDK WinR打开运行&…

sklearn手册(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 本文是一个随时使用sklearn时可供参考的手册。我有使用sklearn的基础,且准备后期直接用sklearn官方的教程文档参考撰写系统性学习sklearn包使用方法的sklearn用户教程一文,因此本文就不介绍基础了。 最近更新时间&#…

ubuntu 20.04 Linux下查看当前文件夹的大小

问题描述 由于使用远程的 ssh 连接 ubuntu 20.04,所以不清楚如何查看 当前文件夹的大小 直接使用 df -h,只能查看 当前系统 磁盘的使用情况 需求 通过Linux shell 命令行,查看 当前文件夹占用的大小 其实很简单,使用 Linux sh…

如何使用码匠连接 Oracle

目录 在码匠中集成 Oracle 在码匠中使用 Oracle 关于码匠 Oracle 是一种关系型数据库,可用于存储和管理大量结构化数据。Oracle 数据源支持多种操作系统,包括 Windows、Linux 和 Unix 等,同时也提供了各种工具和服务,例如 Orac…

从设计转到了产品,实习生工作复盘

一、写在前面从设计转到了产品,产品的门槛好像相对于设计确实要低一些。通过产品新人必读书《人人都是产品经理》、知乎产品大神的观点和我个人的理解,可以得出一个结论——并不是每个人都是合格的产品经理,包括我在内的很多人都是因为公司有…

​2023年湖北武汉自己怎么报考二建?报考二建学历不符怎么办?启程别

2023年湖北武汉自己怎么报考二建?报考二建学历不符怎么办?启程别 2023年武汉自己怎么报考二建,首先个人是没有办法报名的,报考二建必须以企业的名义报名。报考二建的基本条件是什么?启程别告诉你,“启程别”…

Spark AQE

Spark AQEAQE/RBO/CBOAQEAQE特点Join 策略调整自动分区合并自动倾斜处理Spark 3.0 添加了自适应查询执行(AQE)、动态分区剪裁(DPP)、扩展的 Join Hints AQE/RBO/CBO Spark SQL 2.0前,仅支持启发式、静态的优化过程。…

mybatis面试题 一

一、MyBatis工作原理? 1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用session.close()关闭会话 1)读取 MyBatis 配置文件:mybatis-c…

zynq7000系列芯片介绍

ZYNQ从架构上可以划分为两大模块,一个是PS(处理器系统),另一个是PL(可编程逻辑) PS由APU、内存接口、IO外设、互连线4大模块组成。 1、APU(Application Processor Unit)应用处理单元 即PS【可编…

面向对象设计模式:行为型模式之状态模式

文章目录一、引入二、状态模式2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 Collaborations 合作2.5 Implementation 实现2.5 状态模式与策略模式的对比2.5 状态模式实例:糖果机2.6 状态模式实例:自行车升降档一、引入 State Diagram 状态图&am…

docker数据卷及软件部署方式

目录 一、docker数据卷管理 1.docker数据卷概念 2.数据卷命令 3.创建容器并挂载数据卷 二、docker软件部署 1.docker部署mysql方式 下载MySQL5.7镜像文件 创建所需的数据卷目录 创建mysql容器并挂载数据卷 进入数据库授权远程连接用户访问 2. docker部署nginx方式 下…

C语言-基础了解-16-C字符串

C字符串 一、C字符串 在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。 空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符&#x…

剑指 Offer 31. 栈的压入、弹出序列

一、题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列…

centos7 安装 hyperf

​​​​​​PHP > 7.4 Swoole PHP 扩展 > 4.5,并关闭了 Short Name OpenSSL PHP 扩展 JSON PHP 扩展 PDO PHP 扩展 Redis PHP 扩展 Protobuf PHP 扩展 composer create-project hyperf/hyperf-skeleton 推荐安装项 全部选n php.ini [swoole] extens…

LQB小板焊接V3版本的小板原理图,PCB图,注意事项和步骤

第一部分,这个部分,可以不焊接,直接用买的下载器进行下载代码,外接一个下载器,网上大概是10元左右,以后学习stm32的芯片的时候,这个下载器就是一个串口转换器,也可以使用。。 当然也…