/**********************************************************
* Version $Id: raw.cpp 1921 2014-01-09 10:24:11Z oconrad $
*********************************************************/
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Tool Library //
// Grid_IO //
// //
//-------------------------------------------------------//
// //
// Raw.cpp //
// //
// Copyright (C) 2003 by //
// Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. SAGA is free software; you //
// can redistribute it and/or modify it under the terms //
// of the GNU General Public License as published by the //
// Free Software Foundation, either version 2 of the //
// License, or (at your option) any later version. //
// //
// SAGA is distributed in the hope that it will be //
// useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU General Public //
// License for more details. //
// //
// You should have received a copy of the GNU General //
// Public License along with this program; if not, see //
// . //
// //
//-------------------------------------------------------//
// //
// e-mail: oconrad@saga-gis.org //
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include "raw.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CRaw_Import::CRaw_Import(void)
{
//-----------------------------------------------------
Set_Name (_TL("Import Binary Raw Data"));
Set_Author ("O.Conrad (c) 2003");
Set_Description (_TW(
"Imports grid from binary raw data."
));
//-----------------------------------------------------
Parameters.Add_Grid_Output("",
"GRID" , _TL("Grid"),
_TL("")
);
Parameters.Add_FilePath("",
"FILE" , _TL("File"),
_TL("")
);
//-----------------------------------------------------
Parameters.Add_Int("",
"NX" , _TL("Number of Columns"),
_TL(""),
1, 1, true
);
Parameters.Add_Int("",
"NY" , _TL("Number of Rows"),
_TL(""),
1, 1, true
);
Parameters.Add_Double("",
"CELLSIZE" , _TL("Cell Size"),
_TL(""),
1.0, 0.0, true
);
Parameters.Add_Choice("",
"POS_VECTOR" , _TL("Position Vector"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("cell's center"),
_TL("cell's corner")
)
);
Parameters.Add_Double("POS_VECTOR",
"POS_X" , _TL("X"),
_TL("")
);
Parameters.Add_Choice("POS_X",
"POS_X_SIDE" , _TL("Side"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("left"),
_TL("right")
)
);
Parameters.Add_Double("POS_VECTOR",
"POS_Y" , _TL("Y"),
_TL("")
);
Parameters.Add_Choice("POS_Y",
"POS_Y_SIDE" , _TL("Side"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("top"),
_TL("bottom")
)
);
//-----------------------------------------------------
Parameters.Add_Choice("",
"DATA_TYPE" , _TL("Data Type"),
_TL(""),
CSG_String::Format("%s|%s|%s|%s|%s|%s|%s|%s|",
_TL("8 bit unsigned integer"),
_TL("8 bit signed integer"),
_TL("16 bit unsigned integer"),
_TL("16 bit signed integer"),
_TL("32 bit unsigned integer"),
_TL("32 bit signed integer"),
_TL("32 bit floating point"),
_TL("64 bit floating point")
)
);
Parameters.Add_Choice("",
"BYTEORDER" , _TL("Byte Order"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("Little Endian (Intel)"),
_TL("Big Endian (Motorola)")
), 0
);
Parameters.Add_String("",
"UNIT" , _TL("Unit"),
_TL(""),
""
);
Parameters.Add_Double("",
"ZFACTOR" , _TL("Z-Scale"),
_TL(""),
1.0
);
Parameters.Add_Double("",
"NODATA" , _TL("No Data Value"),
_TL(""),
-99999
);
//-----------------------------------------------------
Parameters.Add_Int("",
"DATA_OFFSET" , _TL("Data Offset (Bytes)"),
_TL("")
);
Parameters.Add_Int("",
"LINE_OFFSET" , _TL("Record Offset (Bytes)"),
_TL("")
);
Parameters.Add_Int("",
"LINE_ENDSET" , _TL("Record Endset (Bytes)"),
_TL("")
);
Parameters.Add_Choice("",
"ORDER" , _TL("Value Order"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("columns by rows"),
_TL("rows by columns")
), 0
);
Parameters.Add_Bool("",
"TOPDOWN" , _TL("Invert Row Order"),
_TL(""),
true
);
Parameters.Add_Bool("",
"LEFTRIGHT" , _TL("Invert Column Order"),
_TL(""),
false
);
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CRaw_Import::On_Execute(void)
{
//-----------------------------------------------------
CSG_File Stream;
if( !Stream.Open(Parameters("FILE")->asString(), SG_FILE_R, true) )
{
Error_Fmt("%s [%s]", _TL("could not open file"), Parameters("FILE")->asString());
return( false );
}
Skip(Stream, Parameters("DATA_OFFSET")->asInt());
//-----------------------------------------------------
CSG_Grid *pGrid = Get_Grid();
if( !pGrid )
{
Error_Set(_TL("could not create grid"));
return( false );
}
pGrid->Set_Name(SG_File_Get_Name(Parameters("FILE")->asString(), false));
Parameters("GRID")->Set_Value(pGrid);
//-----------------------------------------------------
bool bRecIsRow = Parameters("ORDER" )->asInt() == 0;
bool bRecInvert = Parameters("TOPDOWN" )->asBool() == false;
bool bColInvert = Parameters("LEFTRIGHT")->asBool() == false;
int nRecords = bRecIsRow ? pGrid->Get_NY() : pGrid->Get_NX();
int nValues = bRecIsRow ? pGrid->Get_NX() : pGrid->Get_NY();
CSG_Array Record(SG_Data_Type_Get_Size(pGrid->Get_Type()), nValues);
bool bBigOrder = Record.Get_Value_Size() > 1 && Parameters("BYTEORDER")->asInt() == 1;
int Record_Head = Parameters("LINE_OFFSET")->asInt();
int Record_Tail = Parameters("LINE_ENDSET")->asInt();
//-----------------------------------------------------
for(int iRecord=0; !Stream.is_EOF() && iRecordGet_NY() - 1 - y;
int x = bRecIsRow ? iValue : iRecord; if( bColInvert ) x = pGrid->Get_NX() - 1 - x;
switch( pGrid->Get_Type() )
{
default: break;
case SG_DATATYPE_Byte : pGrid->Set_Value(x, y, *(unsigned char *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Char : pGrid->Set_Value(x, y, *(signed char *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Word : pGrid->Set_Value(x, y, *(unsigned short *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Short : pGrid->Set_Value(x, y, *(signed short *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_DWord : pGrid->Set_Value(x, y, *(unsigned int *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Int : pGrid->Set_Value(x, y, *(signed int *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Float : pGrid->Set_Value(x, y, *(float *)Record.Get_Entry(iValue)); break;
case SG_DATATYPE_Double: pGrid->Set_Value(x, y, *(double *)Record.Get_Entry(iValue)); break;
}
}
Skip(Stream, Record_Tail);
}
//-----------------------------------------------------
pGrid->Set_Unit (Parameters("UNIT" )->asString());
pGrid->Set_Scaling (Parameters("ZFACTOR")->asDouble());
pGrid->Set_NoData_Value(Parameters("NODATA" )->asDouble());
//-----------------------------------------------------
return( true );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CRaw_Import::Skip(CSG_File &Stream, size_t nBytes)
{
for(size_t i=0; iasInt() )
{
default: return( NULL );
case 0: Type = SG_DATATYPE_Byte ; break;
case 1: Type = SG_DATATYPE_Char ; break;
case 2: Type = SG_DATATYPE_Word ; break;
case 3: Type = SG_DATATYPE_Short ; break;
case 4: Type = SG_DATATYPE_DWord ; break;
case 5: Type = SG_DATATYPE_Int ; break;
case 6: Type = SG_DATATYPE_Float ; break;
case 7: Type = SG_DATATYPE_Double; break;
}
//-----------------------------------------------------
int nx = Parameters("NX")->asInt();
int ny = Parameters("NY")->asInt();
double cs = Parameters("CELLSIZE")->asDouble();
bool bCorner = Parameters("POS_VECTOR")->asInt() == 1;
//-----------------------------------------------------
double x = Parameters("POS_X")->asDouble();
if( Parameters("POS_X_SIDE")->asInt() == 1 ) // right
{
x -= cs * nx;
if( bCorner )
{
x -= cs / 2.0;
}
}
else if( bCorner )
{
x += cs / 2.0;
}
//-----------------------------------------------------
double y = Parameters("POS_Y")->asDouble();
if( Parameters("POS_Y_SIDE")->asInt() == 0 ) // top
{
y -= cs * ny;
if( bCorner )
{
y -= cs / 2.0;
}
}
else if( bCorner )
{
y += cs / 2.0;
}
//-----------------------------------------------------
return( SG_Create_Grid(Type, nx, ny, cs, x, y) );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------