三维地震数据segy数据显示

上一次实现了基于vtk的petrel地质模型的三维显示,调用的是C#的接口,后来开始研究基于vtk的三维地震数据的显示,有很多文献发表了读取地震数据然后借助vtk进行显示的方法。从vtk8.0开始,添加了直接读取segy格式的的地震数据,不需要自己编写segy的读写模块。

不过vtk官方最新的开源C#版本一直是vtk5.6版本,新版本需要收费,而其它语言接口的版本不收费,要采用vtk8.0或最新的8.2版本,必须采用C++、Python或java版本。鉴于java和C#很相似,因此选择了java接口的vtk。

从vtk官方下载了最新的vtk8.2版本,按照官方说明用cmake和visual stuio 2017进行编译,得到了java语言版本的vtk库,包括一个jar文件和216个dll文件,并把它上传到到了github上,分享给懒得编译的小伙伴。https://github.com/yanfeng1022/javaVTK.git

用新版本的vtk读取和显示三维地震数据非常简单,只要指定segy文件的名字,把读取结果转化为vtkStructuredGrid, vtkImageData,或vtkUnstructuredGrid,就可以按照相应的格式显示了。具体代码如下:

private void drawSegy3D(String filename) {

             

       //read segy file and assign to vtkStructuredGrid

       vtkSegYReader segYReader = new vtkSegYReader();

       System.out.println(filename);

       segYReader.SetFileName(filename);

       vtkImageData segyImage = segYReader.GetImageDataOutput();

       vtkStructuredGrid segyGrid = segYReader.GetStructuredGridOutput();

       vtkStructuredPoints points = segYReader.GetStructuredPointsOutput();

       segYReader.Update();

      

       try {

              int[] dim = new int[3];

             dim = segyGrid.GetDimensions();

             int nk=dim[2];

             int nj=dim[1];

             int ni=dim[0];

             System.out.println("nk="+ nk+" nj="+ nj+" ni="+ni);

              } catch (Exception e) {

                     // TODO: handle exception

                     System.out.println(e.getMessage());

              }

      

      

      //create a mapper

        vtkDataSetMapper mapper = new vtkDataSetMapper();

        mapper.SetInputData(segyGrid);

       

        double[] scalarRange=segyGrid.GetScalarRange();

        for(int i=0;i<scalarRange.length;i++)

             System.out.println(scalarRange[i]+"\t");

        mapper.SetScalarRange(scalarRange[0], scalarRange[1]);

       

        //create the actor

        vtkActor actor = new vtkActor();

        actor.SetMapper(mapper);

        actor.GetProperty().SetDiffuseColor(1, 1, 0);

        //actor.GetProperty().SetOpacity(0.3);

        vtkTransform transform = new vtkTransform();

        transform.Scale(1, 1, 5);            

        actor.SetUserTransform(transform);

 

        vtkRenderer render = new vtkRenderer();

        vtkRenderWindow renWin = new vtkRenderWindow();

       

        //设置交互样式

        vtkRenderWindowInteractor renwinIn = new vtkRenderWindowInteractor();

        renwinIn.SetRenderWindow(renWin);

 

        renWin.AddRenderer(render);

        render.SetBackground(1, 1, 1);  //飙泪ue(0,0,1),red(1,0,0)

        render.AddActor(actor);

       

        //设置坐标轴

        vtkAxesActor axesActor = new vtkAxesActor();

        vtkOrientationMarkerWidget widget = new vtkOrientationMarkerWidget();

        widget.SetOutlineColor(0.1, 0.1, 0.1);

        widget.SetOrientationMarker(axesActor);

        widget.SetInteractor(renwinIn);

        widget.SetEnabled(1);

        widget.InteractiveOn();

       

        //可视化输出

        render.ResetCamera();

        renWin.Render();

        renwinIn.Start();       

      

       }

具体显示结果如下,可以很方便地旋转和缩放,读取速度也挺快。

 

功能简介 ------------------------------------------------------------ ★★1 数据浏览 显示SegY总道数,采样点数,采样间隔,数据格式 (1)文本卷头查看 ASCII 和 EBCDIC 格式可切换 (2)二进制卷头查看 (3)单道数据查看 根据道号选择或拖动,道头2字节/4字节可切换查看,可查看道数据和波形 ☆☆ 新增功能 ☆☆ (4)道数据察看扩展为道头/道数据 两个Tab页面,增加道头的标准注视以供参考,增加数据频谱图和相位谱图 ★★2 数据扫描 (1)道头2字节/4字节可切换查看,可选择仅扫描道头或全部扫描 (2)单炮记录扫描: 扫描炮号、对应道集 (3)CMP/CRP道集扫描 : 扫描CMP/CRP号、对应道集 (4)叠后地震体扫描 设置inline CDP X Y Z 比例因子, 选择2D / 3D, 即可扫描侧线和对应道集 ☆☆ 新增功能 ☆☆ 道数据察看扩展为道头/道数据 两个Tab页面,增加道头的标准注视以供参考,增加数据频谱图和相位谱图 (5)增加中间结果显示 (6)增加进度显示,可以取消扫描 ★★3 数据切割 (1)设置开始道、结束道和道间隔, 开始采样点、结束采样点和采样点间隔 (2)显示选取范围在数据文件中的位置 (3)单击“开始”即可抽取道集保存为新的SegY文件 ☆☆ 新增功能 ☆☆ (1)数据提取设置修改,按道提取、单炮记录、CMP/CRP、叠后3D 共4个选项 (2)单炮记录、CMP/CRP、叠后3D数据提取必须在数据扫描后才能完成,有提示对话框进行提醒 bug修改: 1、修改1.0.1版本数据非法时波形绘制错误导致崩溃的问题 2、修改1.0.1版本数据切割错误问题
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oceanstonetree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值