📄 georef_grid.cpp
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Module Library: //
// Grid_Georeference //
// //
//-------------------------------------------------------//
// //
// Georef_Grid.cpp //
// //
// Copyright (C) 2004 by //
// Andre Ringeler //
// //
//-------------------------------------------------------//
// //
// 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; version 2 of the License. //
// //
// 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, //
// write to the Free Software Foundation, Inc., //
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, //
// USA. //
// //
//-------------------------------------------------------//
// //
// e-mail: aringel@gwdg.de //
// //
// contact: Andre Ringeler //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
///////////////////////////////////////////////////////////
// Widely rearranged by O.Conrad April 2006 !!!
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include "Georef_Grid.h"
#include <string.h>
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CGeoref_Grid::CGeoref_Grid(void)
{
CSG_Parameters *pParameters;
//-----------------------------------------------------
Set_Name (_TL("Georeferencing - Grids"));
Set_Author (_TL("(c) 2004 Ringeler, (c) 2006 O.Conrad"));
Set_Description (_TW(
"Georeferencing of grids. Either choose the attribute fields (x/y) "
"with the projected coordinates for the reference points (origin) or supply a "
"additional points layer with correspondend points in the target projection. "
"\n"
"This library uses the Minpack routines for solving the nonlinear equations and "
"nonlinear least squares problem. You find minpack and more information "
"about minpack at:\n"
" <a target=\"_blank\" href=\"http://www.netlib.org/minpack\">"
" http://www.netlib.org/minpack</a>\n"
"\n"
"or download the C source codes:\n"
" <a target=\"_blank\" href=\"http://www.netlib.org/minpack/cminpack.tar\">"
" http://www.netlib.org/minpack/cminpack.tar</a>\n"
));
//-----------------------------------------------------
Parameters.Add_Grid_Output(
NULL , "GRID" , _TL("Grid"),
_TL("")
);
Parameters.Add_Shapes_Output(
NULL , "SHAPES" , _TL("Shapes"),
_TL("")
);
CSG_Parameter *pSource = Parameters.Add_Shapes(
NULL , "REF_SOURCE" , _TL("Reference Points (Origin)"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Shapes(
NULL , "REF_TARGET" , _TL("Reference Points (Projection)"),
_TL(""),
PARAMETER_INPUT_OPTIONAL
);
Parameters.Add_Table_Field(
pSource , "XFIELD" , _TL("x Position"),
_TL("")
);
Parameters.Add_Table_Field(
pSource , "YFIELD" , _TL("y Position"),
_TL("")
);
Parameters.Add_Grid(
Parameters("SOURCE_NODE"),
"SOURCE" , _TL("Source"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Choice(
Parameters("TARGET_NODE"),
"TARGET_TYPE" , _TL("Target"),
_TL(""),
CSG_String::Format(SG_T("%s|%s|%s|%s|%s|"),
_TL("User defined"),
_TL("Automatic fit"),
_TL("Grid Project"),
_TL("Grid"),
_TL("Shapes")
), 0
);
Parameters.Add_Choice(
Parameters("TARGET_NODE") , "INTERPOLATION" , _TL("Grid Interpolation"),
_TL(""),
CSG_String::Format(SG_T("%s|%s|%s|%s|%s|"),
_TL("Nearest Neigbhor"),
_TL("Bilinear Interpolation"),
_TL("Inverse Distance Interpolation"),
_TL("Bicubic Spline Interpolation"),
_TL("B-Spline Interpolation")
), 4
);
//-----------------------------------------------------
pParameters = Add_Parameters("GET_AUTOFIT" , _TL("Automatic fit") , _TL(""));
pParameters->Add_Value(
NULL, "GRIDSIZE" , _TL("Grid Size") , _TL(""), PARAMETER_TYPE_Double, 10000.0, 0.0, true
);
pParameters->Add_Choice(
NULL, "AUTOEXTMODE" , _TL("Fit Size") , _TL(""),
CSG_String::Format(SG_T("%s|%s|"),
_TL("Extent only (fast)"),
_TL("Check each point")
), 0
);
//-----------------------------------------------------
pParameters = Add_Parameters("GET_USER" , _TL("User defined") , _TL(""));
pParameters->Add_Value(
NULL, "XMIN" , _TL("Left") , _TL(""), PARAMETER_TYPE_Double
);
pParameters->Add_Value(
NULL, "XMAX" , _TL("Right") , _TL(""), PARAMETER_TYPE_Double
);
pParameters->Add_Value(
NULL, "YMIN" , _TL("Bottom") , _TL(""), PARAMETER_TYPE_Double
);
pParameters->Add_Value(
NULL, "YMAX" , _TL("Top") , _TL(""), PARAMETER_TYPE_Double
);
pParameters->Add_Value(
NULL, "SIZE" , _TL("Grid Size") , _TL(""), PARAMETER_TYPE_Double, 10000.0, 0.0, true
);
pParameters->Add_Info_Value(
NULL, "NX" , _TL("Columns") , _TL(""), PARAMETER_TYPE_Int
);
pParameters->Add_Info_Value(
NULL, "NY" , _TL("Rows") , _TL(""), PARAMETER_TYPE_Int
);
//-----------------------------------------------------
pParameters = Add_Parameters("GET_SYSTEM" , _TL("Choose Grid Project"), _TL(""));
pParameters->Add_Grid_System(
NULL, "SYSTEM" , _TL("System") , _TL("")
);
//-----------------------------------------------------
pParameters = Add_Parameters("GET_GRID" , _TL("Choose Grid") , _TL(""));
pParameters->Add_Grid(
NULL, "GRID" , _TL("Grid") , _TL(""), PARAMETER_INPUT , false
);
//-----------------------------------------------------
pParameters = Add_Parameters("GET_SHAPES" , _TL("Choose Shapes") , _TL(""));
pParameters->Add_Shapes(
NULL, "SHAPES" , _TL("Shapes") , _TL(""), PARAMETER_OUTPUT , SHAPE_TYPE_Point
);
}
//---------------------------------------------------------
CGeoref_Grid::~CGeoref_Grid(void)
{}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
int CGeoref_Grid::On_Parameter_Changed(CSG_Parameters *pParameters, CSG_Parameter *pParameter)
{
double xMin, xMax, yMin, yMax, size;
if( !SG_STR_CMP(pParameters->Get_Identifier(), SG_T("GET_USER")) )
{
xMin = pParameters->Get_Parameter("XMIN")->asDouble();
xMax = pParameters->Get_Parameter("XMAX")->asDouble();
yMin = pParameters->Get_Parameter("YMIN")->asDouble();
yMax = pParameters->Get_Parameter("YMAX")->asDouble();
size = pParameters->Get_Parameter("SIZE")->asDouble();
if( !SG_STR_CMP(pParameter->Get_Identifier(), SG_T("SIZE")) )
{
pParameters->Get_Parameter("XMAX")->Set_Value((xMax = xMin + ((int)((xMax - xMin) / size)) * size));
pParameters->Get_Parameter("YMAX")->Set_Value((yMax = yMin + ((int)((yMax - yMin) / size)) * size));
}
else
{
if( !SG_STR_CMP(pParameter->Get_Identifier(), SG_T("XMIN")) )
{
if( xMin >= xMax )
{
xMin = xMax - pParameters->Get_Parameter("NX")->asInt() * size;
pParameter->Set_Value(xMin);
}
pParameters->Get_Parameter("XMAX")->Set_Value(xMin + ((int)((xMax - xMin) / size)) * size);
}
else if( !SG_STR_CMP(pParameter->Get_Identifier(), SG_T("XMAX")) )
{
if( xMin >= xMax )
{
xMax = xMin + pParameters->Get_Parameter("NX")->asInt() * size;
pParameter->Set_Value(xMax);
}
pParameters->Get_Parameter("XMIN")->Set_Value(xMax - ((int)((xMax - xMin) / size)) * size);
}
else if( !SG_STR_CMP(pParameter->Get_Identifier(), SG_T("YMIN")) )
{
if( yMin >= yMax )
{
yMin = yMax - pParameters->Get_Parameter("NY")->asInt() * size;
pParameter->Set_Value(yMin);
}
pParameters->Get_Parameter("YMAX")->Set_Value(yMin + ((int)((yMax - yMin) / size)) * size);
}
else if( !SG_STR_CMP(pParameter->Get_Identifier(), SG_T("YMAX")) )
{
if( yMin >= yMax )
{
yMax = yMin + pParameters->Get_Parameter("NY")->asInt() * size;
pParameter->Set_Value(yMax);
}
pParameters->Get_Parameter("YMIN")->Set_Value(yMax - ((int)((yMax - yMin) / size)) * size);
}
}
pParameters->Get_Parameter("NX")->Set_Value(1 + (int)((xMax - xMin) / size));
pParameters->Get_Parameter("NY")->Set_Value(1 + (int)((yMax - yMin) / size));
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CGeoref_Grid::On_Execute(void)
{
int xField, yField;
CSG_Shapes *pShapes_A, *pShapes_B;
//-----------------------------------------------------
pShapes_A = Parameters("REF_SOURCE") ->asShapes();
pShapes_B = Parameters("REF_TARGET") ->asShapes();
xField = Parameters("XFIELD") ->asInt();
yField = Parameters("YFIELD") ->asInt();
//-----------------------------------------------------
if( ( pShapes_B && m_Engine.Set_Engine(pShapes_A, pShapes_B))
|| (!pShapes_B && m_Engine.Set_Engine(pShapes_A, xField, yField)) )
{
Message_Add(m_Engine.Get_Message());
return( Get_Conversion() );
}
Error_Set(m_Engine.Get_Message());
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -