/**********************************************************
* Version $Id$
*********************************************************/
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Tool Library //
// Grid_Tools //
// //
//-------------------------------------------------------//
// //
// Grid_Tiling.cpp //
// //
// Copyright (C) 2010 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 Hamburg //
// Germany //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include "Grid_Tiling.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CGrid_Tiling::CGrid_Tiling(void)
{
//-----------------------------------------------------
Set_Name (_TL("Tiling"));
Set_Author ("O.Conrad (c) 2010");
Set_Description (_TW(
""
));
//-----------------------------------------------------
Parameters.Add_Grid(NULL,
"GRID" , _TL("Grid"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Grid_List(NULL,
"TILES" , _TL("Tiles"),
_TL(""),
PARAMETER_OUTPUT, false
);
//-----------------------------------------------------
Parameters.Add_Bool(NULL,
"TILES_SAVE" , _TL("Save Tiles to Disk"),
_TL("Save tiles to disk individually"),
false
);
Parameters.Add_FilePath(Parameters("TILES_SAVE"),
"TILES_PATH" , _TL("Output Directory"),
_TL(""),
NULL, NULL, true, true
);
Parameters.Add_String(Parameters("TILES_SAVE"),
"TILES_NAME" , _TL("Base Name"),
_TL("The base name of the tiles"),
"tile"
);
//-----------------------------------------------------
Parameters.Add_Int(NULL,
"OVERLAP" , _TL("Overlapping Cells"),
_TL(""),
0, 0, true
);
Parameters.Add_Choice(Parameters("OVERLAP"),
"OVERLAP_SYM" , _TL("Add Cells"),
_TL(""),
CSG_String::Format("%s|%s|%s|",
_TL("symmetric"),
_TL("bottom / left"),
_TL("top / right")
), 0
);
//-----------------------------------------------------
Parameters.Add_Choice(NULL,
"METHOD" , _TL("Tile Size Definition"),
_TL(""),
CSG_String::Format("%s|%s|",
_TL("number of grid cells per tile"),
_TL("coordinates (offset, range, cell size, tile size)")
), 0
);
//-----------------------------------------------------
Parameters.Add_Int(Parameters("METHOD"),
"NX" , _TL("Number of Column Cells"),
_TL(""),
100, 1, true
);
Parameters.Add_Int(Parameters("METHOD"),
"NY" , _TL("Number of Row Cells"),
_TL(""),
100, 1, true
);
//-----------------------------------------------------
Parameters.Add_Range(Parameters("METHOD"),
"XRANGE" , _TL("Offset and Range (X)"),
_TL(""),
0.0, 1000.0
);
Parameters.Add_Range(Parameters("METHOD"),
"YRANGE" , _TL("Offset and Range (Y)"),
_TL(""),
0.0, 1000.0
);
Parameters.Add_Double(Parameters("METHOD"),
"DCELL" , _TL("Cell Size"),
_TL(""),
1.0, 0.0, true
);
Parameters.Add_Double(Parameters("METHOD"),
"DX" , _TL("Tile Size (X)"),
_TL(""),
100.0, 0.0, true
);
Parameters.Add_Double(Parameters("METHOD"),
"DY" , _TL("Tile Size (Y)"),
_TL(""),
100.0, 0.0, true
);
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
int CGrid_Tiling::On_Parameter_Changed(CSG_Parameters *pParameters, CSG_Parameter *pParameter)
{
if( pParameter == pParameters->Get_Grid_System_Parameter() )
{
CSG_Grid_System System(1.0, 0.0, 0.0, 101, 101);
if( pParameter->asGrid_System() && pParameter->asGrid_System()->is_Valid() )
{
System = *pParameter->asGrid_System();
}
pParameters->Get_Parameter("NX" )->Set_Value(System.Get_NX() / 2);
pParameters->Get_Parameter("NY" )->Set_Value(System.Get_NX() / 2);
pParameters->Get_Parameter("XRANGE")->asRange()->Set_Range(System.Get_XMin(), System.Get_XMax());
pParameters->Get_Parameter("YRANGE")->asRange()->Set_Range(System.Get_YMin(), System.Get_YMax());
pParameters->Get_Parameter("DCELL" )->Set_Value(System.Get_Cellsize());
pParameters->Get_Parameter("DX" )->Set_Value(System.Get_XRange() / 2.0);
pParameters->Get_Parameter("DY" )->Set_Value(System.Get_YRange() / 2.0);
}
//-----------------------------------------------------
return( CSG_Tool_Grid::On_Parameter_Changed(pParameters, pParameter) );
}
//---------------------------------------------------------
int CGrid_Tiling::On_Parameters_Enable(CSG_Parameters *pParameters, CSG_Parameter *pParameter)
{
if( pParameter->Cmp_Identifier("TILES_SAVE") )
{
pParameters->Set_Enabled("TILES_PATH", pParameter->asBool());
pParameters->Set_Enabled("TILES_NAME", pParameter->asBool());
}
if( pParameter->Cmp_Identifier("OVERLAP") )
{
pParameters->Set_Enabled("OVERLAP_SYM", pParameter->asInt() > 0);
}
if( pParameter->Cmp_Identifier("METHOD") )
{
pParameters->Set_Enabled("NX" , pParameter->asInt() == 0);
pParameters->Set_Enabled("NY" , pParameter->asInt() == 0);
pParameters->Set_Enabled("XRANGE", pParameter->asInt() == 1);
pParameters->Set_Enabled("YRANGE", pParameter->asInt() == 1);
pParameters->Set_Enabled("DCELL" , pParameter->asInt() == 1);
pParameters->Set_Enabled("DX" , pParameter->asInt() == 1);
pParameters->Set_Enabled("DY" , pParameter->asInt() == 1);
}
//-----------------------------------------------------
return( CSG_Tool_Grid::On_Parameters_Enable(pParameters, pParameter) );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CGrid_Tiling::On_Execute(void)
{
//-----------------------------------------------------
CSG_Grid *pGrid = Parameters("GRID")->asGrid();
CSG_Parameter_Grid_List *pTiles = Parameters("TILES")->asGridList();
pTiles->Del_Items();
//-----------------------------------------------------
int nx, ny;
double dx, dy, dCell;
TSG_Rect Extent;
TSG_Grid_Resampling Resampling;
switch( Parameters("METHOD")->asInt() )
{
default: // number of grid cells per tile
Extent.xMin = pGrid->Get_XMin();
Extent.xMax = pGrid->Get_XMax();
Extent.yMin = pGrid->Get_YMin();
Extent.yMax = pGrid->Get_YMax();
dCell = pGrid->Get_Cellsize();
nx = Parameters("NX")->asInt();
ny = Parameters("NY")->asInt();
dx = dCell * nx;
dy = dCell * ny;
Resampling = GRID_RESAMPLING_NearestNeighbour;
break;
case 1: // coordinates (offset, range, cell size, tile size)
Extent.xMin = Parameters("XRANGE")->asRange()->Get_Min();
Extent.xMax = Parameters("XRANGE")->asRange()->Get_Max();
Extent.yMin = Parameters("YRANGE")->asRange()->Get_Min();
Extent.yMax = Parameters("YRANGE")->asRange()->Get_Max();
dCell = Parameters("DCELL" )->asDouble();
dx = Parameters("DX" )->asDouble();
dy = Parameters("DY" )->asDouble();
nx = (int)(dx / dCell);
ny = (int)(dy / dCell);
Resampling = GRID_RESAMPLING_Undefined;
break;
}
//-----------------------------------------------------
if( dx <= 0.0 || dy <= 0.0 || dCell <= 0.0 )
{
Message_Add(_TL("no intersection with mask grid."));
return( false );
}
//-----------------------------------------------------
int Overlap = Parameters("OVERLAP")->asInt();
switch( Parameters("OVERLAP_SYM")->asInt() )
{
default: // symetric
nx += Overlap * 2;
ny += Overlap * 2;
break;
case 1: // bottom / left
nx += Overlap;
ny += Overlap;
break;
case 2: // top / right
nx += Overlap;
ny += Overlap;
Overlap = 0;
break;
}
//-----------------------------------------------------
CSG_String Tiles_Name, Tiles_Path;
bool Tiles_bSave = Parameters("TILES_SAVE")->asBool();
if( Tiles_bSave )
{
Tiles_Name = Parameters("TILES_NAME")->asString();
if( Tiles_Name.is_Empty() )
{
SG_UI_Msg_Add_Error(_TL("Please provide a valid base name for the output files!"));
return( false );
}
Tiles_Path = Parameters("TILES_PATH")->asString();
if( !SG_Dir_Exists(SG_File_Get_Path(Tiles_Path)) )
{
SG_UI_Msg_Add_Error(_TL("Please provide a valid output directory for the output files!"));
return( false );
}
}
//-----------------------------------------------------
int iy = 1, nTiles = 0;
for(double y=Extent.yMin; yGet_Type(), nx, ny, dCell,
x - dCell * Overlap,
y - dCell * Overlap
);
pTile->Assign(pGrid, Resampling);
if( pTile->Get_NoData_Count() == pTile->Get_NCells() )
{
delete(pTile);
}
else
{
if( Tiles_bSave )
{
CSG_String FileName = CSG_String::Format("%s/%s_%d_%d.sgrd", Tiles_Path.c_str(), Tiles_Name.c_str(), iy, ix);
pTile->Save(FileName);
delete(pTile);
}
else
{
pTile->Fmt_Name("%s [%d, %d]", pGrid->Get_Name(), iy, ix);
pTiles->Add_Item(pTile);
}
nTiles++;
}
}
}
SG_UI_Msg_Add(CSG_String::Format("%s: %d", _TL("Number of tiles"), nTiles), true);
return( nTiles > 0 );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------