196 lines
4.7 KiB
C++
196 lines
4.7 KiB
C++
#include "headfile.h"
|
|
#include "datatype.h"
|
|
|
|
void disp_help()
|
|
{
|
|
cout<<"grid2xyz 0.1 - convert various grid data into xyz file"<<endl<<endl
|
|
<<"usage: grid2xyz <table-data> <data-format> [-n<nodata-value>] [-o<output-file>]"<<endl
|
|
<<"data-format:"<<endl
|
|
<<" 1. -arcgis_txt ArcGIS text grid"<<endl
|
|
<<" 2. -surfer_txt Surfer text grid"<<endl
|
|
<<" -n sign an alternative value for nodata point, default will put NaN for all nodata point"<<endl<<endl
|
|
<<"example: data2xyz example.txt -arcgis_txt -n0.0 -oexample_out.xyz"<<endl;
|
|
}
|
|
int convert_arcgis_txt(char*,char*,double);
|
|
int convert_surfer_txt(char*,char*);
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
char cmd_type[1024] = {0};
|
|
char filename[1024] = {0};
|
|
char out_filename[1024] = {0};
|
|
char file_type[1024] = {0};
|
|
double Nulldata = MAX;
|
|
int table_type;
|
|
|
|
if (argc==1)
|
|
{
|
|
disp_help();
|
|
}
|
|
else
|
|
{
|
|
sscanf(argv[1],"%s",filename);
|
|
//其他类型在此添加
|
|
if(!strcmp(argv[2],ARCGIS_TXT)) table_type = 1;
|
|
else if(!strcmp(argv[2],SURFER_TXT)) table_type = 2;
|
|
else
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"no supported table format found "<<endl;
|
|
return 0;
|
|
}
|
|
|
|
for (int i = 3; i < argc; i++)
|
|
{
|
|
sscanf(argv[i],"%2s",cmd_type);
|
|
if (!strcmp(cmd_type,NULLVALUE))
|
|
{
|
|
sscanf(argv[i],"%*2s%lf",&Nulldata);
|
|
if (Nulldata == MAX)
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
|
|
cout<<"Nodata point set to default"<<endl;
|
|
}
|
|
}
|
|
else if (!strcmp(cmd_type,OUTPUT))
|
|
{
|
|
if (-1==sscanf(argv[i],"%*2s%s",out_filename))
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
|
|
return 0;
|
|
}
|
|
}
|
|
else //未定义的命令符
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"bad syntax: "<<argv[i]<<endl;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if (!strcmp(out_filename,""))
|
|
{
|
|
sscanf(argv[1],"%[^.]%s",out_filename,file_type);
|
|
strcat(out_filename,".xyz");
|
|
}
|
|
|
|
switch(table_type)
|
|
{
|
|
case 1: convert_arcgis_txt(filename,out_filename,Nulldata); break;
|
|
case 2: convert_surfer_txt(filename,out_filename); break;
|
|
default: cout<<BOLDRED<<"==> "<<RESET<<"table type outrange"<<endl; break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int convert_arcgis_txt(char* filename,char* outname,double Nullvalue)
|
|
{
|
|
ifstream filein(filename);
|
|
if (!filein)
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"file not found: "<<filename<<endl;
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
arcgis_txt table1;
|
|
string temp_str;
|
|
|
|
filein >> temp_str >> table1.ncols
|
|
>> temp_str >> table1.nrows
|
|
>> temp_str >> table1.xllcorner
|
|
>> temp_str >> table1.yllcorner
|
|
>> temp_str >> table1.cellsize
|
|
>> temp_str >> table1.NODATA_value;
|
|
table1.init_data_table();
|
|
table1.set_data_table();
|
|
for (int i = 0; i < table1.ncols*table1.nrows; i++)
|
|
{
|
|
filein >> table1.data_table[i];
|
|
|
|
}
|
|
filein.close();
|
|
|
|
ofstream fileout(outname);
|
|
for (int i = 0; i < table1.nrows; i++)
|
|
{
|
|
for (int j = 0; j < table1.ncols; j++)
|
|
{
|
|
if (table1.data_table[i*table1.ncols+j] == table1.NODATA_value)
|
|
{
|
|
if (Nullvalue == MAX)
|
|
{
|
|
fileout << table1.yllcorner + table1.nrows*table1.cellsize - i*table1.cellsize << " "
|
|
<< table1.xllcorner + j*table1.cellsize << " "
|
|
<< "NaN" << endl;
|
|
}
|
|
else
|
|
{
|
|
fileout << table1.yllcorner + table1.nrows*table1.cellsize - i*table1.cellsize << " "
|
|
<< table1.xllcorner + j*table1.cellsize << " "
|
|
<< Nullvalue << endl;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fileout << table1.yllcorner + table1.nrows*table1.cellsize - i*table1.cellsize << " "
|
|
<< table1.xllcorner + j*table1.cellsize << " "
|
|
<< table1.data_table[i*table1.ncols+j] << endl;
|
|
}
|
|
}
|
|
}
|
|
fileout.close();
|
|
table1.clear_data_table();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int convert_surfer_txt(char* filename,char* outname)
|
|
{
|
|
double dx,dy,xtemp,ytemp;
|
|
ifstream filein(filename);
|
|
if (!filein)
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"file not found: "<<filename<<endl;
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
surfer_txt table1;
|
|
string temp_str;
|
|
|
|
filein >> table1.headstr;
|
|
if (table1.headstr != "DSAA")
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"file format is not correct: "<<filename<<endl;
|
|
return -1;
|
|
}
|
|
|
|
filein >> table1.ncols >> table1.nrows
|
|
>> table1.xmin >> table1.xmax
|
|
>> table1.ymin >> table1.ymax
|
|
>> table1.zmin >> table1.zmax;
|
|
table1.init_data_table();
|
|
table1.set_data_table();
|
|
for (int i = 0; i < table1.ncols*table1.nrows; i++)
|
|
{
|
|
filein >> table1.data_table[i];
|
|
|
|
}
|
|
filein.close();
|
|
|
|
dx = (table1.xmax-table1.xmin)/table1.nrows+1;
|
|
dy = (table1.ymax-table1.ymin)/table1.ncols+1;
|
|
|
|
ofstream fileout(outname);
|
|
for (int i = 0; i < table1.ncols*table1.nrows; i++)
|
|
{
|
|
xtemp = (i%table1.ncols)*dx+table1.xmin;
|
|
ytemp = (i/table1.ncols)*dy+table1.ymin;
|
|
|
|
fileout<<xtemp<<" "<<ytemp<<" "<<table1.data_table[i]<<endl;
|
|
}
|
|
fileout.close();
|
|
table1.clear_data_table();
|
|
return 0;
|
|
}
|
|
} |