Surfer网格文件的VC读写代码​

 Golden Software系列软件中Surfer软件是物探中经常用到的绘图软件,其绘图功能强大、操作简单等优点深受物探科技人员的喜爱。Surfer软件最基础的数据格式是grd网格数据文件,其后缀为*.grd。到Surfer16版本,grd文件主要包括三种格式,即:1.GRD Surfer6 Text Grid,2.GRD Surfer6 Binary Grid,3.GRD Surfer7 Binary Grid,其中1为ASII文件格式,2和3为二进制文件格式。今天贴出的代码是基于VC,读取Surfer7 Binary文件,写出为Surfer6 Binary 文件。代码中使用了Eigen库,可查阅相关资料。

1.GRD Surfer6 Binary Grid格式说明

 2.GRD Surfer7 Binary Grid格式说明

 其他文件格式大家可以参考Surfer帮助文档,里面有很详细的说明。

3.下面给出控制台代码。

#include "stdafx.h"

#include <afx.h>  

#include <iostream>

#include <fstream>

#include <Eigen/Dense>



using namespace std;

using namespace Eigen;

void GetGrdDate(CString FileName,MatrixXd& Data,double &Xmin,double &Ymin,double &Xmax,double &Ymax,double &Dx,double &Dy)

{

	int nRow,nCol;

	double Zmin,Zmax;

	ifstream  fin(FileName,ios::in | ios::binary);

	if(fin)

	{

		fin.seekg(20, 0);

		int inx, iny;

		fin.read((char *)&nRow, 4);   //nRow

		fin.read((char *)&nCol, 4);   //Col

		double stemp;

		fin.read((char *)&Xmin, 8); //xLL

		fin.read((char *)&Ymin, 8); //yLL

		fin.read((char *)&Dx, 8); // xSize

		fin.read((char *)&Dy, 8); //ySize

		fin.read((char *)&Zmin, 8); //zMin

		fin.read((char *)&Zmax, 8);  //zMax

		fin.read((char *)&stemp, 8);

		fin.read((char *)&stemp, 8);

		fin.read((char *)&iny, 4);

		fin.read((char *)&inx, 4);

		Xmax=Xmin+(nCol-1)*Dx;

		Ymax=Ymin+(nRow-1)*Dy;

		double *tmp = new double [nCol];

		Data.resize(nRow,nCol);

		VectorXd v(nCol);

		for(int i=0;i<nRow;i++)

		{

			 fin.read((char *)  v.data() , sizeof(double)*nCol);

			 Data.row(i) = v;

		}

	}

	fin.close();

}

void OutGrd(CString filename,MatrixXd Data,double Xmin,double Ymin,double Xmax,double Ymax,double Dx,double Dy)

{

	short int nRow = Data.rows();

	short int nCol = Data.cols(); 

	ofstream fout(filename, ios::binary | ios::out);

	char flag[4] = { 'D','S','B','B' };

	fout.write((char *)flag, 4);

	fout.write((char *)&nCol, 2);

	fout.write((char *)&nRow, 2);

	fout.write((char *)&Xmin, 8);

	fout.write((char *)&Xmax, 8);

	fout.write((char *)&Ymin, 8);

	fout.write((char *)&Ymax, 8);

	double z1 = Data.minCoeff();

	double z2 = Data.maxCoeff();

	fout.write((char *)&z1, 8);

	fout.write((char *)&z2, 8);

	float *v = new float[nCol];

	for (int i = 0; i < nRow; i++)

	{

		for (int j = 0; j < nCol; j++)

			v[j] = Data(i,j);

	    fout.write((char*)v, sizeof(float)*nCol);

	}

	delete []v;

	fout.close();

}

int _tmain(int argc, _TCHAR* argv[])

{

	double Xmin, Ymin,Xmax,Ymax,Dx,Dy;

	int nRow,nCol;

	MatrixXd Data;

	

	GetGrdDate("In.grd",Data,Xmin, Ymin,Xmax,Ymax,Dx,Dy);

	nRow = Data.rows();

	nCol = Data.cols();

	VectorXd Row1d(nCol);

	MatrixXd outData(nRow,nCol);

	OutGrd("Out.grd",outData,Xmin, Ymin,Xmax,Ymax,Dx,Dy);

	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值