gctl_toolkits/archive/grid2xyz/main.cpp
2024-09-10 20:25:18 +08:00

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;
}
}