基于civil3D和MATLAB进行湖泊容量计算(1)

这几天老师给了个任务,让我把他们SAVU测量的数据进行处理和计算,测量的数据是一个湖泊的数据,我花了大概四天的时间去对任务进行处理,其中第一天搜索资料,后三天进行软件学习和实验。现在任务已经结束,是时候写文章记录一下,也见证我自己的学习历程,哈哈~~。


前言

首先是需要对所得到的数据进行处理,主要用到的软件时MATLAB,接下来就是对图形进行建模,使用的软件是civil3D进行的数据分析和建模,最后我还想用infraworks进行一下三维建模,可惜软件一直安装不成功,那我只能等到以后有类似的任务再去研究吧。


一、使用MATLAB进行数据处理

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.AUV发送的EXCEL数据格式

在这里插入图片描述
在进行数据处理的时候,发了一堆实验数据。
在这里插入图片描述
其数据内容非常的繁杂,而且数据量也很庞大,大概有十几万的数据。所以不管是进行什么操作面对这么大的数据量,使用工具进行操作是最方便不过的了。可以使用到的工具有很多,不论是python还是MATLAB都可以实现类似的功能。
下面就是我MATLAB所使用的代码,主要功能是将所有数据指定行进行提取,用到的函数主要是以下内容
(1)xlsread函数对excel文件进行读取
(2)filename=dir(‘D:\三级项目\湖底容积项目\航行数据*.xlsx’)对文件夹里的文件名进行记录
(3)矩阵取值操作,可以将指定的列提取出来
(4)mean函数对几个值进行求平均
(5)vertcat函数将矩阵进行拼接,新矩阵拼接到原矩阵的末尾。horzcat函数是并排着对矩阵进行拼接
(6)xlswrite函数对excel文件进行写入操作

clear all
filename=dir('D:\三级项目\湖底容积项目\航行数据\*.xlsx');                           %将同类型的文件列举出来

len=length(filename);                            %文件数量
k=zeros(len,1);
for i=1:len
    k(i,1)=length(filename(i,1).name);           %求每个文件名字的长度
    name(i,1:k(i,1))=filename(i,1).name(1:end);  %将文件的名字存到数组name中
end
 data_temp=xlsread(name(1,1:k(1,1))); %取第一个文件的数据
 data=data_temp(:,18:19);
 data2=mean(data_temp(:,11:14),2);
 data3=[data data2];
 data4=data3;
 for i=2:len
    data_temp=xlsread(name(1,1:k(i,1)));
    data=data_temp(:,18:19);
    data2=mean(data_temp(:,11:14),2);
    data3=[data data2];
    data4=vertcat(data4,data3); %将文件内容合并在一个数组中,horzcat
 end 
 data5=data4;
 data5(:,3)=10.*data4(:,3)
 xlswrite('D:\三级项目\湖底容积项目\航行数据处理\test1.xlsx',data4)

2.AUV发送的EXCEL数据格式

在这里插入图片描述
处理过后的数据长这个样子,这是师兄已经帮我处理过的数据,这个数据的错都被挑出来了,而且在高程数据的地方还进行了求平均的平滑处理,我自己用起来更方便了。
处理好数据之后,直接用可以吗?我当然进行了尝试,发现出来的图非常的小,3维视角一晃就飞的老远,当然也跟我不太会设置civil3D软件的坐标系有关。于是乎为了解决这个办法,我还是利用了MATLAB来对经纬度坐标进行处理,将其转化为平面直角坐标系。而且转化之后的坐标单位是米(存疑我自己算的结果基本差不多),可以直接用来进行面积计算了。下面是坐标系转换的代码:

clear all
data_temp=xlsread('D:\三级项目\湖底容积项目\航行数据处理\bianjie(1).xlsx')
len= size(data_temp,1)
Lat_Origin=38.448689;
LongOrigin  = 75.0522815;
mstruct=defaultm('mercator');
mstruct.geoid=[ 6378137, 0.0818191908426215];
mstruct.origin=[0,0,0];
mstruct=defaultm(mstruct);
[X_o,Y_o] =projfwd(mstruct,Lat_Origin,LongOrigin);
for i=1:len
Lat_Origin=data_temp(i,2);
LongOrigin  = data_temp(i,1);
[X_o,Y_o] =projfwd(mstruct,Lat_Origin,LongOrigin); 
data(i,1)=X_o;
data(i,2)=Y_o;
data(i,3)=1;
end
xlswrite('D:\三级项目\湖底容积项目\航行数据处理\bianjiezhuanhuan.xlsx',data);

代码中mstruct是一个定义的结构体,主要功能就是对坐标进行转换,后面的for循环很好理解,就是对数据进行一个循环处理并保存,最后写道一个excel文档中去。主要内容参考自:
利用Matlab进行地理坐标和直角坐标相互转换
6378137, 0.0818191908426215是地球的赤道半径和地球的椭球率。接下来就是对数据经纬度坐标进行换算,由于数据量过于庞大、电脑性能差,我足足算一个小时才算完。算完的数据如下所示:
在这里插入图片描述

二、使用civil3D对数据进行建模

1.转换excel文件格式

生成的excel文件无法直接作为点文件输入到civil3D软件当中去,所以我们需要进行处理,方法非常简单
在这里插入图片描述
导出格式为CSV格式文件即可。

2.读入点文件生成曲面

在我经过bilbil的civil3D视频入门学习之后,我把主要操作记录下来。
首先将生成的点文件进行导入,需要如下操作:
在这里插入图片描述
在civil3D界面中找到曲面,右键点击创建曲面,接下来会看到以下内容:
在这里插入图片描述
在名称那里可以取名为“湖底”,接下来点击确定进行建模。创建好曲面之后,打开
在这里插入图片描述
找到点文件,右键点击添加会出现下面的状态栏
在这里插入图片描述
点击+号,找到我们的文件添加进来,由于之前我们已经进行了数据格式的转换,所以直接就能对数据进行识别了(我最开始是先转化为.TXT格式再添加进行处理,数据经常跑偏)。识别成功了就如下图所示:
在这里插入图片描述
点击确定,曲面模型就建立起来了。
在这里插入图片描述
点对勾就好了。
在这里插入图片描述
右键选择缩放到曲面,然后就一下,调到了曲面模型那里
在这里插入图片描述

总结

文章五千字见好就收,小高老师不会写太长的内容,看来这个项目也要写成系列内容了,哈哈。预估两到三篇收尾。

猜你喜欢

转载自blog.csdn.net/weixin_44151170/article/details/109033011
今日推荐